102 lines
4.5 KiB
Ruby
Executable File
102 lines
4.5 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# Development-only dependency: xcodeproj 1.27.0. Generated project is committed.
|
|
require 'xcodeproj'
|
|
require 'fileutils'
|
|
|
|
# Seed object IDs deterministically before xcodeproj normalizes them. Otherwise
|
|
# a target proxy's raw remoteGlobalIDString can leak a random ID into its hash.
|
|
class WristivoProject < Xcodeproj::Project
|
|
def generate_uuid
|
|
@object_serial = (@object_serial || 0) + 1
|
|
format('%024X', @object_serial)
|
|
end
|
|
end
|
|
|
|
root = File.expand_path('..', __dir__)
|
|
Dir.chdir(root)
|
|
project = WristivoProject.new('Wristivo.xcodeproj')
|
|
project.root_object.attributes['LastUpgradeCheck'] = '2700'
|
|
config = project.main_group.new_file('Config/Base.xcconfig')
|
|
project.build_configurations.each do |c|
|
|
c.base_configuration_reference = config
|
|
end
|
|
|
|
package = project.new(Xcodeproj::Project::Object::XCLocalSwiftPackageReference)
|
|
package.relative_path = 'Packages/WristivoKit'
|
|
project.root_object.package_references << package
|
|
|
|
bridge_package = project.new(Xcodeproj::Project::Object::XCLocalSwiftPackageReference)
|
|
bridge_package.relative_path = 'Adapters/WatchBridge'
|
|
project.root_object.package_references << bridge_package
|
|
|
|
def add_sources(project, target, pattern)
|
|
Dir.glob(pattern).sort.each do |path|
|
|
ref = project.main_group.find_file_by_path(path) || project.main_group.new_file(path)
|
|
target.source_build_phase.add_file_reference(ref)
|
|
end
|
|
end
|
|
|
|
def link_product(project, target, package, name)
|
|
product = project.new(Xcodeproj::Project::Object::XCSwiftPackageProductDependency)
|
|
product.package = package
|
|
product.product_name = name
|
|
target.package_product_dependencies << product
|
|
build_file = project.new(Xcodeproj::Project::Object::PBXBuildFile)
|
|
build_file.product_ref = product
|
|
target.frameworks_build_phase.files << build_file
|
|
end
|
|
|
|
phone = project.new_target(:application, 'Wristivo', :ios, '17.0')
|
|
watch = project.new_target(:application, 'WristivoWatch', :watchos, '10.0')
|
|
[phone, watch].each do |target|
|
|
target.build_configurations.each do |c|
|
|
c.build_settings['GENERATE_INFOPLIST_FILE'] = 'YES'
|
|
c.build_settings['INFOPLIST_KEY_CFBundleDisplayName'] = 'Wristivo'
|
|
c.build_settings['SWIFT_VERSION'] = '6.0'
|
|
c.build_settings['SWIFT_STRICT_CONCURRENCY'] = 'complete'
|
|
c.build_settings['CODE_SIGN_STYLE'] = 'Automatic'
|
|
c.build_settings['ENABLE_USER_SCRIPT_SANDBOXING'] = 'YES'
|
|
c.build_settings['LD_RUNPATH_SEARCH_PATHS'] = ['$(inherited)', '@executable_path/Frameworks']
|
|
end
|
|
add_sources(project, target, 'Apps/Shared/*.swift')
|
|
link_product(project, target, package, 'RemoteCore')
|
|
privacy = project.main_group.find_file_by_path('Resources/PrivacyInfo.xcprivacy') || project.main_group.new_file('Resources/PrivacyInfo.xcprivacy')
|
|
target.resources_build_phase.add_file_reference(privacy)
|
|
end
|
|
add_sources(project, phone, 'Apps/iPhone/*.swift')
|
|
add_sources(project, watch, 'Apps/Watch/*.swift')
|
|
link_product(project, phone, package, 'SamsungProtocol')
|
|
link_product(project, watch, package, 'GestureCore')
|
|
link_product(project, phone, bridge_package, 'WatchBridgePhone')
|
|
link_product(project, watch, bridge_package, 'WatchBridgeWatch')
|
|
phone.build_configurations.each do |c|
|
|
c.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = '$(WRISTIVO_BUNDLE_PREFIX)'
|
|
c.build_settings['TARGETED_DEVICE_FAMILY'] = '1,2'
|
|
c.build_settings['INFOPLIST_KEY_UILaunchScreen_Generation'] = 'YES'
|
|
c.build_settings['INFOPLIST_KEY_UIApplicationSceneManifest_Generation'] = 'YES'
|
|
c.build_settings['SUPPORTS_MACCATALYST'] = 'NO'
|
|
end
|
|
watch.build_configurations.each do |c|
|
|
c.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = '$(WRISTIVO_BUNDLE_PREFIX).watchkitapp'
|
|
c.build_settings['TARGETED_DEVICE_FAMILY'] = '4'
|
|
c.build_settings['INFOPLIST_KEY_WKApplication'] = 'YES'
|
|
c.build_settings['INFOPLIST_KEY_WKCompanionAppBundleIdentifier'] = '$(WRISTIVO_BUNDLE_PREFIX)'
|
|
c.build_settings['INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp'] = 'NO'
|
|
c.build_settings['SKIP_INSTALL'] = 'YES'
|
|
end
|
|
phone.add_dependency(watch)
|
|
embed = phone.new_copy_files_build_phase('Embed Watch Content')
|
|
embed.dst_path = '$(CONTENTS_FOLDER_PATH)/Watch'
|
|
embed.dst_subfolder_spec = '16'
|
|
embedded = embed.add_file_reference(watch.product_reference)
|
|
embedded.settings = { 'ATTRIBUTES' => ['RemoveHeadersOnCopy'] }
|
|
project.predictabilize_uuids
|
|
project.save
|
|
[phone, watch].each do |target|
|
|
scheme = Xcodeproj::XCScheme.new
|
|
scheme.add_build_target(target)
|
|
scheme.set_launch_target(target)
|
|
scheme.save_as(project.path, target.name, true)
|
|
end
|
|
puts 'Generated Wristivo.xcodeproj; review the diff before committing.'
|