build-macos 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #!/usr/bin/env zsh
  2. builtin emulate -L zsh
  3. setopt EXTENDED_GLOB
  4. setopt PUSHD_SILENT
  5. setopt ERR_EXIT
  6. setopt ERR_RETURN
  7. setopt NO_UNSET
  8. setopt PIPE_FAIL
  9. setopt NO_AUTO_PUSHD
  10. setopt NO_PUSHD_IGNORE_DUPS
  11. setopt FUNCTION_ARGZERO
  12. ## Enable for script debugging
  13. # setopt WARN_CREATE_GLOBAL
  14. # setopt WARN_NESTED_VAR
  15. # setopt XTRACE
  16. if (( ! ${+CI} )) {
  17. print -u2 -PR "%F{1} ✖︎ ${ZSH_ARGZERO:t:r} requires CI environment.%f"
  18. exit 1
  19. }
  20. autoload -Uz is-at-least && if ! is-at-least 5.9; then
  21. print -u2 -PR "${CI:+::error::}%F{1}${funcstack[1]##*/}:%f Running on Zsh version %B${ZSH_VERSION}%b, but Zsh %B5.2%b is the minimum supported version. Upgrade Zsh to fix this issue."
  22. exit 1
  23. fi
  24. TRAPZERR() {
  25. print -u2 -PR "::error::%F{1} ✖︎ script execution error%f"
  26. print -PR -e "
  27. Callstack:
  28. ${(j:\n :)funcfiletrace}
  29. "
  30. exit 2
  31. }
  32. build() {
  33. if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h}
  34. local host_os='macos'
  35. local project_root=${SCRIPT_HOME:A:h:h}
  36. local buildspec_file=${project_root}/buildspec.json
  37. fpath=("${SCRIPT_HOME}/utils.zsh" ${fpath})
  38. autoload -Uz log_group log_info log_error log_output check_macos setup_ccache
  39. if [[ ! -r ${buildspec_file} ]] {
  40. log_error \
  41. 'No buildspec.json found. Please create a build specification for your project.'
  42. return 2
  43. }
  44. local -i debug=0
  45. local config='RelWithDebInfo'
  46. local -r -a _valid_configs=(Debug RelWithDebInfo Release MinSizeRel)
  47. local -i codesign=0
  48. local -a args
  49. while (( # )) {
  50. case ${1} {
  51. -c|--config)
  52. if (( # == 1 )) || [[ ${2:0:1} == '-' ]] {
  53. log_error "Missing value for option %B${1}%b"
  54. log_output ${_usage}
  55. exit 2
  56. }
  57. ;;
  58. }
  59. case ${1} {
  60. --) shift; args+=($@); break ;;
  61. -c|--config)
  62. if (( ! ${_valid_configs[(Ie)${2}]} )) {
  63. log_error "Invalid value %B${2}%b for option %B${1}%b"
  64. exit 2
  65. }
  66. config=${2}
  67. shift 2
  68. ;;
  69. -s|--codesign) codesign=1; shift ;;
  70. --debug) debug=1; shift ;;
  71. *) log_error "Unknown option: %B${1}%b"; exit 2 ;;
  72. }
  73. }
  74. set -- ${(@)args}
  75. check_macos
  76. local product_name
  77. local product_version
  78. read -r product_name product_version <<< \
  79. "$(jq -r '. | {name, version} | join(" ")' ${buildspec_file})"
  80. pushd ${project_root}
  81. local -a cmake_args=()
  82. local -a cmake_build_args=(--build)
  83. local -a cmake_install_args=(--install)
  84. if (( debug )) cmake_args+=(--debug-output)
  85. cmake_args+=(--preset 'macos-ci')
  86. typeset -gx NSUnbufferedIO=YES
  87. typeset -gx CODESIGN_IDENT="${CODESIGN_IDENT:--}"
  88. if (( codesign )) && [[ -z ${CODESIGN_TEAM} ]] {
  89. typeset -gx CODESIGN_TEAM="$(print "${CODESIGN_IDENT}" | /usr/bin/sed -En 's/.+\((.+)\)/\1/p')"
  90. }
  91. log_group "Configuring ${product_name}..."
  92. cmake -S ${project_root} ${cmake_args}
  93. log_group "Building ${product_name}..."
  94. run_xcodebuild() {
  95. if (( debug )) {
  96. xcodebuild ${@}
  97. } else {
  98. if [[ ${GITHUB_EVENT_NAME} == push ]] {
  99. xcodebuild ${@} 2>&1 | xcbeautify --renderer terminal
  100. } else {
  101. xcodebuild ${@} 2>&1 | xcbeautify --renderer github-actions
  102. }
  103. }
  104. }
  105. local -a build_args=(
  106. ONLY_ACTIVE_ARCH=NO
  107. -arch arm64
  108. -arch x86_64
  109. -project ${product_name}.xcodeproj
  110. -target ${product_name}
  111. -destination "generic/platform=macOS,name=Any Mac"
  112. -configuration ${config}
  113. -parallelizeTargets
  114. -hideShellScriptEnvironment
  115. build
  116. )
  117. pushd build_macos
  118. run_xcodebuild ${build_args}
  119. popd
  120. log_group "Installing ${product_name}..."
  121. cmake --install build_macos --config ${config} --prefix "${project_root}/release/${config}"
  122. popd
  123. log_group
  124. }
  125. build ${@}