{ stdenv, runCommand, lib, sdks, xcodePlatform, writeText }: let inherit (lib.generators) toPlist; Info = { CFBundleIdentifier = "com.apple.platform.${lib.toLower xcodePlatform}"; Type = "Platform"; Name = lib.toLower xcodePlatform; }; Version = { ProjectName = "OSXPlatformSupport"; }; # These files are all based off of Xcode spec fies found in # /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources. # Based off of the "MacOSX Architectures.xcspec" file. All i386 stuff # is removed because NixPkgs only supports darwin-x86_64 and darwin-arm64. Architectures = [ { Identifier = "Standard"; Type = "Architecture"; Name = "Standard Architectures (Apple Silicon, 64-bit Intel)"; RealArchitectures = [ "arm64" "x86_64" ]; ArchitectureSetting = "ARCHS_STANDARD"; } { Identifier = "Universal"; Type = "Architecture"; Name = "Universal (Apple Silicon, 64-bit Intel)"; RealArchitectures = [ "arm64" "x86_64" ]; ArchitectureSetting = "ARCHS_STANDARD_32_64_BIT"; } { Identifier = "Native"; Type = "Architecture"; Name = "Native Architecture of Build Machine"; ArchitectureSetting = "NATIVE_ARCH_ACTUAL"; } { Identifier = "Standard64bit"; Type = "Architecture"; Name = "Apple Silicon, 64-bit Intel"; RealArchitectures = [ "arm64" "x86_64" ]; ArchitectureSetting = "ARCHS_STANDARD_64_BIT"; } { Identifier = if stdenv.isAarch64 then "arm64" else "x86_64"; Type = "Architecture"; Name = "Apple Silicon or Intel 64-bit"; } { Identifier = "Standard_Including_64_bit"; Type = "Architecture"; Name = "Standard Architectures (including 64-bit)"; RealArchitectures = [ "arm64" "x86_64" ]; ArchitectureSetting = "ARCHS_STANDARD_INCLUDING_64_BIT"; } ]; # Based off of the "MacOSX Package Types.xcspec" file. Only keep the # bare minimum needed. PackageTypes = [ { Identifier = "com.apple.package-type.mach-o-executable"; Type = "PackageType"; Name = "Mach-O Executable"; DefaultBuildSettings = { EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; }; ProductReference = { FileType = "compiled.mach-o.executable"; Name = "$(EXECUTABLE_NAME)"; }; } { Identifier = "com.apple.package-type.mach-o-objfile"; Type = "PackageType"; Name = "Mach-O Object File"; DefaultBuildSettings = { EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; }; ProductReference = { FileType = "compiled.mach-o.objfile"; Name = "$(EXECUTABLE_NAME)"; }; } { Identifier = "com.apple.package-type.mach-o-dylib"; Type = "PackageType"; Name = "Mach-O Dynamic Library"; DefaultBuildSettings = { EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; }; ProductReference = { FileType = "compiled.mach-o.dylib"; Name = "$(EXECUTABLE_NAME)"; }; } { Identifier = "com.apple.package-type.static-library"; Type = "PackageType"; Name = "Mach-O Static Library"; DefaultBuildSettings = { EXECUTABLE_PREFIX = "lib"; EXECUTABLE_SUFFIX = ".a"; EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; EXECUTABLE_PATH = "$(EXECUTABLE_NAME)"; }; ProductReference = { FileType = "archive.ar"; Name = "$(EXECUTABLE_NAME)"; IsLaunchable = "NO"; }; } { Identifier = "com.apple.package-type.wrapper"; Type = "PackageType"; Name = "Wrapper"; DefaultBuildSettings = { WRAPPER_SUFFIX = ".bundle"; WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)"; CONTENTS_FOLDER_PATH = "$(WRAPPER_NAME)/Contents"; EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)"; EXECUTABLE_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/MacOS"; EXECUTABLE_PATH = "$(EXECUTABLE_FOLDER_PATH)/$(EXECUTABLE_NAME)"; INFOPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/Info.plist"; INFOSTRINGS_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/InfoPlist.strings"; PKGINFO_PATH = "$(CONTENTS_FOLDER_PATH)/PkgInfo"; PBDEVELOPMENTPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/pbdevelopment.plist"; VERSIONPLIST_PATH = "$(CONTENTS_FOLDER_PATH)/version.plist"; PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers"; PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders"; EXECUTABLES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Executables"; FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Frameworks"; SHARED_FRAMEWORKS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedFrameworks"; SHARED_SUPPORT_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/SharedSupport"; UNLOCALIZED_RESOURCES_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Resources"; LOCALIZED_RESOURCES_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/$(DEVELOPMENT_LANGUAGE).lproj"; DOCUMENTATION_FOLDER_PATH = "$(LOCALIZED_RESOURCES_FOLDER_PATH)/Documentation"; PLUGINS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PlugIns"; SCRIPTS_FOLDER_PATH = "$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/Scripts"; }; ProductReference = { FileType = "wrapper.cfbundle"; Name = "$(WRAPPER_NAME)"; IsLaunchable = "NO"; }; } { Identifier = "com.apple.package-type.wrapper.application"; Type = "PackageType"; BasedOn = "com.apple.package-type.wrapper"; Name = "Application Wrapper"; DefaultBuildSettings = { GENERATE_PKGINFO_FILE = "YES"; }; ProductReference = { FileType = "wrapper.application"; Name = "$(WRAPPER_NAME)"; IsLaunchable = "YES"; }; } ]; # Based off of the "MacOSX Product Types.xcspec" file. All # bundles/wrapper are removed, because we prefer dynamic products in # NixPkgs. ProductTypes = [ { Identifier = "com.apple.product-type.tool"; Type = "ProductType"; Name = "Command-line Tool"; PackageTypes = [ "com.apple.package-type.mach-o-executable" ]; } { Identifier = "com.apple.product-type.objfile"; Type = "ProductType"; Name = "Object File"; PackageTypes = [ "com.apple.package-type.mach-o-objfile" ]; } { Identifier = "com.apple.product-type.library.dynamic"; Type = "ProductType"; Name = "Dynamic Library"; PackageTypes = [ "com.apple.package-type.mach-o-dylib" ]; DefaultBuildProperties = { FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)"; MACH_O_TYPE = "mh_dylib"; REZ_EXECUTABLE = "YES"; EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)"; EXECUTABLE_EXTENSION = "dylib"; DYLIB_COMPATIBILITY_VERSION = "1"; DYLIB_CURRENT_VERSION = "1"; FRAMEWORK_FLAG_PREFIX = "-framework"; LIBRARY_FLAG_PREFIX = "-l"; LIBRARY_FLAG_NOSPACE = "YES"; STRIP_STYLE = "debugging"; GCC_INLINES_ARE_PRIVATE_EXTERN = "YES"; CODE_SIGNING_ALLOWED = "YES"; CODE_SIGNING_REQUIRED = "NO"; }; } { Identifier = "com.apple.product-type.library.static"; Type = "ProductType"; Name = "Static Library"; PackageTypes = [ "com.apple.package-type.static-library" ]; DefaultBuildProperties = { FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)"; MACH_O_TYPE = "staticlib"; REZ_EXECUTABLE = "YES"; EXECUTABLE_PREFIX = "lib"; EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)"; EXECUTABLE_EXTENSION = "a"; FRAMEWORK_FLAG_PREFIX = "-framework"; LIBRARY_FLAG_PREFIX = "-l"; LIBRARY_FLAG_NOSPACE = "YES"; STRIP_STYLE = "debugging"; SEPARATE_STRIP = "YES"; CLANG_ENABLE_MODULE_DEBUGGING = "NO"; }; } { Type = "ProductType"; Identifier = "com.apple.product-type.bundle"; Name = "Bundle"; DefaultBuildProperties = { FULL_PRODUCT_NAME = "$(WRAPPER_NAME)"; MACH_O_TYPE = "mh_bundle"; WRAPPER_PREFIX = ""; WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)"; WRAPPER_EXTENSION = "bundle"; WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)"; FRAMEWORK_FLAG_PREFIX = "-framework"; LIBRARY_FLAG_PREFIX = "-l"; LIBRARY_FLAG_NOSPACE = "YES"; STRIP_STYLE = "non-global"; }; PackageTypes = [ "com.apple.package-type.wrapper" ]; IsWrapper = "YES"; HasInfoPlist = "YES"; HasInfoPlistStrings = "YES"; } { Identifier = "com.apple.product-type.application"; Type = "ProductType"; BasedOn = "com.apple.product-type.bundle"; Name = "Application"; DefaultBuildProperties = { MACH_O_TYPE = "mh_execute"; WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)"; WRAPPER_EXTENSION = "app"; }; PackageTypes = [ "com.apple.package-type.wrapper.application" ]; } { Type = "ProductType"; Identifier = "com.apple.product-type.framework"; Name = "Bundle"; DefaultBuildProperties = { FULL_PRODUCT_NAME = "$(WRAPPER_NAME)"; MACH_O_TYPE = "mh_bundle"; WRAPPER_PREFIX = ""; WRAPPER_SUFFIX = ".$(WRAPPER_EXTENSION)"; WRAPPER_EXTENSION = "bundle"; WRAPPER_NAME = "$(WRAPPER_PREFIX)$(PRODUCT_NAME)$(WRAPPER_SUFFIX)"; FRAMEWORK_FLAG_PREFIX = "-framework"; LIBRARY_FLAG_PREFIX = "-l"; LIBRARY_FLAG_NOSPACE = "YES"; STRIP_STYLE = "non-global"; }; PackageTypes = [ "com.apple.package-type.wrapper" ]; IsWrapper = "YES"; HasInfoPlist = "YES"; HasInfoPlistStrings = "YES"; } ]; in runCommand "Platforms" { } '' platform=$out/${xcodePlatform}.platform install -D ${writeText "Info.plist" (toPlist { } Info)} $platform/Info.plist install -D ${ writeText "version.plist" (toPlist { } Version) } $platform/version.plist install -D ${ writeText "Architectures.xcspec" (toPlist { } Architectures) } $platform/Developer/Library/Xcode/Specifications/Architectures.xcspec install -D ${ writeText "PackageTypes.xcspec" (toPlist { } PackageTypes) } $platform/Developer/Library/Xcode/Specifications/PackageTypes.xcspec install -D ${ writeText "ProductTypes.xcspec" (toPlist { } ProductTypes) } $platform/Developer/Library/Xcode/Specifications/ProductTypes.xcspec ln -s $platform $platform/usr mkdir -p $platform/Developer ln -s ${sdks} $platform/Developer/SDKs ''