#!/usr/bin/env bash # _____ _ # |_ _| |_ _ _ ___ ___ _ __ __ _ # | | | ' \| '_/ -_) -_) ' \/ _` |_ # |_| |_||_|_| \___\___|_|_|_\__,_(_) # # Threema iOS Client # Copyright (c) 2020 Threema GmbH # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . set -euo pipefail if [[ $# = 0 ]]; then echo "Usage: ./build.sh [--dependencies | --dependencies-force | --generate-protobuf | [--switch-webrtc-to-debug | --switch-webrtc-to-release] | [--build & --work]] []" echo "" echo "Options to build the app and its dependencies: --dependencies Check out and build Carthage dependencies, and download debug/release WebRTC binaries and SaltyRTC binary if they are missing. (https://github.com/Carthage/Carthage#installing-carthage) --dependencies-force Rebuild Carthage dependencies, download debug/release version of WebRTC binaries and SaltyRTC binary. --generate-protobuf Parse Protobuf files and generate Swift source code. (https://github.com/apple/swift-protobuf/#alternatively-install-via-homebrew) --switch-webrtc-to-debug Switch WebRTC binary to debug version. --switch-webrtc-to-release Switch WebRTC binary to release version. --build Build debug version of target 'Threema'. --build --work Build debug version of target 'Threema Work'. Example: ./build.sh --dependencies --switch-webrtc-to-debug --build .." exit 0 fi # Initialize project directory if [[ $# -gt 0 ]] && [[ ${!#} != '--dependencies' ]] && [[ ${!#} != '--dependencies-force' ]] && [[ ${!#} != '--generate-protobuf' ]] && [[ ${!#} != '--switch-webrtc-to-debug' ]] && [[ ${!#} != '--switch-webrtc-to-release' ]] && [[ ${!#} != '--build' ]] && [[ ${!#} != '--work' ]]; then project_dir="$PWD/${!#}" else project_dir="$PWD" fi if [[ -d "$project_dir/Threema.xcodeproj/project.xcworkspace" ]]; then echo "Project $project_dir/Threema.xcodeproj/project.xcworkspace" else echo "Project $project_dir/Threema.xcodeproj/project.xcworkspace not found" exit 1 fi # Initialize script arguments dependencies_arg=0 dependencies_force_arg=0 generate_protobuf_arg=0 switch_webrtc_to_debug_arg=0 switch_webrtc_to_release_arg=0 build_arg=0 work_arg=0 for arg in "$@"; do if [[ "$arg" = '--dependencies' ]]; then dependencies_arg=1 elif [[ "$arg" = '--dependencies-force' ]]; then dependencies_force_arg=1 elif [[ "$arg" = '--generate-protobuf' ]]; then generate_protobuf_arg=1 elif [[ "$arg" = '--switch-webrtc-to-debug' ]]; then switch_webrtc_to_debug_arg=1 elif [[ "$arg" = '--switch-webrtc-to-release' ]]; then switch_webrtc_to_release_arg=1 elif [[ "$arg" = '--build' ]]; then build_arg=1 elif [[ "$arg" = '--work' ]]; then work_arg=1 fi done if [[ "$dependencies_arg" = 1 ]] || [[ "$dependencies_force_arg" = 1 ]]; then carthage version # Build carthage dependencies if [[ "$dependencies_force_arg" = 1 ]]; then "$project_dir/scripts/carthage.sh" bootstrap --platform iOS --no-use-binaries --project-directory "$project_dir" else "$project_dir/scripts/carthage.sh" bootstrap --platform iOS --no-use-binaries --cache-builds --project-directory "$project_dir" fi # Delete or reset download directories # $1: Local directory reset() { if [[ -d "$project_dir/$1" ]]; then if [[ "$dependencies_force_arg" = 1 ]]; then rm -R "$project_dir/$1" elif [[ $1 == 'WebRTC' ]]; then if [[ -d "WebRTC-debug" ]]; then mv "$project_dir/WebRTC" "$project_dir/WebRTC-release" else mv "$project_dir/WebRTC" "$project_dir/WebRTC-debug" fi fi fi } download() { download_dir="$project_dir/$1" download_url="https://oss.threema.ch/ios/$2/$3/$1.zip" echo "$download_url -> $download_dir" mkdir "$download_dir" curl "$download_url" -o "$download_dir/$1.zip" unzip -q "$download_dir/$1.zip" -d "$download_dir" rm "$download_dir/$1.zip" } # $1: Local directory # $2: Dependency name on oss # $3: Dependency version on oss check() { if [[ -d "$project_dir/$1" ]]; then if [[ "$dependencies_force_arg" = 1 ]]; then rm -R "$project_dir/$1" fi fi if [[ -d "$project_dir/$1" ]]; then echo "Cache found for $1" else download $1 $2 $3 fi } reset "WebRTC" check "WebRTC-debug" "webrtc" "84.1.1" check "WebRTC-release" "webrtc" "84.1.1" reset "SaltyRTC" check "SaltyRTC" "saltyrtc" "0.2.0" fi if [[ "$generate_protobuf_arg" = 1 ]]; then protobuf_submodule_path="./protobuf" protobuf_source_path="./ThreemaFramework/Protobuf" protoc --version if [[ -d "$project_dir/$protobuf_submodule_path" ]]; then if [[ -d "$project_dir/$protobuf_source_path" ]]; then echo "Protobuf source path $project_dir/$protobuf_source_path" else mkdir "$project_dir/$protobuf_source_path" fi for file in "$project_dir/$protobuf_submodule_path"/*.proto do protoc --swift_out="$protobuf_source_path" --proto_path="$protobuf_submodule_path" "$(basename -- "$file")" done fi fi if [[ "$switch_webrtc_to_debug_arg" = 1 ]]; then echo "Switch to WebRTC debug binary" if [[ -d "$project_dir/WebRTC-debug" ]]; then if [[ -d "$project_dir/WebRTC" ]]; then mv "$project_dir/WebRTC" "$project_dir/WebRTC-release" fi mv "$project_dir/WebRTC-debug" "$project_dir/WebRTC" fi elif [[ "$switch_webrtc_to_release_arg" = 1 ]]; then echo "Switch to WebRTC release binary" if [[ -d "$project_dir/WebRTC-release" ]]; then if [[ -d "$project_dir/WebRTC" ]]; then mv "$project_dir/WebRTC" "$project_dir/WebRTC-debug" fi mv "$project_dir/WebRTC-release" "$project_dir/WebRTC" fi fi if [[ "$build_arg" = 1 ]]; then if [[ "$work_arg" = 1 ]]; then scheme="Threema Work" else scheme="Threema" fi echo "Build $scheme" xcodebuild build -workspace "$project_dir/Threema.xcodeproj/project.xcworkspace" -scheme "$scheme" -configuration Debug -destination "generic/platform=iOS" fi