File: PBXHeadersBuildPhase.m

package info (click to toggle)
gnustep-xcode 0.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 1,168 kB
  • sloc: objc: 9,258; sh: 61; makefile: 20
file content (137 lines) | stat: -rw-r--r-- 5,299 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
   Copyright (C) 2018, 2019, 2020, 2021 Free Software Foundation, Inc.

   Written by: Gregory John Casamento <greg.casamento@gmail.com>
   Date: 2022
   
   This file is part of the GNUstep XCode Library

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.
   
   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
   
   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free
   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110 USA.
*/

#import <Foundation/Foundation.h>
#import "PBXCommon.h"
#import "PBXHeadersBuildPhase.h"
#import "PBXFileReference.h"
#import "PBXBuildFile.h"
#import "GSXCBuildContext.h"
#import "GSXCCommon.h"

@implementation PBXHeadersBuildPhase
- (BOOL) build
{
  xcputs("=== Executing Headers Build Phase");
  NSString *productType = [[GSXCBuildContext sharedBuildContext] objectForKey: @"PRODUCT_TYPE"];
  if([productType isEqualToString: BUNDLE_TYPE] ||
     [productType isEqualToString: TOOL_TYPE] ||
     [productType isEqualToString: APPLICATION_TYPE])
    {
      xcputs([[NSString stringWithFormat: @"\t* %s%sWARN%s: No need to process headers for product type %@",BOLD, YELLOW, RESET, productType] cString]);
      return YES;
    }

  xcputs([[NSString stringWithFormat: @"\t* Copying headers to derived sources folder..."] cString]);
  NSFileManager *defaultManager = [NSFileManager defaultManager];
  id file = nil;
  BOOL result = YES;
  GSXCBuildContext *context = [GSXCBuildContext sharedBuildContext];
  NSError *error = nil;

  NSArray *synchronizedFiles = [_target synchronizedHeaders];
  NSArray *files = [_files arrayByAddingObjectsFromArray: synchronizedFiles];
  
  NSEnumerator *en = [files objectEnumerator];
  NSString *derivedSourceHeaderDir = [context objectForKey: @"DERIVED_SOURCE_HEADER_DIR"];
  while((file = [en nextObject]) != nil && result)
    {
      NSString *path = [[file fileRef] path];
      NSString *srcFile = [[file fileRef] buildPath];
      NSString *dstFile = [derivedSourceHeaderDir stringByAppendingPathComponent: [path lastPathComponent]];
      BOOL copyResult = [defaultManager copyItemAtPath: srcFile
						toPath: dstFile
						 error: &error];
      xcputs([[NSString stringWithFormat: @"\tCopy %s%@%s -> %s%@%s", YELLOW, srcFile, RESET, GREEN, dstFile, RESET] cString]);
      if(!copyResult)
	{
	  xcputs([[NSString stringWithFormat: @"\t* Already exists"] cString]);
	}
    }

  // Only copy into the framework header folder, if it's a framework...
  if([productType isEqualToString: FRAMEWORK_TYPE])
    {
      xcputs([[NSString stringWithFormat: @"\t* Copying headers to framework header folder..."] cString]);
      en = [_files objectEnumerator];
      NSString *headerDir = [context objectForKey: @"HEADER_DIR"];
      while((file = [en nextObject]) != nil && result)
	{
	  NSString *path = [[file fileRef] path];
	  NSString *srcFile = [[file fileRef] buildPath];
	  NSString *dstFile = [headerDir stringByAppendingPathComponent: [path lastPathComponent]];
	  BOOL copyResult = [defaultManager copyItemAtPath: srcFile
						    toPath: dstFile
						     error: &error];
          xcputs([[NSString stringWithFormat: @"\tCopy %s%@%s -> %s%@%s", YELLOW, srcFile, RESET, GREEN, dstFile, RESET] cString]);
	  if(!copyResult)
	    {
	      xcputs([[NSString stringWithFormat: @"\t* Already exists"] cString]);
	    }
	}
    }

  xcputs([[NSString stringWithFormat: @"=== Completed Headers Build Phase"] cString]);

  return result;
}

- (BOOL) generate
{
  xcputs("=== Executing Headers Build Phase (Generate)");
  NSString *productType = [[GSXCBuildContext sharedBuildContext] objectForKey: @"PRODUCT_TYPE"];
  if([productType isEqualToString: BUNDLE_TYPE] ||
     [productType isEqualToString: TOOL_TYPE] ||
     [productType isEqualToString: APPLICATION_TYPE])
    {
      xcputs([[NSString stringWithFormat: @"\t* %s%sWARN%s: No need to process headers for product type %@",BOLD, YELLOW, RESET, productType] cString]);
      return YES;
    }

  BOOL result = YES;
  GSXCBuildContext *context = [GSXCBuildContext sharedBuildContext];

  // NSString *derivedSourceHeaderDir = [context objectForKey: @"DERIVED_SOURCE_HEADER_DIR"];
  [context setObject: _files forKey: @"DERIVED_HEADERS"];
  xcputs([[NSString stringWithFormat: @"\tAdding entry for derived header files"] cString]);

  // Only copy into the framework header folder, if it's a framework...
  if([productType isEqualToString: FRAMEWORK_TYPE])
    {
      // NSString *headerDir = [context objectForKey: @"HEADER_DIR"];
      [context setObject: _files forKey: @"HEADERS"];
      xcputs([[NSString stringWithFormat: @"\tAdding entry for derived header"] cString]);    
    }

  xcputs([[NSString stringWithFormat: @"=== Completed Headers Build Phase (Generate)"] cString]);

  return result;
}

- (BOOL) link
{
  return YES;
}

@end