Skip to content

Commit 63b6e44

Browse files
committed
esp/ci: Move newlib build to separate job
1 parent 986b71e commit 63b6e44

File tree

1 file changed

+180
-68
lines changed

1 file changed

+180
-68
lines changed

.gitlab-ci.yml

Lines changed: 180 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
stages:
22
- build
3+
- pack
34
- private_deploy
45
- test
56
- public_deploy
@@ -19,14 +20,16 @@ variables:
1920
BINUTILS_REF: "esp-2022r1-binutils"
2021
XTENSA_OVERLAYS_REPO: "xtensa-overlays"
2122
XTENSA_OVERLAYS_REF: "master"
22-
# TODO: update vars below to tags names after related branches are merged in those repos
23+
LLVM_GCC_TESTSUITE_REF: "release_universal_clang_toolchain"
24+
# TODO: update var below to tags names after related branches are merged in those repos
25+
# XTENSA_CLANG_TOOLCHAIN_REF: "release_universal_clang_toolchain"
2326
XTENSA_CLANG_TOOLCHAIN_REF: "build_macos_arm64"
24-
LLVM_GCC_TESTSUITE_REF: "feature/toolchain_build_script"
2527

2628
PLATFORM_NAME_LINUX_ARM64: "linux-arm64"
2729
PLATFORM_NAME_LINUX: "linux-amd64"
2830
PLATFORM_NAME_WIN: "win64"
2931
PLATFORM_NAME_MACOS: "macos"
32+
PLATFORM_NAME_MACOS_ARM64: "macos-arm64"
3033

3134
ARCHIVE_TOOL_LINUX: "tar -cJf"
3235
UNARCHIVE_TOOL_LINUX: "tar -xf"
@@ -40,6 +43,11 @@ variables:
4043
UNARCHIVE_TOOL_MACOS: "tar -xf"
4144
ARCHIVE_EXT_MACOS: "tar.xz"
4245

46+
ARCHIVE_TOOL_NEWLIB: ${ARCHIVE_TOOL_LINUX}
47+
UNARCHIVE_TOOL_NEWLIB: ${UNARCHIVE_TOOL_LINUX}
48+
ARCHIVE_EXT_NEWLIB: ${ARCHIVE_EXT_LINUX}
49+
50+
DIST_NEW_DIR: "_dist_new"
4351
DIST_DIR: "dist"
4452
BUILD_DIR: "_build"
4553
DOWNLOADS_DIR: "_downloads"
@@ -110,7 +118,19 @@ before_script:
110118
${ARCHIVE_TOOL} ${LIBS_ARCHIVE_NAME} esp-clang/lib/libclang* esp-clang/lib/clang/${CLANG_VER}/include
111119
mkdir -p ${DISTRO_DIR}
112120
mv ${LIBS_ARCHIVE_NAME} ${DISTRO_DIR}/
113-
echo "${LIBS_ARCHIVE_NAME}" > ${DISTRO_DIR}/file_lib${PLATFORM_NAME}
121+
echo "${LIBS_ARCHIVE_NAME}" > ${DISTRO_DIR}/file_libs-${PLATFORM_NAME}
122+
123+
.get_binutils: &get_binutils |
124+
git clone -b ${BINUTILS_REF} --single-branch ${GITLAB_SSH_SERVER}/idf/${BINUTILS_REPO}.git
125+
BINUTILS_PATH=$PWD/${BINUTILS_REPO}
126+
127+
.get_xtensa_overlays: &get_xtensa_overlays |
128+
git clone -b ${XTENSA_OVERLAYS_REF} --single-branch ${GITLAB_SSH_SERVER}/idf/${XTENSA_OVERLAYS_REPO}.git
129+
XTENSA_OVERLAYS_PATH=$PWD/${XTENSA_OVERLAYS_REPO}
130+
131+
.get_newlib: &get_newlib |
132+
git clone -b ${NEWLIB_REF} --single-branch ${GITLAB_SSH_SERVER}/idf/${NEWLIB_REPO}.git
133+
NEWLIB_PATH=$PWD/${NEWLIB_REPO}
114134

115135
.build_template:
116136
stage: build
@@ -119,77 +139,49 @@ before_script:
119139
artifacts:
120140
paths:
121141
- ${DIST_DIR}/
122-
- newlib/
123-
- ${BUILD_DIR}/clang_tests.log
124-
- ${BUILD_DIR}/clang_build.log
125-
- ${BUILD_DIR}/newlib_build.log
142+
- ${BUILD_DIR}/tests.log
143+
- ${BUILD_DIR}/build.log
126144
when: always
127-
expire_in: 3 day
145+
expire_in: 1 day
128146
variables:
129-
BUILD_TOOLCHAIN_CMD_ARGS: ""
147+
BUILD_TOOLCHAIN_CMD_EXTRA_ARGS: ""
130148
# use separate dist dir for universal toolchain
131149
# TODO: remove this var after switching to universal toolchain builds
132-
DIST_DIR: "dist_new"
150+
DIST_DIR: ${DIST_NEW_DIR}
133151
script:
134152
- *get_release_name
135153
- mkdir ${DOWNLOADS_DIR}
136154
- pushd ${DOWNLOADS_DIR}
137-
- export ESP_GCC_TOOLCHAIN_DIST_BASE=$PWD
155+
- ESP_GCC_TOOLCHAIN_DIST_BASE=$PWD
138156
- *get_gcc_toolchain
139-
- git clone -b ${BINUTILS_REF} --single-branch ${GITLAB_SSH_SERVER}/idf/${BINUTILS_REPO}.git
140-
- export BINUTILS_PATH=$PWD/${BINUTILS_REPO}
141-
- git clone -b ${XTENSA_OVERLAYS_REF} --single-branch ${GITLAB_SSH_SERVER}/idf/${XTENSA_OVERLAYS_REPO}.git
142-
- export XTENSA_OVERLAYS_PATH=$PWD/${XTENSA_OVERLAYS_REPO}
157+
- *get_binutils
158+
- *get_xtensa_overlays
143159
- popd
144160
- *get_clang_toolchain_build_scripts
145161
- *fix_origin_remote_for_public
146-
- export ESP_GCC_TOOLCHAIN_REL_VER=${GCC_REL_NAME}
147-
- export LLVM_PROJECT_PATH=$PWD
148-
- export BUILD_PATH=$PWD/${BUILD_DIR}
162+
- LLVM_PROJECT_PATH=$PWD
163+
- BUILD_PATH=$PWD/${BUILD_DIR}
149164
- mkdir -p ${BUILD_PATH}
150165
- export USE_PARALLEL_LINK_JOBS=2
151166
# build Clang toolchain w/o newlib
152167
- ${BUILD_TOOLCHAIN_CMD} --llvm-path=${LLVM_PROJECT_PATH}
153168
--gcc-toolchains-path=${ESP_GCC_TOOLCHAIN_DIST_BASE} --binutils-path=${BINUTILS_PATH}
154-
--xtensa-overlays-path=${XTENSA_OVERLAYS_PATH} --host=${CONF_HOST} ${BUILD_TOOLCHAIN_CMD_ARGS} ${BUILD_PATH} 2>&1 > ${BUILD_PATH}/clang_build.log
155-
# use just built Clang to build newlib
156-
- export PATH=${BUILD_PATH}/esp-clang/bin:$PATH
157-
- export BUILD_HOST=$(gcc -dumpmachine)
158-
- export NEWLIB_OVERLAY_DISTRO_PATH=$PWD/newlib;
159-
# build newlib overlay using ESP native (Linux) clang toolchain only
160-
# it will be re-used for cross-buit toolchains (win and mac).
161-
# FIXME: it would be good to move newlib overlay build to separate job and have job sequence like
162-
# clang_linux_wo_newlib -> newlib_overlay -> clang_linux_full(copy newlib) -> clang_linux_unittests
163-
# but we need full native (Linux) toolchain to run unittests and unittests need clang build dir.
164-
# clang build dir may occupy about 2GB, so it looks too heavy to pass it as artifact
165-
- if [ "${CONF_HOST}" == "${BUILD_HOST}" ]; then
166-
export BUILD_NEWLIB_PATH=${BUILD_PATH}/newlib;
167-
mkdir -p ${NEWLIB_OVERLAY_DISTRO_PATH};
168-
git clone -b ${NEWLIB_REF} --single-branch ${GITLAB_SSH_SERVER}/idf/${NEWLIB_REPO}.git;
169-
export NEWLIB_PATH=$PWD/${NEWLIB_REPO};
170-
./build-toolchain.sh --newlib-path=${NEWLIB_PATH} --xtensa-overlays-path=${XTENSA_OVERLAYS_PATH} ${BUILD_NEWLIB_PATH} 2>&1 > ${BUILD_PATH}/newlib_build.log;
171-
pushd ${BUILD_NEWLIB_PATH};
172-
${ARCHIVE_TOOL_LINUX} ${NEWLIB_OVERLAY_DISTRO_PATH}/esp-clang-newlib-overlay.${ARCHIVE_EXT_LINUX} esp-clang/;
173-
popd;
174-
fi
175-
- ${UNARCHIVE_TOOL_LINUX} ${NEWLIB_OVERLAY_DISTRO_PATH}/esp-clang-newlib-overlay.${ARCHIVE_EXT_LINUX} -C ${BUILD_PATH}
176-
# strip binutils afer newlib is built
177-
- STRIP_BINUTILS=YES ./build-toolchain.sh --host=${CONF_HOST} ${BUILD_PATH}
178-
# Run unit tests for native build only.
169+
--xtensa-overlays-path=${XTENSA_OVERLAYS_PATH} --host=${CONF_HOST} ${BUILD_TOOLCHAIN_CMD_EXTRA_ARGS} ${BUILD_PATH} 2>&1 > ${BUILD_PATH}/build.log
170+
- BUILD_HOST=$(gcc -dumpmachine)
171+
# Do not run unit tests for cross-builds.
179172
# Run as non-root user because permission tests fail when run by root.
180173
- if [ "${CONF_HOST}" == "${BUILD_HOST}" ]; then
181174
export LLVM_BUILD_PATH=${LLVM_PROJECT_PATH}/llvm/build-Release-${CONF_HOST};
182-
echo "Run unit tests for native build ib ${LLVM_BUILD_PATH}";
175+
echo "Run unit tests for native build in ${LLVM_BUILD_PATH}";
183176
useradd -m test_runner;
184177
chown -R test_runner ${LLVM_BUILD_PATH};
185-
touch ${BUILD_PATH}/clang_tests.log;
186-
chmod o+w ${BUILD_PATH}/clang_tests.log;
187-
runuser -l test_runner -c 'cmake --build '${LLVM_BUILD_PATH}' --target check-all 2>&1 > '${BUILD_PATH}'/clang_tests.log';
178+
touch ${BUILD_PATH}/tests.log;
179+
chmod o+w ${BUILD_PATH}/tests.log;
180+
runuser -l test_runner -c 'cmake --build '${LLVM_BUILD_PATH}' --target check-all 2>&1 > '${BUILD_PATH}'/tests.log';
188181
fi
189182
- export DISTRO_DIR=$PWD/$DIST_DIR
190183
- pushd ${BUILD_PATH}
191184
- *package_toolchain
192-
- *package_libs
193185
- popd
194186

195187
build_x86_64-linux-gnu:
@@ -202,75 +194,195 @@ build_x86_64-linux-gnu:
202194
ARCHIVE_EXT: "${ARCHIVE_EXT_LINUX}"
203195
BUILD_TOOLCHAIN_CMD: "./build-toolchain.sh"
204196

205-
.build_x86_64-w64-mingw32:
197+
build_x86_64-w64-mingw32:
206198
extends: .build_template
207199
needs:
200+
# needs native toolchain and newlib from this job
208201
- job: build_x86_64-linux-gnu
209202
before_script:
210203
- *use_ci_tools
211204
- *add_gitlab_key
212205
# get ARCHIVE_NAME for Linux release. Modify vars to make get_release_name working properly
213-
- export PLATFORM_NAME_ORIG=${PLATFORM_NAME}
214-
- export ARCHIVE_EXT_ORIG=${ARCHIVE_EXT}
215-
- export PLATFORM_NAME=${PLATFORM_NAME_LINUX}
216-
- export ARCHIVE_EXT=${ARCHIVE_EXT_LINUX}
217-
- *get_release_name
218-
# restore modified vars
219-
- export PLATFORM_NAME=${PLATFORM_NAME_ORIG}
220-
- export ARCHIVE_EXT=${ARCHIVE_EXT_ORIG}
221-
# unpack Linux release to re-use it as native Clang for Windows build
206+
- CLANG_LINUX_ARCHIVE=$(cat ${DIST_DIR}/file_${PLATFORM_NAME_LINUX})
207+
# unpack x86_64-linux-gnu toolchain to re-use it as native Clang for Windows build
222208
- mkdir -p esp-clang-${PLATFORM_NAME_LINUX}
223-
- ${UNARCHIVE_TOOL_LINUX} ${DIST_DIR}/${ARCHIVE_NAME} -C esp-clang-${PLATFORM_NAME_LINUX}
209+
- ${UNARCHIVE_TOOL_LINUX} ${DIST_DIR}/${CLANG_LINUX_ARCHIVE} -C esp-clang-${PLATFORM_NAME_LINUX}
224210
# we do not want to keep artifacts from 'x86_64-linux-gnu' job
225211
- rm -rf ${DIST_DIR}
226212
- rm -rf ${BUILD_DIR}
227213
# add build command args speciifc for Windows build
228-
- export BUILD_TOOLCHAIN_CMD_ARGS="--native-esp-clang-path=$PWD/esp-clang-${PLATFORM_NAME_LINUX}"
214+
- export BUILD_TOOLCHAIN_CMD_EXTRA_ARGS="--native-esp-clang-path=$PWD/esp-clang-${PLATFORM_NAME_LINUX}"
229215
variables:
230216
CONF_HOST: "x86_64-w64-mingw32"
231217
PLATFORM_NAME: "${PLATFORM_NAME_WIN}"
232-
ARCHIVE_TOOL: "${ARCHIVE_TOOL_WIN}"
218+
# Use Linux compressor to minimize artifact size.
219+
# Toolchain is not fully stripped yet, so may exceed max artifact size.
220+
ARCHIVE_TOOL: "${ARCHIVE_TOOL_LINUX}"
233221
UNARCHIVE_TOOL: "${UNARCHIVE_TOOL_WIN}"
234222
ARCHIVE_EXT: "${ARCHIVE_EXT_WIN}"
235223
BUILD_TOOLCHAIN_CMD: "./build-toolchain-win.sh"
236224

237225
.build_apple-darwin_template:
238226
extends: .build_template
239-
needs:
240-
- job: build_x86_64-linux-gnu
241227
variables:
242-
PLATFORM_NAME: "${PLATFORM_NAME_MACOS}"
243228
ARCHIVE_TOOL: "${ARCHIVE_TOOL_MACOS}"
244229
UNARCHIVE_TOOL: "${UNARCHIVE_TOOL_MACOS}"
245230
ARCHIVE_EXT: "${ARCHIVE_EXT_MACOS}"
246-
GCC_ARCHIVE_EXT: "${GCC_ARCHIVE_EXT_MACOS}"
247231

248232
build_x86_64-apple-darwin:
249233
extends: .build_apple-darwin_template
250234
variables:
251235
CONF_HOST: "x86_64-apple-darwin21.1"
236+
PLATFORM_NAME: "${PLATFORM_NAME_MACOS}"
252237
BUILD_TOOLCHAIN_CMD: "./build-toolchain-macos.sh --host-arch=x86_64"
253238

254239
build_aarch64-apple-darwin:
255240
extends: .build_apple-darwin_template
256241
variables:
257242
CONF_HOST: "aarch64-apple-darwin21.1"
243+
PLATFORM_NAME: "${PLATFORM_NAME_MACOS_ARM64}"
258244
BUILD_TOOLCHAIN_CMD: "./build-toolchain-macos.sh --host-arch=aarch64"
259245

260-
.test_x86_64-linux-gnu:
261-
stage: test
246+
build_newlib:
247+
stage: build
248+
tags: [ "amd64", "build" ]
249+
needs:
250+
# needs native toolchainfrom this job
251+
- job: build_x86_64-linux-gnu
252+
artifacts:
253+
paths:
254+
- ${DIST_DIR}/
255+
- ${BUILD_DIR}/build.log
256+
when: always
257+
expire_in: 1 day
258+
variables:
259+
PLATFORM_NAME: "${PLATFORM_NAME_LINUX}"
260+
ARCHIVE_TOOL: "${ARCHIVE_TOOL_LINUX}"
261+
UNARCHIVE_TOOL: "${UNARCHIVE_TOOL_LINUX}"
262+
ARCHIVE_EXT: "${ARCHIVE_EXT_LINUX}"
263+
# use separate dist dir for universal toolchain
264+
# TODO: remove this var after switching to universal toolchain builds
265+
DIST_DIR: ${DIST_NEW_DIR}
266+
script:
267+
# get ARCHIVE_NAME for Linux release.
268+
- CLANG_ARCHIVE=$PWD/${DIST_DIR}/$(cat ${DIST_DIR}/file_${PLATFORM_NAME_LINUX})
269+
- mkdir -p ${DOWNLOADS_DIR}
270+
- pushd ${DOWNLOADS_DIR}
271+
- *get_xtensa_overlays
272+
- *get_newlib
273+
# unpack clang
274+
- ${UNARCHIVE_TOOL} ${CLANG_ARCHIVE}
275+
- export PATH=$PWD/esp-clang/bin:$PATH
276+
- popd
277+
- rm -rf $PWD/${DIST_DIR}
278+
- *get_clang_toolchain_build_scripts
279+
# build newlib overlay using ESP native (Linux) clang toolchain only
280+
# it will be re-used for cross-buit toolchains (win and mac).
281+
- NEWLIB_OVERLAY_DISTRO_PATH=$PWD/${DIST_DIR}
282+
- mkdir -p ${NEWLIB_OVERLAY_DISTRO_PATH}
283+
- BUILD_PATH=$PWD/${BUILD_DIR}
284+
- mkdir -p ${BUILD_PATH}
285+
- ./build-toolchain.sh --newlib-path=${NEWLIB_PATH} --xtensa-overlays-path=${XTENSA_OVERLAYS_PATH} ${BUILD_PATH} 2>&1 > ${BUILD_PATH}/build.log
286+
- pushd ${BUILD_PATH}
287+
- ${ARCHIVE_TOOL_NEWLIB} ${NEWLIB_OVERLAY_DISTRO_PATH}/esp-clang-newlib-overlay.${ARCHIVE_EXT_NEWLIB} esp-clang/
288+
- popd
289+
290+
.pack_template:
291+
stage: pack
262292
tags: [ "amd64", "build" ]
263293
allow_failure: true
294+
artifacts:
295+
paths:
296+
- ${DIST_DIR}/
297+
when: always
298+
expire_in: 3 day
299+
variables:
300+
# use separate dist dir for universal toolchain
301+
# TODO: remove this var after switching to universal toolchain builds
302+
DIST_DIR: ${DIST_NEW_DIR}
303+
script:
304+
- *get_release_name
305+
- export BUILD_PATH=$PWD/${BUILD_DIR}
306+
- mkdir -p ${BUILD_PATH}
307+
# unpack clang
308+
- ${UNARCHIVE_TOOL} ${DIST_DIR}/${ARCHIVE_NAME} -C ${BUILD_PATH}
309+
# unpack newlib
310+
- ${UNARCHIVE_TOOL_NEWLIB} ${DIST_DIR}/esp-clang-newlib-overlay.${ARCHIVE_EXT_NEWLIB} -C ${BUILD_PATH}
311+
- rm -rf ${DIST_DIR}
312+
- *get_clang_toolchain_build_scripts
313+
# strip binutils afer newlib is built
314+
- STRIP_BINUTILS=YES ./build-toolchain.sh --host=${CONF_HOST} ${BUILD_PATH}
315+
- DISTRO_DIR=$PWD/${DIST_DIR}
316+
- pushd ${BUILD_PATH}
317+
- *package_toolchain
318+
- *package_libs
319+
- popd
320+
321+
pack_x86_64-linux-gnu:
322+
extends: .pack_template
264323
needs:
265324
- job: build_x86_64-linux-gnu
325+
- job: build_newlib
326+
variables:
327+
CONF_HOST: "x86_64-linux-gnu"
328+
PLATFORM_NAME: "${PLATFORM_NAME_LINUX}"
329+
ARCHIVE_TOOL: "${ARCHIVE_TOOL_LINUX}"
330+
UNARCHIVE_TOOL: "${UNARCHIVE_TOOL_LINUX}"
331+
ARCHIVE_EXT: "${ARCHIVE_EXT_LINUX}"
332+
333+
pack_x86_64-w64-mingw32:
334+
extends: .pack_template
335+
needs:
336+
- job: build_x86_64-w64-mingw32
337+
- job: build_newlib
338+
variables:
339+
CONF_HOST: "x86_64-w64-mingw32"
340+
PLATFORM_NAME: "${PLATFORM_NAME_WIN}"
341+
# use Linux compressor to save space.
342+
# upon release archive will be re-packed into zip format for uploading to GH
343+
ARCHIVE_TOOL: "${ARCHIVE_TOOL_LINUX}"
344+
UNARCHIVE_TOOL: "${UNARCHIVE_TOOL_LINUX}"
345+
ARCHIVE_EXT: "${ARCHIVE_EXT_WIN}"
346+
347+
.pack_apple-darwin_template:
348+
extends: .pack_template
349+
variables:
350+
ARCHIVE_TOOL: "${ARCHIVE_TOOL_MACOS}"
351+
UNARCHIVE_TOOL: "${UNARCHIVE_TOOL_MACOS}"
352+
ARCHIVE_EXT: "${ARCHIVE_EXT_MACOS}"
353+
354+
pack_x86_64-apple-darwin:
355+
extends: .pack_apple-darwin_template
356+
needs:
357+
- job: build_x86_64-apple-darwin
358+
- job: build_newlib
359+
variables:
360+
CONF_HOST: "x86_64-apple-darwin21.1"
361+
PLATFORM_NAME: "${PLATFORM_NAME_MACOS}"
362+
363+
pack_aarch64-apple-darwin:
364+
extends: .pack_apple-darwin_template
365+
needs:
366+
- job: build_aarch64-apple-darwin
367+
- job: build_newlib
368+
variables:
369+
CONF_HOST: "aarch64-apple-darwin21.1"
370+
PLATFORM_NAME: "${PLATFORM_NAME_MACOS_ARM64}"
371+
372+
test_x86_64-linux-gnu:
373+
stage: test
374+
tags: [ "amd64", "build" ]
375+
allow_failure: true
376+
needs:
377+
- job: pack_x86_64-linux-gnu
266378
variables:
267379
PLATFORM_NAME: "${PLATFORM_NAME_LINUX}"
268380
ARCHIVE_TOOL: "${ARCHIVE_TOOL_LINUX}"
269381
UNARCHIVE_TOOL: "${UNARCHIVE_TOOL_LINUX}"
270382
ARCHIVE_EXT: "${ARCHIVE_EXT_LINUX}"
271383
# use separate dist dir for universal toolchain
272384
# TODO: remove this var after switching to universal toolchain builds
273-
DIST_DIR: "dist_new"
385+
DIST_DIR: ${DIST_NEW_DIR}
274386
script:
275387
- *get_release_name
276388
- ${UNARCHIVE_TOOL} ${DIST_DIR}/${ARCHIVE_NAME}

0 commit comments

Comments
 (0)