1{ stdenv, sdk, writeText, platformName, xcbuild }:
2
3let
4
5 Info = {
6 CFBundleIdentifier = platformName;
7 Type = "Platform";
8 Name = "macosx";
9 };
10
11 Version = {
12 ProjectName = "OSXPlatformSupport";
13 };
14
15 # These files are all based off of Xcode spec fies found in
16 # /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Speciications/.
17
18 # Based off of the MacOSX Architectures.xcpsec file. All i386 stuff
19 # is removed because NixPkgs only supports darwin-x86_64.
20 Architectures = [
21 {
22 Identifier = "Standard";
23 Type = "Architecture";
24 Name = "Standard Architectures (64-bit Intel)";
25 RealArchitectures = [ "x86_64" ];
26 ArchitectureSetting = "ARCHS_STANDARD";
27 }
28 {
29 Identifier = "Universal";
30 Type = "Architecture";
31 Name = "Universal (64-bit Intel)";
32 RealArchitectures = [ "x86_64" ];
33 ArchitectureSetting = "ARCHS_STANDARD_32_64_BIT";
34 }
35 {
36 Identifier = "Native";
37 Type = "Architecture";
38 Name = "Native Architecture of Build Machine";
39 ArchitectureSetting = "NATIVE_ARCH_ACTUAL";
40 }
41 {
42 Identifier = "Standard64bit";
43 Type = "Architecture";
44 Name = "64-bit Intel";
45 RealArchitectures = [ "x86_64" ];
46 ArchitectureSetting = "ARCHS_STANDARD_64_BIT";
47 }
48 {
49 Identifier = "x86_64";
50 Type = "Architecture";
51 Name = "Intel 64-bit";
52 }
53 {
54 Identifier = "Standard_Including_64_bit";
55 Type = "Architecture";
56 Name = "Standard Architectures (including 64-bit)";
57 RealArchitectures = [ "x86_64" ];
58 ArchitectureSetting = "ARCHS_STANDARD_INCLUDING_64_BIT";
59 }
60 ];
61
62 # Based off of the MacOSX Package Types.xcpsec file. Only keep the
63 # bare minimum needed.
64 PackageTypes = [
65 {
66 Identifier = "com.apple.package-type.mach-o-executable";
67 Type = "PackageType";
68 Name = "Mach-O Executable";
69 DefaultBuildSettings = {
70 EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
71 EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
72 };
73 ProductReference = {
74 FileType = "compiled.mach-o.executable";
75 Name = "$(EXECUTABLE_NAME)";
76 };
77 }
78 {
79 Identifier = "com.apple.package-type.mach-o-objfile";
80 Type = "PackageType";
81 Name = "Mach-O Object File";
82 DefaultBuildSettings = {
83 EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
84 EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
85 };
86 ProductReference = {
87 FileType = "compiled.mach-o.objfile";
88 Name = "$(EXECUTABLE_NAME)";
89 };
90 }
91 {
92 Identifier = "com.apple.package-type.mach-o-dylib";
93 Type = "PackageType";
94 Name = "Mach-O Dynamic Library";
95 DefaultBuildSettings = {
96 EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
97 EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
98 };
99 ProductReference = {
100 FileType = "compiled.mach-o.dylib";
101 Name = "$(EXECUTABLE_NAME)";
102 };
103 }
104 {
105 Identifier = "com.apple.package-type.static-library";
106 Type = "PackageType";
107 Name = "Mach-O Static Library";
108 DefaultBuildSettings = {
109 EXECUTABLE_PREFIX = "lib";
110 EXECUTABLE_SUFFIX = ".a";
111 EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
112 EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";
113 };
114 ProductReference = {
115 FileType = "archive.ar";
116 Name = "$(EXECUTABLE_NAME)";
117 IsLaunchable = "NO";
118 };
119 }
120 {
121 Identifier = "com.apple.package-type.wrapper";
122 Type = "PackageType";
123 Name = "Wrapper";
124 DefaultBuildSettings = {
125 WRAPPER_SUFFIX = ".bundle";
126 WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)";
127 CONTENTS_FOLDER_PATH = "$(WRAPPER_NAME)/Contents";
128 EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";
129 EXECUTABLE_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/MacOS";
130 EXECUTABLE_PATH = "$(EXECUTABLE_FOLDER_PATH)/$(EXECUTABLE_NAME)";
131 INFOPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/Info.plist";
132 INFOSTRINGS_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/InfoPlist.strings";
133 PKGINFO_PATH = "$(CONTENTS_FOLDER_PATH)/PkgInfo";
134 PBDEVELOPMENTPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/pbdevelopment.plist";
135 VERSIONPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/version.plist";
136 PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers";
137 PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders";
138 EXECUTABLES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Executables";
139 FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Frameworks";
140 SHARED_FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedFrameworks";
141 SHARED_SUPPORT_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedSupport";
142 UNLOCALIZED_RESOURCES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Resources";
143 LOCALIZED_RESOURCES_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/$(DEVELOPMENT_LANGUAGE).lproj";
144 DOCUMENTATION_FOLDER_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/Documentation";
145 PLUGINS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PlugIns";
146 SCRIPTS_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/Scripts";
147 };
148 ProductReference = {
149 FileType = "wrapper.cfbundle";
150 Name = "$(WRAPPER_NAME)";
151 IsLaunchable = "NO";
152 };
153 }
154 {
155 Identifier = "com.apple.package-type.wrapper.application";
156 Type = "PackageType";
157 BasedOn = "com.apple.package-type.wrapper";
158 Name = "Application Wrapper";
159 DefaultBuildSettings = {
160 GENERATE_PKGINFO_FILE = "YES";
161 };
162 ProductReference = {
163 FileType = "wrapper.application";
164 Name = "$(WRAPPER_NAME)";
165 IsLaunchable = "YES";
166 };
167 }
168 ];
169
170 # Based off of the MacOSX Product Types.xcpsec file. All
171 # bundles/wrapper are removed, because we prefer dynamic products in
172 # NixPkgs.
173 ProductTypes = [
174 {
175 Identifier = "com.apple.product-type.tool";
176 Type = "ProductType";
177 Name = "Command-line Tool";
178 PackageTypes = [ "com.apple.package-type.mach-o-executable" ];
179 }
180 {
181 Identifier = "com.apple.product-type.objfile";
182 Type = "ProductType";
183 Name = "Object File";
184 PackageTypes = [ "com.apple.package-type.mach-o-objfile" ];
185 }
186 {
187 Identifier = "com.apple.product-type.library.dynamic";
188 Type = "ProductType";
189 Name = "Dynamic Library";
190 PackageTypes = [ "com.apple.package-type.mach-o-dylib" ];
191 DefaultBuildProperties = {
192 FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)";
193 MACH_O_TYPE = "mh_dylib";
194 REZ_EXECUTABLE = "YES";
195 EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)";
196 EXECUTABLE_EXTENSION = "dylib";
197 DYLIB_COMPATIBILITY_VERSION = "1";
198 DYLIB_CURRENT_VERSION = "1";
199 FRAMEWORK_FLAG_PREFIX = "-framework";
200 LIBRARY_FLAG_PREFIX = "-l";
201 LIBRARY_FLAG_NOSPACE = "YES";
202 STRIP_STYLE = "debugging";
203 GCC_INLINES_ARE_PRIVATE_EXTERN = "YES";
204 CODE_SIGNING_ALLOWED = "YES";
205 CODE_SIGNING_REQUIRED = "NO";
206 };
207 }
208 {
209 Identifier = "com.apple.product-type.library.static";
210 Type = "ProductType";
211 Name = "Static Library";
212 PackageTypes = [ "com.apple.package-type.static-library" ];
213 DefaultBuildProperties = {
214 FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)";
215 MACH_O_TYPE = "staticlib";
216 REZ_EXECUTABLE = "YES";
217 EXECUTABLE_PREFIX = "lib";
218 EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)";
219 EXECUTABLE_EXTENSION = "a";
220 FRAMEWORK_FLAG_PREFIX = "-framework";
221 LIBRARY_FLAG_PREFIX = "-l";
222 LIBRARY_FLAG_NOSPACE = "YES";
223 STRIP_STYLE = "debugging";
224 SEPARATE_STRIP = "YES";
225 CLANG_ENABLE_MODULE_DEBUGGING = "NO";
226 };
227 }
228 {
229 Type = "ProductType";
230 Identifier = "com.apple.product-type.bundle";
231 Name = "Bundle";
232 DefaultBuildProperties = {
233 FULL_PRODUCT_NAME = "$(WRAPPER_NAME)";
234 MACH_O_TYPE = "mh_bundle";
235 WRAPPER_PREFIX = "";
236 WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)";
237 WRAPPER_EXTENSION = "bundle";
238 WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)";
239 FRAMEWORK_FLAG_PREFIX = "-framework";
240 LIBRARY_FLAG_PREFIX = "-l";
241 LIBRARY_FLAG_NOSPACE = "YES";
242 STRIP_STYLE = "non-global";
243 };
244 PackageTypes = [ "com.apple.package-type.wrapper" ];
245 IsWrapper = "YES";
246 HasInfoPlist = "YES";
247 HasInfoPlistStrings = "YES";
248 }
249 {
250 Identifier = "com.apple.product-type.application";
251 Type = "ProductType";
252 BasedOn = "com.apple.product-type.bundle";
253 Name = "Application";
254 DefaultBuildProperties = {
255 MACH_O_TYPE = "mh_execute";
256 WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)";
257 WRAPPER_EXTENSION = "app";
258 };
259 PackageTypes = [ "com.apple.package-type.wrapper.application" ];
260 }
261 ];
262
263in
264
265stdenv.mkDerivation {
266 name = "MacOSX.platform";
267 buildInputs = [ xcbuild ];
268 buildCommand = ''
269 mkdir -p $out/
270 cd $out/
271
272 plutil -convert xml1 -o Info.plist ${writeText "Info.plist" (builtins.toJSON Info)}
273 plutil -convert xml1 -o version.plist ${writeText "version.plist" (builtins.toJSON Version)}
274
275 mkdir -p $out/Developer/Library/Xcode/Specifications/
276 cd $out/Developer/Library/Xcode/Specifications/
277 plutil -convert xml1 -o Architectures.xcspec ${writeText "Architectures.xcspec" (builtins.toJSON Architectures)}
278 plutil -convert xml1 -o PackageTypes.xcspec ${writeText "PackageTypes.xcspec" (builtins.toJSON PackageTypes)}
279 plutil -convert xml1 -o ProductTypes.xcspec ${writeText "ProductTypes.xcspec" (builtins.toJSON ProductTypes)}
280
281 mkdir -p $out/Developer/SDKs/
282 cd $out/Developer/SDKs/
283 cp -r ${sdk} ${sdk.name}
284 '';
285}