diff --git a/BUCK b/BUCK index 20e3bed40d..1176cc2fc3 100644 --- a/BUCK +++ b/BUCK @@ -75,7 +75,7 @@ apple_resource( ) apple_asset_catalog( - name = 'Icons', + name = "Icons", dirs = [ "Telegram-iOS/Icons.xcassets", ], @@ -83,7 +83,7 @@ apple_asset_catalog( ) apple_asset_catalog( - name = 'AppIcons', + name = "AppIcons", dirs = [ "Telegram-iOS/AppIcons.xcassets", ], @@ -99,9 +99,9 @@ apple_resource( ) apple_resource( - name = 'LaunchScreen', + name = "LaunchScreen", files = [ - 'Telegram-iOS/Base.lproj/LaunchScreen.xib', + "Telegram-iOS/Base.lproj/LaunchScreen.xib", ], visibility = ["PUBLIC"], ) @@ -130,7 +130,7 @@ apple_binary( "//:", "//...", ], - configs = app_binary_configs("Telegram"), + configs = app_binary_configs(), swift_version = native.read_config("swift", "version"), srcs = [ "SupportFiles/Empty.swift", @@ -150,7 +150,7 @@ apple_bundle( binary = ":AppBinary", product_name = "Telegram", info_plist = "Telegram-iOS/Info.plist", - info_plist_substitutions = app_info_plist_substitutions("Telegram"), + info_plist_substitutions = app_info_plist_substitutions(), deps = [ ":ShareExtension", ":WidgetExtension", @@ -169,7 +169,7 @@ apple_binary( srcs = glob([ "Share/**/*.swift", ]), - configs = share_extension_configs("Share"), + configs = share_extension_configs(), linker_flags = [ "-e", "_NSExtensionMain", @@ -192,7 +192,7 @@ apple_bundle( binary = ":ShareBinary", extension = "appex", info_plist = "Share/Info.plist", - info_plist_substitutions = share_extension_info_plist_substitutions("Share"), + info_plist_substitutions = share_extension_info_plist_substitutions(), deps = [ ], xcode_product_type = "com.apple.product-type.app-extension", @@ -205,7 +205,7 @@ apple_binary( srcs = glob([ "Widget/**/*.swift", ]), - configs = widget_extension_configs("Widget"), + configs = widget_extension_configs(), swift_compiler_flags = [ "-application-extension", ], @@ -235,7 +235,7 @@ apple_bundle( binary = ":WidgetBinary", extension = "appex", info_plist = "Widget/Info.plist", - info_plist_substitutions = widget_extension_info_plist_substitutions("Widget"), + info_plist_substitutions = widget_extension_info_plist_substitutions(), deps = [ ], xcode_product_type = "com.apple.product-type.app-extension", @@ -248,7 +248,7 @@ apple_binary( srcs = glob([ "NotificationContent/**/*.swift", ]), - configs = notification_content_extension_configs("NotificationContent"), + configs = notification_content_extension_configs(), swift_compiler_flags = [ "-application-extension", ], @@ -274,8 +274,8 @@ apple_bundle( name = "NotificationContentExtension", binary = ":NotificationContentBinary", extension = "appex", - info_plist = "Widget/Info.plist", - info_plist_substitutions = notification_content_extension_info_plist_substitutions("NotificationContent"), + info_plist = "NotificationContent/Info.plist", + info_plist_substitutions = notification_content_extension_info_plist_substitutions(), deps = [ ], xcode_product_type = "com.apple.product-type.app-extension", @@ -291,7 +291,7 @@ apple_binary( headers = glob([ "NotificationService/**/*.h", ]), - configs = notification_service_extension_configs("NotificationService"), + configs = notification_service_extension_configs(), swift_compiler_flags = [ "-application-extension", ], @@ -317,8 +317,8 @@ apple_bundle( name = "NotificationServiceExtension", binary = ":NotificationServiceBinary", extension = "appex", - info_plist = "Widget/Info.plist", - info_plist_substitutions = notification_service_extension_info_plist_substitutions("NotificationService"), + info_plist = "NotificationService/Info.plist", + info_plist_substitutions = notification_service_extension_info_plist_substitutions(), deps = [ ], xcode_product_type = "com.apple.product-type.app-extension", @@ -331,7 +331,7 @@ apple_binary( srcs = glob([ "SiriIntents/**/*.swift", ]), - configs = intents_extension_configs("SiriIntents"), + configs = intents_extension_configs(), swift_compiler_flags = [ "-application-extension", ], @@ -359,8 +359,8 @@ apple_bundle( name = "IntentsExtension", binary = ":IntentsBinary", extension = "appex", - info_plist = "Widget/Info.plist", - info_plist_substitutions = intents_extension_info_plist_substitutions("SiriIntents"), + info_plist = "SiriIntents/Info.plist", + info_plist_substitutions = intents_extension_info_plist_substitutions(), deps = [ ], xcode_product_type = "com.apple.product-type.app-extension", @@ -391,7 +391,7 @@ apple_binary( compiler_flags = [ "-DTARGET_OS_WATCH=1", ], - configs = watch_extension_binary_configs("watchkitapp.watchkitextension"), + configs = watch_extension_binary_configs(), frameworks = [ "$SDKROOT/System/Library/Frameworks/UserNotifications.framework", "$SDKROOT/System/Library/Frameworks/CoreLocation.framework", @@ -404,13 +404,50 @@ apple_bundle( binary = ":WatchAppExtensionBinary", extension = "appex", info_plist = "Watch/Extension/Info.plist", - info_plist_substitutions = watch_extension_info_plist_substitutions("watchkitapp.watchkitextension"), + info_plist_substitutions = watch_extension_info_plist_substitutions(), xcode_product_type = "com.apple.product-type.watchkit2-extension", ) +apple_resource( + name = "WatchAppResources", + dirs = [], + files = glob(["Watch/Extension/Resources/*.png"]) +) + +apple_asset_catalog( + name = "WatchAppAssets", + dirs = [ + "Watch/App/Assets.xcassets", + ], + visibility = ["PUBLIC"], +) + +apple_resource( + name = "WatchAppInterface", + files = [ + "Watch/App/Base.lproj/Interface.storyboard", + ], + visibility = ["PUBLIC"], +) + +apple_resource( + name = "WatchAppStringResources", + files = [], + variants = glob([ + "Telegram-iOS/*.lproj/Localizable.strings", + ]), + visibility = ["PUBLIC"], +) + apple_binary( name = "WatchAppBinary", - configs = watch_binary_configs("watch.app") + configs = watch_binary_configs(), + deps = [ + ":WatchAppResources", + ":WatchAppAssets", + ":WatchAppInterface", + ":WatchAppStringResources", + ], ) apple_bundle( @@ -421,20 +458,13 @@ apple_bundle( ], extension = "app", info_plist = "Watch/App/Info.plist", - info_plist_substitutions = watch_info_plist_substitutions("watchkitapp"), + info_plist_substitutions = watch_info_plist_substitutions(), xcode_product_type = "com.apple.product-type.application.watchapp2", deps = [ ":WatchAppExtension", - ":WatchAppResources", ], ) -apple_resource( - name = "WatchAppResources", - dirs = [], - files = glob(["Watch/Extension/Resources/*.png"]) -) - # Package apple_package( diff --git a/Config/buck_rule_macros.bzl b/Config/buck_rule_macros.bzl index f9ad73a2d7..e1d049e9de 100644 --- a/Config/buck_rule_macros.bzl +++ b/Config/buck_rule_macros.bzl @@ -1,4 +1,4 @@ -load("//Config:configs.bzl", "library_configs", "framework_library_configs", "info_plist_substitutions") +load("//Config:configs.bzl", "library_configs", "dynamic_library_configs", "info_plist_substitutions") def apple_lib( name, @@ -58,54 +58,29 @@ def apple_lib( linker_flags = [] resolved_linker_flags = linker_flags + additional_linker_flags + ["-Wl,-install_name,@rpath/lib%s.dylib" % (name)] - if native.read_config("custom", "mode") == "project": - native.apple_library( - name = name + "", - srcs = srcs, - header_namespace = name, - module_name = name, - headers = headers, - exported_headers = exported_headers, - deps = deps, - exported_deps = exported_deps, - extra_xcode_files = extra_xcode_files, - frameworks = frameworks, - visibility = visibility, - swift_version = swift_version, - configs = framework_library_configs(name), - modular = modular, - compiler_flags = compiler_flags, - platform_compiler_flags = platform_compiler_flags, - swift_compiler_flags = swift_compiler_flags, - preferred_linkage = "shared", - link_style = "static", - linker_flags = resolved_linker_flags, - ) - else: - native.apple_library( - name = name + "", - srcs = srcs, - header_namespace = name, - module_name = name, - soname = "lib" + name + ".dylib", - headers = headers, - exported_headers = exported_headers, - deps = deps, - exported_deps = exported_deps, - extra_xcode_files = extra_xcode_files, - frameworks = frameworks, - visibility = visibility, - swift_version = swift_version, - configs = framework_library_configs(name), - modular = modular, - compiler_flags = compiler_flags, - platform_compiler_flags = platform_compiler_flags, - swift_compiler_flags = swift_compiler_flags, - preferred_linkage = "shared", - link_style = "static", - linker_flags = resolved_linker_flags, - ) - + native.apple_library( + name = name + "", + srcs = srcs, + header_namespace = name, + module_name = name, + soname = "lib" + name + ".dylib", + headers = headers, + exported_headers = exported_headers, + deps = deps, + exported_deps = exported_deps, + extra_xcode_files = extra_xcode_files, + frameworks = frameworks, + visibility = visibility, + swift_version = swift_version, + configs = dynamic_library_configs(), + modular = modular, + compiler_flags = compiler_flags, + platform_compiler_flags = platform_compiler_flags, + swift_compiler_flags = swift_compiler_flags, + preferred_linkage = "shared", + link_style = "static", + linker_flags = resolved_linker_flags, + ) else: additional_linker_flags = additional_linker_flags or [] if has_cpp: @@ -240,24 +215,18 @@ def apple_cxx_lib( def framework_binary_dependencies(names): result = [] - if native.read_config("custom", "mode") == "project": - for name in names: - result.append(name + "#shared") - else: - for name in names: - result.append(name + "#shared") + for name in names: + result.append(name + "#shared") return result def framework_bundle_dependencies(names): result = [] if native.read_config("custom", "mode") == "project": for name in names: - #result.append(name + "#shared") pass else: for name in names: result.append(name + "#shared") - pass return result def gen_header_targets(header_paths, prefix, flavor, source_rule, source_path): diff --git a/Config/configs.bzl b/Config/configs.bzl index ec11c08bda..8fb6ce635c 100644 --- a/Config/configs.bzl +++ b/Config/configs.bzl @@ -37,14 +37,110 @@ SHARED_CONFIGS = { def optimization_config(): return { - "SWIFT_OPTIMIZATION_LEVEL": native.read_config('custom', 'optimization'), + "SWIFT_OPTIMIZATION_LEVEL": native.read_config("custom", "optimization"), } # Adding `-all_load` to our binaries works around https://bugs.swift.org/browse/SR-6004. ALL_LOAD_LINKER_FLAG = "-all_load" -def bundle_identifier(name): - return "org.telegram.Telegram-iOS.%s" % name +def read_config_nonempty(name): + value = native.read_config("custom", name) + if value == None: + fail("Configuration paramter custom.%s should be defined" % name) + elif len(value) == 0: + fail("Configuration paramter custom.%s should not be empty" % name) + else: + return value + +def get_codesign_identity(environment): + if environment == "development": + return read_config_nonempty("developmentCodeSignIdentity") + elif environment == "distribution": + return read_config_nonempty("distributionCodeSignIdentity") + else: + fail("Unknown environment " + environment) + +def get_provisioning_profile(environment, type): + if type == "app": + return read_config_nonempty(environment + "ProvisioningProfileApp") + elif type == "share": + return read_config_nonempty(environment + "ProvisioningProfileExtensionShare") + elif type == "widget": + return read_config_nonempty(environment + "ProvisioningProfileExtensionWidget") + elif type == "notification_service": + return read_config_nonempty(environment + "ProvisioningProfileExtensionNotificationService") + elif type == "notification_content": + return read_config_nonempty(environment + "ProvisioningProfileExtensionNotificationContent") + elif type == "intents": + return read_config_nonempty(environment + "ProvisioningProfileExtensionIntents") + elif type == "watch_app": + return read_config_nonempty(environment + "ProvisioningProfileWatchApp") + elif type == "watch_extension": + return read_config_nonempty(environment + "ProvisioningProfileWatchExtension") + else: + fail("Unknown provisioning profile type " + type) + +def get_development_team(): + return read_config_nonempty("developmentTeam") + +def add_item_to_subdict(superdict, key, subkey, item): + subdict = dict(superdict[key]) + subdict[subkey] = item + superdict[key] = subdict + +valid_configurations = ["Debug", "Profile", "Release"] + +def add_provisioning_profile_specifier(configs, type): + for configuration in configs: + if configuration not in valid_configurations: + fail("Unknown configuration " + configuration) + + configs = dict(configs) + for configuration in valid_configurations: + if configuration == "Debug": + add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="development", type=type)) + elif configuration == "Profile": + add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="development", type=type)) + elif configuration == "Release": + add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="distribution", type=type)) + return configs + +def add_codesign_identity(configs): + for configuration in configs: + if configuration not in valid_configurations: + fail("Unknown configuration " + configuration) + + configs = dict(configs) + for configuration in valid_configurations: + if configuration == "Debug": + add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="development")) + elif configuration == "Profile": + add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="development")) + elif configuration == "Release": + add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="distribution")) + return configs + +def get_codesign_entitlements(type): + if type == "app": + return read_config_nonempty("entitlementsApp") + elif type == "share": + return read_config_nonempty("entitlementsExtensionShare") + elif type == "widget": + return read_config_nonempty("entitlementsExtensionWidget") + elif type == "notification_service": + return read_config_nonempty("entitlementsExtensionNotificationService") + elif type == "notification_content": + return read_config_nonempty("entitlementsExtensionNotificationContent") + elif type == "intents": + return read_config_nonempty("entitlementsExtensionIntents") + else: + fail("unknown provisioning profile type") + +def get_build_number(): + return read_config_nonempty("buildNumber") + +def bundle_identifier(suffix): + return read_config_nonempty("baseApplicationBundleId") + suffix def library_configs(): lib_specific_config = { @@ -64,7 +160,7 @@ def library_configs(): } return configs -def framework_library_configs(name): +def dynamic_library_configs(): lib_specific_config = { "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", @@ -73,7 +169,6 @@ def framework_library_configs(name): # https://developer.apple.com/library/archive/technotes/tn2215/_index.html "SKIP_INSTALL": "YES", "MACH_O_TYPE": "mh_dylib", - "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(name), "CODE_SIGNING_ALLOWED": "NO", } @@ -87,154 +182,163 @@ def framework_library_configs(name): } return configs -def app_binary_configs(name): - binary_specific_config = { +def app_binary_configs(): + config = { "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES": "YES", "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "CODE_SIGN_ENTITLEMENTS": "Telegram-iOS/Telegram-iOS-Hockeyapp.entitlements", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=""), + "CODE_SIGN_ENTITLEMENTS": get_codesign_entitlements("app"), + "DEVELOPMENT_TEAM": get_development_team(), "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIcon", - "BUILD_NUMBER": appConfig()["buildNumber"], + "BUILD_NUMBER": get_build_number(), "APP_NAME": "Telegram", "PRODUCT_NAME": "Telegram", } - binary_config = merge_dict(SHARED_CONFIGS, binary_specific_config) - binary_config = merge_dict(binary_config, optimization_config()) - binary_config = config_with_updated_linker_flags(binary_config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(binary_config) + config = merge_dict(SHARED_CONFIGS, config) + config = merge_dict(config, optimization_config()) + config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "app") + configs = add_codesign_identity(configs) + return configs -def share_extension_configs(name): - binary_specific_config = { +def share_extension_configs(): + config = { "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES": "NO", "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS." + name, - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "CODE_SIGN_ENTITLEMENTS": "Share/Share-HockeyApp.entitlements", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS.Share", - "BUILD_NUMBER": appConfig()["buildNumber"], + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".Share"), + "CODE_SIGN_ENTITLEMENTS": get_codesign_entitlements("share"), + "DEVELOPMENT_TEAM": get_development_team(), + "BUILD_NUMBER": get_build_number(), "APP_NAME": "Telegram", "PRODUCT_NAME": "ShareExtension", } - binary_config = merge_dict(SHARED_CONFIGS, binary_specific_config) - binary_config = merge_dict(binary_config, optimization_config()) - binary_config = config_with_updated_linker_flags(binary_config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(binary_config) + config = merge_dict(SHARED_CONFIGS, config) + config = merge_dict(config, optimization_config()) + config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "share") + configs = add_codesign_identity(configs) + return configs -def widget_extension_configs(name): - binary_specific_config = { +def widget_extension_configs(): + config = { "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES": "NO", "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS." + name, - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "CODE_SIGN_ENTITLEMENTS": "Widget/Widget-HockeyApp.entitlements", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS.Widget", - "BUILD_NUMBER": appConfig()["buildNumber"], + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".Widget"), + "CODE_SIGN_ENTITLEMENTS": get_codesign_entitlements("widget"), + "DEVELOPMENT_TEAM": get_development_team(), + "BUILD_NUMBER": get_build_number(), "APP_NAME": "Telegram", "PRODUCT_NAME": "WidgetExtension", } - binary_config = merge_dict(SHARED_CONFIGS, binary_specific_config) - binary_config = merge_dict(binary_config, optimization_config()) - binary_config = config_with_updated_linker_flags(binary_config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(binary_config) + config = merge_dict(SHARED_CONFIGS, config) + config = merge_dict(config, optimization_config()) + config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "widget") + configs = add_codesign_identity(configs) + return configs -def notification_content_extension_configs(name): - binary_specific_config = { +def notification_content_extension_configs(): + config = { "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES": "NO", "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS." + name, - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "CODE_SIGN_ENTITLEMENTS": "NotificationContent/NotificationContent-HockeyApp.entitlements", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS.NotificationContent", - "BUILD_NUMBER": appConfig()["buildNumber"], + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".NotificationContent"), + "CODE_SIGN_ENTITLEMENTS": get_codesign_entitlements("notification_content"), + "DEVELOPMENT_TEAM": get_development_team(), + "BUILD_NUMBER": get_build_number(), "APP_NAME": "Telegram", "PRODUCT_NAME": "NotificationContentExtension", } - binary_config = merge_dict(SHARED_CONFIGS, binary_specific_config) - binary_config = merge_dict(binary_config, optimization_config()) - binary_config = config_with_updated_linker_flags(binary_config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(binary_config) + config = merge_dict(SHARED_CONFIGS, config) + config = merge_dict(config, optimization_config()) + config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "notification_content") + configs = add_codesign_identity(configs) + return configs -def notification_service_extension_configs(name): - binary_specific_config = { +def notification_service_extension_configs(): + config = { "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES": "NO", "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS." + name, - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "CODE_SIGN_ENTITLEMENTS": "NotificationService/NotificationService-HockeyApp.entitlements", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS.NotificationService", - "BUILD_NUMBER": appConfig()["buildNumber"], + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".NotificationService"), + "CODE_SIGN_ENTITLEMENTS": get_codesign_entitlements("notification_service"), + "DEVELOPMENT_TEAM": get_development_team(), + "BUILD_NUMBER": get_build_number(), "APP_NAME": "Telegram", "PRODUCT_NAME": "NotificationServiceExtension", } - binary_config = merge_dict(SHARED_CONFIGS, binary_specific_config) - binary_config = merge_dict(binary_config, optimization_config()) - binary_config = config_with_updated_linker_flags(binary_config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(binary_config) + config = merge_dict(SHARED_CONFIGS, config) + config = merge_dict(config, optimization_config()) + config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "notification_service") + configs = add_codesign_identity(configs) + return configs -def intents_extension_configs(name): - binary_specific_config = { +def intents_extension_configs(): + config = { "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES": "NO", "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS." + name, - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "CODE_SIGN_ENTITLEMENTS": "SiriIntents/SiriIntents-HockeyApp.entitlements", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS.SiriIntents", - "BUILD_NUMBER": appConfig()["buildNumber"], + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".SiriIntents"), + "CODE_SIGN_ENTITLEMENTS": get_codesign_entitlements("intents"), + "DEVELOPMENT_TEAM": get_development_team(), + "BUILD_NUMBER": get_build_number(), "APP_NAME": "Telegram", "PRODUCT_NAME": "IntentsExtension", } - binary_config = merge_dict(SHARED_CONFIGS, binary_specific_config) - binary_config = merge_dict(binary_config, optimization_config()) - binary_config = config_with_updated_linker_flags(binary_config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(binary_config) + config = merge_dict(SHARED_CONFIGS, config) + config = merge_dict(config, optimization_config()) + config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "intents") + configs = add_codesign_identity(configs) + return configs -def watch_extension_binary_configs(name): +def watch_extension_binary_configs(): config = { "SDKROOT": "watchos", "WATCHOS_DEPLOYMENT_TARGET": "4.0", "TARGETED_DEVICE_FAMILY": "4", - "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier("watchkitapp.watchkitextension"), - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS.watchkitapp.watchkitextension", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".watchkitapp.watchkitextension"), + "DEVELOPMENT_TEAM": get_development_team(), "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks", - "WK_COMPANION_APP_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS", - "WK_APP_BUNDLE_IDENTIFIER": bundle_identifier("watchkitapp"), + "WK_COMPANION_APP_BUNDLE_IDENTIFIER": bundle_identifier(suffix=""), + "WK_APP_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".watchkitapp"), "APP_NAME": "Telegram", - "APP_BUNDLE_ID": "org.telegram.Telegram-iOS", - "BUILD_NUMBER": appConfig()["buildNumber"], + "APP_BUNDLE_ID": bundle_identifier(suffix=""), + "BUILD_NUMBER": get_build_number(), "ENABLE_BITCODE": "YES", } config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(config) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "watch_extension") + configs = add_codesign_identity(configs) + return configs -def watch_binary_configs(name): +def watch_binary_configs(): config = { "SDKROOT": "watchos", "WATCHOS_DEPLOYMENT_TARGET": "4.0", "TARGETED_DEVICE_FAMILY": "4", - "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier("watchkitapp"), - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "DEVELOPMENT_TEAM": "X834Q8SBVP", - "PROVISIONING_PROFILE_SPECIFIER": "match Development org.telegram.Telegram-iOS.watchkitapp", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".watchkitapp"), + "DEVELOPMENT_TEAM": get_development_team(), "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks", - "WK_COMPANION_APP_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS", - "WK_APP_BUNDLE_IDENTIFIER": bundle_identifier("watchkitapp"), + "WK_COMPANION_APP_BUNDLE_IDENTIFIER": bundle_identifier(suffix=""), + "WK_APP_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".watchkitapp"), "APP_NAME": "Telegram", - "APP_BUNDLE_ID": "org.telegram.Telegram-iOS", - "BUILD_NUMBER": appConfig()["buildNumber"], + "APP_BUNDLE_ID": bundle_identifier(suffix=""), + "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIcon", + "BUILD_NUMBER": get_build_number(), "ENABLE_BITCODE": "YES", } config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) - return configs_with_config(config) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "watch_app") + configs = add_codesign_identity(configs) + return configs def info_plist_substitutions(name): substitutions = { @@ -246,114 +350,105 @@ def info_plist_substitutions(name): } return substitutions -def app_info_plist_substitutions(name): +def app_info_plist_substitutions(): substitutions = { "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS", - "PRODUCT_NAME": name, - "APP_NAME": name, + "EXECUTABLE_NAME": "Telegram", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=""), + "PRODUCT_NAME": "Telegram", + "APP_NAME": "Telegram", "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", "APP_SPECIFIC_URL_SCHEME": appConfig()["appSpecificUrlScheme"], - "BUILD_NUMBER": appConfig()["buildNumber"], + "BUILD_NUMBER": get_build_number(), } return substitutions -def share_extension_info_plist_substitutions(name): +def share_extension_info_plist_substitutions(): substitutions = { "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS.Share", - "PRODUCT_NAME": name, + "EXECUTABLE_NAME": "ShareExtension", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".Share"), + "PRODUCT_NAME": "Share", "APP_NAME": "Telegram", "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", "APP_SPECIFIC_URL_SCHEME": appConfig()["appSpecificUrlScheme"], - "BUILD_NUMBER": appConfig()["buildNumber"], + "BUILD_NUMBER": get_build_number(), } return substitutions -def widget_extension_info_plist_substitutions(name): +def widget_extension_info_plist_substitutions(): substitutions = { "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS.Widget", - "PRODUCT_NAME": name, + "EXECUTABLE_NAME": "WidgetExtension", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".Widget"), + "PRODUCT_NAME": "Widget", "APP_NAME": "Telegram", "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", "APP_SPECIFIC_URL_SCHEME": appConfig()["appSpecificUrlScheme"], - "BUILD_NUMBER": appConfig()["buildNumber"], + "BUILD_NUMBER": get_build_number(), } return substitutions -def notification_content_extension_info_plist_substitutions(name): +def notification_content_extension_info_plist_substitutions(): substitutions = { "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS.NotificationContent", - "PRODUCT_NAME": name, + "EXECUTABLE_NAME": "NotificationContentExtension", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".NotificationContent"), + "PRODUCT_NAME": "Telegram", + "APP_NAME": "Telegram", + "CURRENT_PROJECT_VERSION": "1", + "BUILD_NUMBER": get_build_number(), + } + return substitutions + +def notification_service_extension_info_plist_substitutions(): + substitutions = { + "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, + "EXECUTABLE_NAME": "NotificationServiceExtension", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".NotificationService"), + "PRODUCT_NAME": "Telegram", + "APP_NAME": "Telegram", + "CURRENT_PROJECT_VERSION": "1", + "BUILD_NUMBER": get_build_number(), + } + return substitutions + +def intents_extension_info_plist_substitutions(): + substitutions = { + "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, + "EXECUTABLE_NAME": "IntentsExtension", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".SiriIntents"), + "PRODUCT_NAME": "Telegram", "APP_NAME": "Telegram", "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", "APP_SPECIFIC_URL_SCHEME": appConfig()["appSpecificUrlScheme"], - "BUILD_NUMBER": appConfig()["buildNumber"], + "BUILD_NUMBER": get_build_number(), + "PRODUCT_MODULE_NAME": "SiriIntents", } return substitutions -def notification_service_extension_info_plist_substitutions(name): +def watch_extension_info_plist_substitutions(): substitutions = { "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS.NotificationService", - "PRODUCT_NAME": name, + "EXECUTABLE_NAME": "WatchAppExtension", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=".watchkitapp.watchkitextension"), "APP_NAME": "Telegram", + "APP_BUNDLE_ID": bundle_identifier(suffix=""), + "PRODUCT_NAME": "Telegram", "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "APP_SPECIFIC_URL_SCHEME": appConfig()["appSpecificUrlScheme"], - "BUILD_NUMBER": appConfig()["buildNumber"], + "BUILD_NUMBER": get_build_number(), } return substitutions -def intents_extension_info_plist_substitutions(name): +def watch_info_plist_substitutions(): substitutions = { "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS.SiriIntents", - "PRODUCT_NAME": name, + "EXECUTABLE_NAME": "WatchApp", + "PRODUCT_BUNDLE_IDENTIFIER":bundle_identifier(suffix=".watchkitapp"), "APP_NAME": "Telegram", + "APP_BUNDLE_ID": bundle_identifier(suffix=""), + "PRODUCT_NAME": "Telegram", "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "APP_SPECIFIC_URL_SCHEME": appConfig()["appSpecificUrlScheme"], - "BUILD_NUMBER": appConfig()["buildNumber"], - } - return substitutions - -def watch_extension_info_plist_substitutions(name): - substitutions = { - "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS.watchkitapp.watchkitextension", - "APP_NAME": "Telegram", - "APP_BUNDLE_ID": "org.telegram.Telegram-iOS", - "PRODUCT_NAME": name, - "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "BUILD_NUMBER": appConfig()["buildNumber"], - } - return substitutions - -def watch_info_plist_substitutions(name): - substitutions = { - "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, - "EXECUTABLE_NAME": name, - "PRODUCT_BUNDLE_IDENTIFIER": "org.telegram.Telegram-iOS.watchkitapp", - "APP_NAME": "Telegram", - "APP_BUNDLE_ID": "org.telegram.Telegram-iOS", - "PRODUCT_NAME": name, - "CURRENT_PROJECT_VERSION": "1", - "CODE_SIGN_IDENTITY": "iPhone Developer: Peter Iakovlev (9J4EJ3F97G)", - "BUILD_NUMBER": appConfig()["buildNumber"], + "BUILD_NUMBER": get_build_number(), } return substitutions diff --git a/Makefile b/Makefile index 9dae903e5f..7d433ff439 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,40 @@ -.PHONY : check_env build build_arm64 package_arm64 build_buckdebug build_verbose kill_xcode clean project project_buckdebug +.PHONY : check_env build build_arm64 package_arm64 app_arm64 build_buckdebug build_verbose kill_xcode clean project project_buckdebug BUCK_OPTIONS=\ - --config custom.apiId="${TELEGRAM_API_ID}" \ - --config custom.apiHash="${TELGRAM_API_HASH}" \ - --config custom.hockeyAppId="${TELGRAM_HOCKEYAPP_ID}" \ - --config custom.isInternalBuild="${TELEGRAM_IS_INTERNAL_BUILD}" \ - --config custom.isAppStoreBuild="${TELEGRAM_IS_APPSTORE_BUILD}" \ - --config custom.appStoreId="${TELEGRAM_APPSTORE_ID}" \ - --config custom.appSpecificUrlScheme="${TELEGRAM_APP_SPECIFIC_URL_SCHEME}" \ - --config custom.buildNumber="${TELEGRAM_BUILD_NUMBER}" + --config custom.developmentCodeSignIdentity="${DEVELOPMENT_CODE_SIGN_IDENTITY}" \ + --config custom.distributionCodeSignIdentity="${DISTRIBUTION_CODE_SIGN_IDENTITY}" \ + --config custom.developmentTeam="${DEVELOPMENT_TEAM}" \ + --config custom.baseApplicationBundleId="${BUNDLE_ID}" \ + --config custom.apiId="${API_ID}" \ + --config custom.apiHash="${API_HASH}" \ + --config custom.hockeyAppId="${HOCKEYAPP_ID}" \ + --config custom.isInternalBuild="${IS_INTERNAL_BUILD}" \ + --config custom.isAppStoreBuild="${IS_APPSTORE_BUILD}" \ + --config custom.appStoreId="${APPSTORE_ID}" \ + --config custom.appSpecificUrlScheme="${APP_SPECIFIC_URL_SCHEME}" \ + --config custom.buildNumber="${BUILD_NUMBER}" \ + --config custom.entitlementsApp="${ENTITLEMENTS_APP}" \ + --config custom.developmentProvisioningProfileApp="${DEVELOPMENT_PROVISIONING_PROFILE_APP}" \ + --config custom.distributionProvisioningProfileApp="${DISTRIBUTION_PROVISIONING_PROFILE_APP}" \ + --config custom.entitlementsExtensionShare="${ENTITLEMENTS_EXTENSION_SHARE}" \ + --config custom.developmentProvisioningProfileExtensionShare="${DEVELOPMENT_PROVISIONING_PROFILE_EXTENSION_SHARE}" \ + --config custom.distributionProvisioningProfileExtensionShare="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_SHARE}" \ + --config custom.entitlementsExtensionWidget="${ENTITLEMENTS_EXTENSION_WIDGET}" \ + --config custom.developmentProvisioningProfileExtensionWidget="${DEVELOPMENT_PROVISIONING_PROFILE_EXTENSION_WIDGET}" \ + --config custom.distributionProvisioningProfileExtensionWidget="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_WIDGET}" \ + --config custom.entitlementsExtensionNotificationService="${ENTITLEMENTS_EXTENSION_NOTIFICATIONSERVICE}" \ + --config custom.developmentProvisioningProfileExtensionNotificationService="${DEVELOPMENT_PROVISIONING_PROFILE_EXTENSION_NOTIFICATIONSERVICE}" \ + --config custom.distributionProvisioningProfileExtensionNotificationService="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_NOTIFICATIONSERVICE}" \ + --config custom.entitlementsExtensionNotificationContent="${ENTITLEMENTS_EXTENSION_NOTIFICATIONCONTENT}" \ + --config custom.developmentProvisioningProfileExtensionNotificationContent="${DEVELOPMENT_PROVISIONING_PROFILE_EXTENSION_NOTIFICATIONCONTENT}" \ + --config custom.distributionProvisioningProfileExtensionNotificationContent="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_NOTIFICATIONCONTENT}" \ + --config custom.entitlementsExtensionIntents="${ENTITLEMENTS_EXTENSION_INTENTS}" \ + --config custom.developmentProvisioningProfileExtensionIntents="${DEVELOPMENT_PROVISIONING_PROFILE_EXTENSION_INTENTS}" \ + --config custom.distributionProvisioningProfileExtensionIntents="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_INTENTS}" \ + --config custom.developmentProvisioningProfileWatchApp="${DEVELOPMENT_PROVISIONING_PROFILE_WATCH_APP}" \ + --config custom.distributionProvisioningProfileWatchApp="${DISTRIBUTION_PROVISIONING_PROFILE_WATCH_APP}" \ + --config custom.developmentProvisioningProfileWatchExtension="${DEVELOPMENT_PROVISIONING_PROFILE_WATCH_EXTENSION}" \ + --config custom.distributionProvisioningProfileWatchExtension="${DISTRIBUTION_PROVISIONING_PROFILE_WATCH_EXTENSION}" BUCK=/Users/peter/build/buck-next/buck/buck-out/gen/programs/buck.pex @@ -17,14 +43,31 @@ check_env: build: check_env $(BUCK) build //:AppPackage#iphoneos-arm64,iphoneos-armv7 ${BUCK_OPTIONS} - sh package_app.sh $(BUCK) "${BUCK_OPTIONS}" iphoneos-arm64,iphoneos-armv7 + sh package_app.sh iphoneos-arm64,iphoneos-armv7 $(BUCK) ${BUCK_OPTIONS} build_arm64: check_env $(BUCK) build //:AppPackage#iphoneos-arm64 ${BUCK_OPTIONS} - sh package_app.sh $(BUCK) "${BUCK_OPTIONS}" iphoneos-arm64 package_arm64: - sh package_app.sh $(BUCK) "${BUCK_OPTIONS}" iphoneos-arm64 + PACKAGE_DEVELOPMENT_TEAM="${DEVELOPMENT_TEAM}" \ + PACKAGE_CODE_SIGN_IDENTITY="${DISTRIBUTION_CODE_SIGN_IDENTITY}" \ + PACKAGE_PROVISIONING_PROFILE_APP="${DISTRIBUTION_PROVISIONING_PROFILE_APP}" \ + PACKAGE_ENTITLEMENTS_APP="${ENTITLEMENTS_APP}" \ + PACKAGE_PROVISIONING_PROFILE_EXTENSION_Share="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_SHARE}" \ + PACKAGE_ENTITLEMENTS_EXTENSION_Share="${ENTITLEMENTS_EXTENSION_SHARE}" \ + PACKAGE_PROVISIONING_PROFILE_EXTENSION_Widget="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_WIDGET}" \ + PACKAGE_ENTITLEMENTS_EXTENSION_Widget="${ENTITLEMENTS_EXTENSION_WIDGET}" \ + PACKAGE_PROVISIONING_PROFILE_EXTENSION_NotificationService="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_NOTIFICATIONSERVICE}" \ + PACKAGE_ENTITLEMENTS_EXTENSION_NotificationService="${ENTITLEMENTS_EXTENSION_NOTIFICATIONSERVICE}" \ + PACKAGE_PROVISIONING_PROFILE_EXTENSION_NotificationContent="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_NOTIFICATIONCONTENT}" \ + PACKAGE_ENTITLEMENTS_EXTENSION_NotificationContent="${ENTITLEMENTS_EXTENSION_NOTIFICATIONCONTENT}" \ + PACKAGE_PROVISIONING_PROFILE_EXTENSION_Intents="${DISTRIBUTION_PROVISIONING_PROFILE_EXTENSION_INTENTS}" \ + PACKAGE_ENTITLEMENTS_EXTENSION_Intents="${ENTITLEMENTS_EXTENSION_INTENTS}" \ + PACKAGE_PROVISIONING_PROFILE_WATCH_APP="${DISTRIBUTION_PROVISIONING_PROFILE_WATCH_APP}" \ + PACKAGE_PROVISIONING_PROFILE_WATCH_EXTENSION="${DISTRIBUTION_PROVISIONING_PROFILE_WATCH_EXTENSION}" \ + sh package_app.sh iphoneos-arm64 $(BUCK) $(BUCK_OPTIONS) + +app_arm64: build_arm64 package_arm64 build_buckdebug: check_env BUCK_DEBUG_MODE=1 $(BUCK) build //:AppPackage#iphoneos-arm64 ${BUCK_OPTIONS} diff --git a/Share/Info.plist b/Share/Info.plist index 31ad953e4b..9ce95e61f2 100644 --- a/Share/Info.plist +++ b/Share/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 5.11 CFBundleVersion - 99999 + ${BUILD_NUMBER} NSExtension NSExtensionAttributes diff --git a/Telegram-iOS/Info.plist b/Telegram-iOS/Info.plist index a15511f5e7..0c3c9d00ae 100644 --- a/Telegram-iOS/Info.plist +++ b/Telegram-iOS/Info.plist @@ -223,7 +223,7 @@ CFBundleVersion - 99999 + ${BUILD_NUMBER} ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/Watch/App/Info.plist b/Watch/App/Info.plist index dbf2e283c9..231bf78dcb 100644 --- a/Watch/App/Info.plist +++ b/Watch/App/Info.plist @@ -29,5 +29,9 @@ $(APP_BUNDLE_ID) WKWatchKitApp + UIDeviceFamily + + 4 + diff --git a/package_app.sh b/package_app.sh index 0d25331d0f..68c4510d82 100644 --- a/package_app.sh +++ b/package_app.sh @@ -3,14 +3,10 @@ set -x set -e -if [ -z "$1" ] || [ -z "$2" ]; then - echo "Usage: sh package_app.sh path/to/buck platform-flavors" - exit 1 -fi - -BUCK="$1" -BUCK_OPTIONS="$2" -PLATFORM_FLAVORS="$3" +PLATFORM_FLAVORS="$1" +BUCK="$2" +shift +shift BUILD_PATH="build" APP_NAME="Telegram" @@ -20,11 +16,18 @@ DSYMS_FOLDER_NAME="DSYMs" DSYMS_ZIP="$BUILD_PATH/$DSYMS_FOLDER_NAME.zip" DSYMS_DIR="$BUILD_PATH/$DSYMS_FOLDER_NAME" +TEMP_PATH="$BUILD_PATH/temp" +TEMP_ENTITLEMENTS_PATH="$TEMP_PATH/entitlements" + mkdir -p "$BUILD_PATH" rm -f "$IPA_PATH" rm -f "$DSYMS_ZIP" rm -rf "$DSYMS_DIR" mkdir -p "$DSYMS_DIR" +rm -rf "$TEMP_PATH" + +mkdir -p "$TEMP_PATH" +mkdir -p "$TEMP_ENTITLEMENTS_PATH" cp "buck-out/gen/AppPackage#$PLATFORM_FLAVORS.ipa" "$IPA_PATH.original" rm -rf "$IPA_PATH.original.unpacked" @@ -32,6 +35,7 @@ rm -f "$BUILD_PATH/${APP_NAME}_signed.ipa" mkdir -p "$IPA_PATH.original.unpacked" unzip "$IPA_PATH.original" -d "$IPA_PATH.original.unpacked/" rm "$IPA_PATH.original" +rm -f "$KEYCHAIN_PATH" UNPACKED_PATH="$IPA_PATH.original.unpacked" APP_PATH="$UNPACKED_PATH/Payload/Telegram.app" @@ -41,25 +45,118 @@ rm -rf "$IPA_PATH.original.unpacked/SwiftSupport/iphoneos/"* rm -rf "$IPA_PATH.original.unpacked/Symbols/"* rm -rf "$FRAMEWORKS_DIR/"* -for DEPENDENCY in $(${BUCK} query "kind('apple_library|apple_binary', deps('//:Telegram#$PLATFORM_FLAVORS', 1))" ${BUCK_OPTIONS}); do - case "$DEPENDENCY" in - *"#"*) - ;; - *) - DEPENDENCY="$DEPENDENCY#$PLATFORM_FLAVORS" - ;; - esac +if [ -z "$1" ] || [ -z "$2" ]; then + echo "Usage: sh package_app.sh path/to/buck platform-flavors" + exit 1 +fi + +if [ -z "$PACKAGE_CODE_SIGN_IDENTITY" ]; then + echo "PACKAGE_CODE_SIGN_IDENTITY is not set" + exit 1 +fi + +if [ -z "$DEVELOPMENT_TEAM" ]; then + echo "DEVELOPMENT_TEAM is not set" + exit 1 +fi + +if [ ! -d "$CODESIGNING_DATA_PATH" ]; then + echo "CODESIGNING_DATA_PATH $CODESIGNING_DATA_PATH does not exist" + exit 1 +fi + +APP_ITEMS_WITH_PROVISIONING_PROFILE="APP EXTENSION_Share EXTENSION_Widget EXTENSION_NotificationService EXTENSION_NotificationContent EXTENSION_Intents WATCH_APP WATCH_EXTENSION" +APP_ITEMS_WITH_ENTITLEMENTS="APP EXTENSION_Share EXTENSION_Widget EXTENSION_NotificationService EXTENSION_NotificationContent EXTENSION_Intents" + +COMMON_IDENTITY_HASH="" + +for ITEM in $APP_ITEMS_WITH_PROVISIONING_PROFILE; do + PROFILE_VAR=PACKAGE_PROVISIONING_PROFILE_$ITEM + if [ -z "${!PROFILE_VAR}" ]; then + echo "$PROFILE_VAR is not set" + exit 1 + fi + for PROFILE in "$CODESIGNING_DATA_PATH/profiles/"*; do + PROFILE_DATA=$(security cms -D -i "$PROFILE") + PROFILE_NAME=$(/usr/libexec/PlistBuddy -c "Print :Name" /dev/stdin <<< $(echo $PROFILE_DATA)) + if [ "$PROFILE_NAME" == "${!PROFILE_VAR}" ]; then + TEAM_IDENTIFIER=$(/usr/libexec/PlistBuddy -c "Print :Entitlements:com.apple.developer.team-identifier" /dev/stdin <<< $(echo $PROFILE_DATA)) + if [ "$TEAM_IDENTIFIER" != "$DEVELOPMENT_TEAM" ]; then + "Entitlements:com.apple.developer.team-identifier in $PROFILE does not match $DEVELOPMENT_TEAM" + fi + + echo $(/usr/libexec/PlistBuddy -c "Print :DeveloperCertificates:0 :data" /dev/stdin <<< $(echo $PROFILE_DATA)) > cert.pem + IDENTITY_NAME=$(/usr/libexec/PlistBuddy -c "Print :DeveloperCertificates:0 :data" /dev/stdin <<< $(echo $PROFILE_DATA) | openssl x509 -inform DER -subject -nameopt multiline -sha1 -noout | grep commonName | sed -e 's#[ ]*commonName[ ]*=[ ]*##g') + if [ ! -z "$IDENTITY_NAME" ]; then + IDENTITY_HASH=$(/usr/libexec/PlistBuddy -c "Print :DeveloperCertificates:0 :data" /dev/stdin <<< $(echo $PROFILE_DATA) | openssl x509 -inform DER -fingerprint -sha1 -noout | sed -e 's#SHA1 Fingerprint=##' | sed -e 's#:##g') + if [ -z "$COMMON_IDENTITY_HASH" ]; then + COMMON_IDENTITY_HASH="$IDENTITY_HASH" + elif [ "$COMMON_IDENTITY_HASH" != "$IDENTITY_HASH" ]; then + "Signing identity in $PROFILE ($IDENTITY_HASH) does not match $COMMON_IDENTITY_HASH from previously processed profiles" + fi + else + echo "Signing identity name in $PROFILE does not match $PACKAGE_CODE_SIGN_IDENTITY" + exit 1 + fi + + declare PROFILE_PATH_$ITEM="$PROFILE" + + PROFILE_ENTITLEMENTS_PATH="$TEMP_ENTITLEMENTS_PATH/$ITEM.entitlements" + security cms -D -i "$PROFILE" > "$TEMP_PATH/temp.plist" && /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' "$TEMP_PATH/temp.plist" > "$PROFILE_ENTITLEMENTS_PATH" + declare ENTITLEMENTS_PATH_$ITEM="$PROFILE_ENTITLEMENTS_PATH" + fi + done +done + +for ITEM in $APP_ITEMS_WITH_PROVISIONING_PROFILE; do + PROFILE_PATH_VAR=PROFILE_PATH_$ITEM + if [ -z "${!PROFILE_PATH_VAR}" ]; then + echo "Provisioning profile for $ITEM was not found" + exit 1 + fi +done + +for ITEM in $APP_ITEMS_WITH_ENTITLEMENTS; do + ENTITLEMENTS_VAR=PACKAGE_ENTITLEMENTS_$ITEM + if [ -z "${!ENTITLEMENTS_VAR}" ]; then + echo "$ENTITLEMENTS_VAR is not set" + exit 1 + fi + if [ ! -f "${!ENTITLEMENTS_VAR}" ]; then + echo "${!ENTITLEMENTS_VAR} does not exist" + exit 1 + fi + + #declare ENTITLEMENTS_PATH_$ITEM="${!ENTITLEMENTS_VAR}" +done + +if [ -z "$COMMON_IDENTITY_HASH" ]; then + echo "Failed to determine signing identity" + exit 1 +fi + +for DEPENDENCY in $(${BUCK} query "kind('apple_library', deps('//:Telegram#$PLATFORM_FLAVORS', 1))" "$@"); do DEPENDENCY_PATH=$(echo "$DEPENDENCY" | sed -e "s#^//##" | sed -e "s#:#/#") DEPENDENCY_NAME=$(echo "$DEPENDENCY" | sed -e "s/#.*//" | sed -e "s/^.*\://") DYLIB_PATH="buck-out/gen/$DEPENDENCY_PATH/lib$DEPENDENCY_NAME.dylib" - if [ -f "$DYLIB_PATH" ]; then - TARGET_DYLIB_PATH="$FRAMEWORKS_DIR/lib$DEPENDENCY_NAME.dylib" - cp "$DYLIB_PATH" "$TARGET_DYLIB_PATH" - fi + TARGET_DYLIB_PATH="$FRAMEWORKS_DIR/lib$DEPENDENCY_NAME.dylib" + cp "$DYLIB_PATH" "$TARGET_DYLIB_PATH" DSYM_PATH="buck-out/gen/$(echo "$DEPENDENCY" | sed -e "s/#/#apple-dsym,/" | sed -e "s#^//##" | sed -e "s#:#/#").dSYM" - cp -f -r "$DSYM_PATH" "$DSYMS_DIR/" + cp -r "$DSYM_PATH" "$DSYMS_DIR/" done +APP_BINARY_DSYM_PATH="buck-out/gen/Telegram#dwarf-and-dsym,$PLATFORM_FLAVORS,no-include-frameworks/Telegram.app.dSYM" +cp -r "$APP_BINARY_DSYM_PATH" "$DSYMS_DIR/" + +EXTENSIONS="Share Widget Intents NotificationContent NotificationService" +for EXTENSION in $EXTENSIONS; do + EXTENSION_DSYM_PATH="buck-out/gen/${EXTENSION}Extension#dwarf-and-dsym,$PLATFORM_FLAVORS,no-include-frameworks/${EXTENSION}Extension.appex.dSYM" + cp -r "$EXTENSION_DSYM_PATH" "$DSYMS_DIR/" +done + +WATCH_EXTENSION_DSYM_PATH="buck-out/gen/WatchAppExtension#dwarf-and-dsym,no-include-frameworks,watchos-arm64_32,watchos-armv7k/WatchAppExtension.appex.dSYM" +cp -r "$WATCH_EXTENSION_DSYM_PATH" "$DSYMS_DIR/" + for LIB in $(ls "$FRAMEWORKS_DIR"/*.dylib); do strip -S -T "$LIB" done @@ -75,27 +172,114 @@ done cp "$IPA_PATH.original.unpacked/SwiftSupport/iphoneos/"*.dylib "$FRAMEWORKS_DIR/" -CERTIFICATE="76F9BA5C281AA72599FE015E0CE1A5D82F5A3DED" - for framework in "$FRAMEWORKS_DIR"/*; do if [[ "$framework" == *.framework || "$framework" == *.dylib ]]; then - /usr/bin/codesign ${VERBOSE} ${KEYCHAIN_FLAG} -f -s "$CERTIFICATE" "$framework" - else - log "Ignoring non-framework: $framework" + /usr/bin/codesign ${VERBOSE} ${KEYCHAIN_FLAG} -f -s "$COMMON_IDENTITY_HASH" "$framework" fi done -PROVISIONING_PROFILE="buildbox/transient-data/codesigning/profiles/InHouse_org.telegram.Telegram-iOS.mobileprovision" -cp "$PROVISIONING_PROFILE" "$APP_PATH/embedded.mobileprovision" +PLUGINS="Share Widget Intents NotificationService NotificationContent" +for PLUGIN in $PLUGINS; do + PLUGIN_PATH="$APP_PATH/PlugIns/${PLUGIN}Extension.appex" + if [ ! -d "$PLUGIN_PATH" ]; then + echo "Directory at $PLUGIN_PATH does not exist" + exit 1 + fi + PROFILE_PATH_VAR="PROFILE_PATH_EXTENSION_$PLUGIN" + if [ -z "${!PROFILE_PATH_VAR}" ]; then + echo "$PROFILE_PATH_VAR is not defined" + exit 1 + fi + if [ ! -f "${!PROFILE_PATH_VAR}" ]; then + echo "${!PROFILE_PATH_VAR} does not exist" + exit 1 + fi + ENTITLEMENTS_PATH_VAR="ENTITLEMENTS_PATH_EXTENSION_$PLUGIN" + if [ -z "${!ENTITLEMENTS_PATH_VAR}" ]; then + echo "$ENTITLEMENTS_PATH_VAR is not defined" + exit 1 + fi + if [ ! -f "${!ENTITLEMENTS_PATH_VAR}" ]; then + echo "${!ENTITLEMENTS_PATH_VAR} does not exist" + exit 1 + fi + cp "${!PROFILE_PATH_VAR}" "$PLUGIN_PATH/embedded.mobileprovision" + /usr/bin/codesign ${VERBOSE} -f -s "$COMMON_IDENTITY_HASH" --entitlements "${!ENTITLEMENTS_PATH_VAR}" "$PLUGIN_PATH" +done -ENTITLEMENTS="Entitlements.entitlements" +WATCH_APP_PATH="$APP_PATH/Watch/WatchApp.app" +WATCH_EXTENSION_PATH="$WATCH_APP_PATH/PlugIns/WatchAppExtension.appex" -/usr/bin/codesign ${VERBOSE} -f -s "$CERTIFICATE" --entitlements "$ENTITLEMENTS" "$APP_PATH" +WATCH_EXTENSION_PROFILE_PATH_VAR="PROFILE_PATH_WATCH_EXTENSION" +if [ -z "${!WATCH_EXTENSION_PROFILE_PATH_VAR}" ]; then + echo "$WATCH_EXTENSION_PROFILE_PATH_VAR is not defined" + exit 1 +fi +if [ ! -f "${!WATCH_EXTENSION_PROFILE_PATH_VAR}" ]; then + echo "${!WATCH_EXTENSION_PROFILE_PATH_VAR} does not exist" + exit 1 +fi +WATCH_EXTENSION_ENTITLEMENTS_PATH_VAR="ENTITLEMENTS_PATH_WATCH_EXTENSION" +if [ -z "${!WATCH_EXTENSION_ENTITLEMENTS_PATH_VAR}" ]; then + echo "$WATCH_EXTENSION_ENTITLEMENTS_PATH_VAR is not defined" + exit 1 +fi +if [ ! -f "${!WATCH_EXTENSION_ENTITLEMENTS_PATH_VAR}" ]; then + echo "${!WATCH_EXTENSION_ENTITLEMENTS_PATH_VAR} does not exist" + exit 1 +fi + +cp "${!WATCH_EXTENSION_PROFILE_PATH_VAR}" "$WATCH_EXTENSION_PATH/embedded.mobileprovision" +/usr/bin/codesign ${VERBOSE} -f -s "$COMMON_IDENTITY_HASH" --entitlements "${!WATCH_EXTENSION_ENTITLEMENTS_PATH_VAR}" "$WATCH_EXTENSION_PATH" + +WATCH_APP_PROFILE_PATH_VAR="PROFILE_PATH_WATCH_APP" +if [ -z "${!WATCH_APP_PROFILE_PATH_VAR}" ]; then + echo "$WATCH_APP_PROFILE_PATH_VAR is not defined" + exit 1 +fi +if [ ! -f "${!WATCH_APP_PROFILE_PATH_VAR}" ]; then + echo "${!WATCH_APP_PROFILE_PATH_VAR} does not exist" + exit 1 +fi +WATCH_APP_ENTITLEMENTS_PATH_VAR="ENTITLEMENTS_PATH_WATCH_APP" +if [ -z "${!WATCH_APP_ENTITLEMENTS_PATH_VAR}" ]; then + echo "$WATCH_APP_ENTITLEMENTS_PATH_VAR is not defined" + exit 1 +fi +if [ ! -f "${!WATCH_APP_ENTITLEMENTS_PATH_VAR}" ]; then + echo "${!WATCH_APP_ENTITLEMENTS_PATH_VAR} does not exist" + exit 1 +fi + +cp "${!WATCH_APP_PROFILE_PATH_VAR}" "$WATCH_APP_PATH/embedded.mobileprovision" +/usr/bin/codesign ${VERBOSE} -f -s "$COMMON_IDENTITY_HASH" --entitlements "${!WATCH_APP_ENTITLEMENTS_PATH_VAR}" "$WATCH_APP_PATH" + +APP_PROFILE_PATH_VAR="PROFILE_PATH_APP" +if [ -z "${!APP_PROFILE_PATH_VAR}" ]; then + echo "$APP_PROFILE_PATH_VAR is not defined" + exit 1 +fi +if [ ! -f "${!APP_PROFILE_PATH_VAR}" ]; then + echo "${!APP_PROFILE_PATH_VAR} does not exist" + exit 1 +fi +APP_ENTITLEMENTS_PATH_VAR="ENTITLEMENTS_PATH_APP" +if [ -z "${!APP_ENTITLEMENTS_PATH_VAR}" ]; then + echo "$APP_ENTITLEMENTS_PATH_VAR is not defined" + exit 1 +fi +if [ ! -f "${!APP_ENTITLEMENTS_PATH_VAR}" ]; then + echo "${!APP_ENTITLEMENTS_PATH_VAR} does not exist" + exit 1 +fi + +cp "${!APP_PROFILE_PATH_VAR}" "$APP_PATH/embedded.mobileprovision" +/usr/bin/codesign ${VERBOSE} -f -s "$COMMON_IDENTITY_HASH" --entitlements "${!APP_ENTITLEMENTS_PATH_VAR}" "$APP_PATH" DIR=$(pwd) cd "$UNPACKED_PATH" -zip -r "../${APP_NAME}_signed.ipa" Payload SwiftSupport +zip -r "../${APP_NAME}_signed.ipa" Payload #SwiftSupport WatchKitSupport2 cd "$DIR" cd "$BUILD_PATH"