authorgravatar for michael.dusan@gmail.comMichael Dusan <michael.dusan@gmail.com> 2021-03-18 18:25:17-04:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-03-20 22:50:51+01:00
loge35f325dd1b45c22a781a7b2074c49036d163a72
treec873a0ceffbfb77de0e138ed36ef2e86f250d34f
parentf6ba810f270540339e1dab222ff6264848f6ba03

azure: produce macos arm64 binaries

new pipeline `BuildMacOS_arm64` - `vmImage: 'macOS-10.15' ` new `macos_arm64_script` - switch from using `make` to `ninja` - select xcode 12.4 - set zig-cache env variables - build host-zig binary with xcode, link against llvm for x86_64 (target macos 10.15) - build arm64-zig binary with xcode and host-zig, link against llvm for arm64 (target macos 11.0) - ad-hoc codesign arm64 binary with linker - use host-zig for docgen - use host-zig for experimental std lib docs - sync final `release/` hierarchy with `linux_script` - use gnu-tar for good-practices (set owner, set sort) enhance `CMakeLists.txt` - do not build `zig0` when cross-compiling - disable `BYPRODUCTS` directive `zig1.o` to avoid `ninja` error see #8265

3 files changed, 153 insertions(+), 7 deletions(-)

CMakeLists.txt+8-7
...@@ -735,12 +735,14 @@ if(MSVC OR MINGW)...@@ -735,12 +735,14 @@ if(MSVC OR MINGW)
735 target_link_libraries(zigstage1 LINK_PUBLIC version)735 target_link_libraries(zigstage1 LINK_PUBLIC version)
736endif()736endif()
737737
738add_executable(zig0 ${ZIG0_SOURCES})738if("${ZIG_EXECUTABLE}" STREQUAL "")
739set_target_properties(zig0 PROPERTIES739 add_executable(zig0 ${ZIG0_SOURCES})
740 COMPILE_FLAGS ${EXE_CFLAGS}740 set_target_properties(zig0 PROPERTIES
741 LINK_FLAGS ${EXE_LDFLAGS}741 COMPILE_FLAGS ${EXE_CFLAGS}
742)742 LINK_FLAGS ${EXE_LDFLAGS}
743target_link_libraries(zig0 zigstage1)743 )
744 target_link_libraries(zig0 zigstage1)
745endif()
744746
745if(MSVC)747if(MSVC)
746 set(ZIG1_OBJECT "${CMAKE_BINARY_DIR}/zig1.obj")748 set(ZIG1_OBJECT "${CMAKE_BINARY_DIR}/zig1.obj")
...@@ -789,7 +791,6 @@ if("${ZIG_EXECUTABLE}" STREQUAL "")...@@ -789,7 +791,6 @@ if("${ZIG_EXECUTABLE}" STREQUAL "")
789else()791else()
790 add_custom_command(792 add_custom_command(
791 OUTPUT "${ZIG1_OBJECT}"793 OUTPUT "${ZIG1_OBJECT}"
792 BYPRODUCTS "${ZIG1_OBJECT}"
793 COMMAND "${ZIG_EXECUTABLE}" "build-obj" ${BUILD_ZIG1_ARGS}794 COMMAND "${ZIG_EXECUTABLE}" "build-obj" ${BUILD_ZIG1_ARGS}
794 DEPENDS ${ZIG_STAGE2_SOURCES}795 DEPENDS ${ZIG_STAGE2_SOURCES}
795 COMMENT STATUS "Building self-hosted component ${ZIG1_OBJECT}"796 COMMENT STATUS "Building self-hosted component ${ZIG1_OBJECT}"
ci/azure/macos_arm64_script created+132
...@@ -0,0 +1,132 @@
1#!/bin/sh
2
3set -x
4set -e
5
6brew install s3cmd ninja gnu-tar
7
8ZIGDIR="$(pwd)"
9ARCH="aarch64"
10# {product}-{os}{sdk_version}-{arch}-{llvm_version}-{cmake_build_type}
11CACHE_HOST_BASENAME="llvm-macos10.15-x86_64-11.0.1-release"
12CACHE_ARM64_BASENAME="llvm-macos11.0-arm64-11.0.1-release"
13PREFIX_HOST="$HOME/$CACHE_HOST_BASENAME"
14PREFIX_ARM64="$HOME/$CACHE_ARM64_BASENAME"
15JOBS="-j2"
16
17rm -rf $PREFIX
18cd $HOME
19wget -nv "https://ziglang.org/deps/$CACHE_HOST_BASENAME.tar.xz"
20wget -nv "https://ziglang.org/deps/$CACHE_ARM64_BASENAME.tar.xz"
21
22gtar xf "$CACHE_HOST_BASENAME.tar.xz"
23gtar xf "$CACHE_ARM64_BASENAME.tar.xz"
24
25cd $ZIGDIR
26
27# Make the `zig version` number consistent.
28# This will affect the cmake command below.
29git config core.abbrev 9
30git fetch --unshallow || true
31git fetch --tags
32
33# Select xcode: latest version found on vmImage macOS-10.15 .
34DEVELOPER_DIR=/Applications/Xcode_12.4.app
35
36export ZIG_LOCAL_CACHE_DIR="$ZIGDIR/zig-cache"
37export ZIG_GLOBAL_CACHE_DIR="$ZIGDIR/zig-cache"
38
39# Build zig for host and use `Debug` type to make builds a little faster.
40
41cd $ZIGDIR
42mkdir build.host
43cd build.host
44cmake -G "Ninja" .. \
45 -DCMAKE_INSTALL_PREFIX="$(pwd)/release" \
46 -DCMAKE_PREFIX_PATH="$PREFIX_HOST" \
47 -DCMAKE_BUILD_TYPE="Debug" \
48 -DZIG_STATIC="OFF"
49
50# Build but do not install.
51ninja $JOBS
52
53ZIG_EXE="$ZIGDIR/build.host/zig"
54
55# Build zig for arm64 target.
56# - use `Release` type for published tarballs
57# - ad-hoc codesign with linker
58# - note: apple quarantine of downloads (eg. via safari) still apply
59
60cd $ZIGDIR
61mkdir build.arm64
62cd build.arm64
63cmake -G "Ninja" .. \
64 -DCMAKE_INSTALL_PREFIX="$(pwd)/release" \
65 -DCMAKE_PREFIX_PATH="$PREFIX_ARM64" \
66 -DCMAKE_BUILD_TYPE="Release" \
67 -DCMAKE_CROSSCOMPILING="True" \
68 -DCMAKE_SYSTEM_NAME="Darwin" \
69 -DCMAKE_C_FLAGS="-arch arm64" \
70 -DCMAKE_CXX_FLAGS="-arch arm64" \
71 -DCMAKE_EXE_LINKER_FLAGS="-lz -Xlinker -adhoc_codesign" \
72 -DZIG_USE_LLVM_CONFIG="OFF" \
73 -DZIG_EXECUTABLE="$ZIG_EXE" \
74 -DZIG_TARGET_TRIPLE="${ARCH}-macos" \
75 -DZIG_STATIC="OFF"
76
77ninja $JOBS install
78
79# Disable test because binary is foreign arch.
80#release/bin/zig build test
81
82if [ "${BUILD_REASON}" != "PullRequest" ]; then
83 mv ../LICENSE release/
84
85 # We do not run test suite but still need langref.
86 mkdir -p release/docs
87 $ZIG_EXE run ../doc/docgen.zig -- $ZIG_EXE ../doc/langref.html.in release/docs/langref.html
88
89 # Produce the experimental std lib documentation.
90 mkdir -p release/docs/std
91 $ZIG_EXE test ../lib/std/std.zig \
92 --override-lib-dir ../lib \
93 -femit-docs=release/docs/std \
94 -fno-emit-bin
95
96 # Remove the unnecessary bin dir in $prefix/bin/zig
97 mv release/bin/zig release/
98 rmdir release/bin
99
100 # Remove the unnecessary zig dir in $prefix/lib/zig/std/std.zig
101 mv release/lib/zig release/lib2
102 rmdir release/lib
103 mv release/lib2 release/lib
104
105 VERSION=$($ZIG_EXE version)
106 DIRNAME="zig-macos-$ARCH-$VERSION"
107 TARBALL="$DIRNAME.tar.xz"
108 gtar cJf "$TARBALL" release/ --owner=root --sort=name --transform="s,^release,${DIRNAME},"
109 ln "$TARBALL" "$BUILD_ARTIFACTSTAGINGDIRECTORY/."
110
111 mv "$DOWNLOADSECUREFILE_SECUREFILEPATH" "$HOME/.s3cfg"
112 s3cmd put -P --add-header="cache-control: public, max-age=31536000, immutable" "$TARBALL" s3://ziglang.org/builds/
113
114 SHASUM=$(shasum -a 256 $TARBALL | cut '-d ' -f1)
115 BYTESIZE=$(wc -c < $TARBALL)
116
117 JSONFILE="macos-$GITBRANCH.json"
118 touch $JSONFILE
119 echo "{\"tarball\": \"$TARBALL\"," >>$JSONFILE
120 echo "\"shasum\": \"$SHASUM\"," >>$JSONFILE
121 echo "\"size\": \"$BYTESIZE\"}" >>$JSONFILE
122
123 s3cmd put -P --add-header="Cache-Control: max-age=0, must-revalidate" "$JSONFILE" "s3://ziglang.org/builds/$JSONFILE"
124 s3cmd put -P "$JSONFILE" "s3://ziglang.org/builds/$ARCH-macos-$VERSION.json"
125
126 # `set -x` causes these variables to be mangled.
127 # See https://developercommunity.visualstudio.com/content/problem/375679/pipeline-variable-incorrectly-inserts-single-quote.html
128 set +x
129 echo "##vso[task.setvariable variable=tarball;isOutput=true]$TARBALL"
130 echo "##vso[task.setvariable variable=shasum;isOutput=true]$SHASUM"
131 echo "##vso[task.setvariable variable=bytesize;isOutput=true]$BYTESIZE"
132fi
ci/azure/pipelines.yml+13
...@@ -12,6 +12,19 @@ jobs:...@@ -12,6 +12,19 @@ jobs:
12 - script: ci/azure/macos_script12 - script: ci/azure/macos_script
13 name: main13 name: main
14 displayName: 'Build and test'14 displayName: 'Build and test'
15- job: BuildMacOS_arm64
16 pool:
17 vmImage: 'macOS-10.15'
18
19 timeoutInMinutes: 60
20
21 steps:
22 - task: DownloadSecureFile@1
23 inputs:
24 secureFile: s3cfg
25 - script: ci/azure/macos_arm64_script
26 name: main
27 displayName: 'Build and cross-compile'
15- job: BuildLinux28- job: BuildLinux
16 pool:29 pool:
17 vmImage: 'ubuntu-18.04'30 vmImage: 'ubuntu-18.04'