Files
wristivo/Scripts/generate-project.rb
T

96 lines
4.1 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
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')
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.'