authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-19 22:06:15-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-28 17:07:21-07:00
log56129d26ebd8c54563e92a78b9dab20f69dbc646
tree47aaa1a38db6e91a8ab864927284f8f71ff56498
parent5bb8c03697fce798a966feb131f6d906863047ae

cmake: build stage3 by default

This is a simplification of the cmake build script which introduces a new "stage3" target that is built by default, which builds and installs a stage3 zig. It greatly simplifies the build instructions for Zig, making it conform to the regular cmake routine, while still producing a stage3 artifact.

4 files changed, 81 insertions(+), 148 deletions(-)

CMakeLists.txt+67-67
......@@ -12,7 +12,7 @@ if(NOT CMAKE_BUILD_TYPE)
1212endif()
1313
1414if(NOT CMAKE_INSTALL_PREFIX)
15 set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/stage2" CACHE STRING
15 set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/stage3" CACHE STRING
1616 "Directory to install zig to" FORCE)
1717endif()
1818
......@@ -65,6 +65,9 @@ if("${ZIG_VERSION}" STREQUAL "")
6565endif()
6666message(STATUS "Configuring zig version ${ZIG_VERSION}")
6767
68set(ZIG_SKIP_INSTALL_LIB_FILES off CACHE BOOL
69 "Disable copying lib/ files to install prefix during the build phase")
70
6871set(ZIG_STATIC off CACHE BOOL "Attempt to build a static zig executable (not compatible with glibc)")
6972set(ZIG_SHARED_LLVM off CACHE BOOL "Prefer linking against shared LLVM libraries")
7073set(ZIG_STATIC_LLVM off CACHE BOOL "Prefer linking against static LLVM libraries")
......@@ -333,7 +336,7 @@ set(ZIG_CONFIG_H_OUT "${CMAKE_BINARY_DIR}/config.h")
333336set(ZIG_CONFIG_ZIG_OUT "${CMAKE_BINARY_DIR}/config.zig")
334337
335338# This is our shim which will be replaced by stage1.zig.
336set(ZIG0_SOURCES
339set(ZIG1_SOURCES
337340 "${CMAKE_SOURCE_DIR}/src/stage1/zig0.cpp"
338341)
339342
......@@ -373,9 +376,9 @@ set(ZIG_CPP_SOURCES
373376 # https://github.com/ziglang/zig/issues/6363
374377 "${CMAKE_SOURCE_DIR}/src/windows_sdk.cpp"
375378)
376# Needed because we use cmake, not the zig build system, to build zig1.o.
379# Needed because we use cmake, not the zig build system, to build zig2.o.
377380# This list is generated by building zig and then clearing the zig-cache directory,
378# then manually running the build-obj command (see BUILD_ZIG1_ARGS), and then looking
381# then manually running the build-obj command (see BUILD_ZIG2_ARGS), and then looking
379382# in the zig-cache directory for the compiler-generated list of zig file dependencies.
380383set(ZIG_STAGE2_SOURCES
381384 "${ZIG_CONFIG_ZIG_OUT}"
......@@ -942,40 +945,47 @@ if(MSVC OR MINGW)
942945endif()
943946
944947if("${ZIG_EXECUTABLE}" STREQUAL "")
945 add_executable(zig0 ${ZIG0_SOURCES})
946 set_target_properties(zig0 PROPERTIES
948 add_executable(zig1 ${ZIG1_SOURCES})
949 set_target_properties(zig1 PROPERTIES
947950 COMPILE_FLAGS ${EXE_CFLAGS}
948951 LINK_FLAGS ${EXE_LDFLAGS}
949952 )
950 target_link_libraries(zig0 zigstage1)
953 target_link_libraries(zig1 zigstage1)
951954endif()
952955
953956if(MSVC)
954 set(ZIG1_OBJECT "${CMAKE_BINARY_DIR}/zig1.obj")
957 set(ZIG2_OBJECT "${CMAKE_BINARY_DIR}/zig2.obj")
955958else()
956 set(ZIG1_OBJECT "${CMAKE_BINARY_DIR}/zig1.o")
959 set(ZIG2_OBJECT "${CMAKE_BINARY_DIR}/zig2.o")
957960endif()
958961if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
959 set(ZIG1_RELEASE_ARG "")
962 set(ZIG_RELEASE_ARG "")
963else()
964 set(ZIG_RELEASE_ARG -Drelease)
965endif()
966if(ZIG_SKIP_INSTALL_LIB_FILES)
967 set(ZIG_SKIP_INSTALL_LIB_FILES_ARG "-Dskip-install-lib-files")
960968else()
961 set(ZIG1_RELEASE_ARG -OReleaseFast --strip)
969 set(ZIG_SKIP_INSTALL_LIB_FILES_ARG "-Dskip-install-lib-files=false")
962970endif()
963971if(ZIG_SINGLE_THREADED)
964 set(ZIG1_SINGLE_THREADED_ARG "-fsingle-threaded")
972 set(ZIG_SINGLE_THREADED_ARG "-fsingle-threaded")
965973else()
966 set(ZIG1_SINGLE_THREADED_ARG "")
974 set(ZIG_SINGLE_THREADED_ARG "")
975endif()
976if(ZIG_STATIC)
977 set(ZIG_STATIC_ARG "-Duse-zig-libcxx")
978else()
979 set(ZIG_STATIC_ARG "")
967980endif()
968981
969set(BUILD_ZIG1_ARGS
982set(BUILD_ZIG2_ARGS
970983 "src/stage1.zig"
971 -target "${ZIG_TARGET_TRIPLE}"
972 "-mcpu=${ZIG_TARGET_MCPU}"
973 --name zig1
984 --name zig2
974985 --zig-lib-dir "${CMAKE_SOURCE_DIR}/lib"
975 "-femit-bin=${ZIG1_OBJECT}"
986 "-femit-bin=${ZIG2_OBJECT}"
976987 -fcompiler-rt
977 "${ZIG1_RELEASE_ARG}"
978 "${ZIG1_SINGLE_THREADED_ARG}"
988 "${ZIG_SINGLE_THREADED_ARG}"
979989 -lc
980990 --pkg-begin build_options "${ZIG_CONFIG_ZIG_OUT}"
981991 --pkg-end
......@@ -985,68 +995,58 @@ set(BUILD_ZIG1_ARGS
985995
986996if("${ZIG_EXECUTABLE}" STREQUAL "")
987997 add_custom_command(
988 OUTPUT "${ZIG1_OBJECT}"
989 COMMAND zig0 ${BUILD_ZIG1_ARGS}
990 DEPENDS zig0 "${ZIG_STAGE2_SOURCES}"
991 COMMENT STATUS "Building self-hosted component ${ZIG1_OBJECT}"
992 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
998 OUTPUT "${ZIG2_OBJECT}"
999 COMMAND zig1 ${BUILD_ZIG2_ARGS}
1000 DEPENDS zig1 "${ZIG_STAGE2_SOURCES}"
1001 COMMENT STATUS "Building stage2 object ${ZIG2_OBJECT}"
1002 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
9931003 )
994 set(ZIG_EXECUTABLE "${zig_BINARY_DIR}/zig")
9951004 if (WIN32)
996 set(ZIG_EXECUTABLE "${ZIG_EXECUTABLE}.exe")
1005 set(ZIG_EXECUTABLE "${zig2_BINARY_DIR}/zig2.exe")
1006 else()
1007 set(ZIG_EXECUTABLE "${zig2_BINARY_DIR}/zig2")
9971008 endif()
9981009else()
9991010 add_custom_command(
1000 OUTPUT "${ZIG1_OBJECT}"
1001 COMMAND "${ZIG_EXECUTABLE}" "build-obj" ${BUILD_ZIG1_ARGS}
1002 DEPENDS ${ZIG_STAGE2_SOURCES}
1003 COMMENT STATUS "Building self-hosted component ${ZIG1_OBJECT}"
1004 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
1011 OUTPUT "${ZIG2_OBJECT}"
1012 COMMAND "${ZIG_EXECUTABLE}" "build-obj" ${BUILD_ZIG2_ARGS}
1013 DEPENDS ${ZIG_STAGE2_SOURCES}
1014 COMMENT STATUS "Building stage2 component ${ZIG2_OBJECT}"
1015 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
10051016 )
10061017endif()
10071018
10081019# cmake won't let us configure an executable without C sources.
1009add_executable(zig "${CMAKE_SOURCE_DIR}/src/stage1/empty.cpp" "${ZIG1_OBJECT}")
1020add_executable(zig2 "${CMAKE_SOURCE_DIR}/src/stage1/empty.cpp" "${ZIG2_OBJECT}")
10101021
1011set_target_properties(zig PROPERTIES
1022set_target_properties(zig2 PROPERTIES
10121023 COMPILE_FLAGS ${EXE_CFLAGS}
10131024 LINK_FLAGS ${EXE_LDFLAGS}
10141025)
1015target_link_libraries(zig zigstage1)
1026target_link_libraries(zig2 zigstage1)
10161027if(MSVC)
1017 target_link_libraries(zig ntdll.lib)
1028 target_link_libraries(zig2 ntdll.lib)
10181029elseif(MINGW)
1019 target_link_libraries(zig ntdll)
1030 target_link_libraries(zig2 ntdll)
10201031endif()
10211032
1022install(TARGETS zig DESTINATION bin)
1023
1024set(ZIG_SKIP_INSTALL_LIB_FILES off CACHE BOOL
1025 "Disable copying lib/ files to install prefix during the build phase")
1026
1027if(NOT ZIG_SKIP_INSTALL_LIB_FILES)
1028 set(ZIG_INSTALL_ARGS "build"
1029 --zig-lib-dir "${CMAKE_SOURCE_DIR}/lib"
1030 "-Dlib-files-only"
1031 --prefix "${CMAKE_INSTALL_PREFIX}"
1032 "-Dconfig_h=${ZIG_CONFIG_H_OUT}"
1033 install
1034 )
1033set(ZIG_INSTALL_ARGS "build"
1034 --zig-lib-dir "${CMAKE_SOURCE_DIR}/lib"
1035 --prefix "${CMAKE_INSTALL_PREFIX}"
1036 "-Dconfig_h=${ZIG_CONFIG_H_OUT}"
1037 "-Denable-llvm"
1038 "-Denable-stage1"
1039 "${ZIG_RELEASE_ARG}"
1040 "${ZIG_STATIC_ARG}"
1041 "${ZIG_SKIP_INSTALL_LIB_FILES_ARG}"
1042 "${ZIG_SINGLE_THREADED_ARG}"
1043 "-Dtarget=${ZIG_TARGET_TRIPLE}"
1044 "-Dcpu=${ZIG_TARGET_MCPU}"
1045)
10351046
1036 # CODE has no effect with Visual Studio build system generator, therefore
1037 # when using Visual Studio build system generator we resort to running
1038 # `zig build install` during the build phase.
1039 if(MSVC)
1040 add_custom_target(zig_install_lib_files ALL
1041 COMMAND zig ${ZIG_INSTALL_ARGS}
1042 DEPENDS zig
1043 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
1044 )
1045 else()
1046 get_target_property(zig_BINARY_DIR zig BINARY_DIR)
1047 install(CODE "set(zig_EXE \"${ZIG_EXECUTABLE}\")")
1048 install(CODE "set(ZIG_INSTALL_ARGS \"${ZIG_INSTALL_ARGS}\")")
1049 install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
1050 install(SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install.cmake)
1051 endif()
1052endif()
1047add_custom_target(stage3 ALL
1048 COMMAND zig2 ${ZIG_INSTALL_ARGS}
1049 DEPENDS zig2
1050 COMMENT STATUS "Building stage3"
1051 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
1052)
ci/zinc/linux_test_stage3_debug.sh+9-14
......@@ -20,12 +20,11 @@ export CXX="$OLD_ZIG c++ -target $TARGET -mcpu=$MCPU"
2020mkdir build-debug
2121cd build-debug
2222cmake .. \
23 -DCMAKE_INSTALL_PREFIX="$DEBUG_STAGING" \
23 -DCMAKE_INSTALL_PREFIX="$(pwd)/stage3" \
2424 -DCMAKE_PREFIX_PATH="$DEPS_LOCAL" \
2525 -DCMAKE_BUILD_TYPE=Debug \
26 -DZIG_TARGET_TRIPLE="$TARGET" \
27 -DZIG_TARGET_MCPU="$MCPU" \
2826 -DZIG_STATIC=ON \
27 -DZIG_USE_LLVM_CONFIG=OFF \
2928 -GNinja
3029
3130# Now cmake will use zig as the C/C++ compiler. We reset the environment variables
......@@ -35,21 +34,17 @@ unset CXX
3534
3635ninja install
3736
38cd $WORKSPACE
39
40"$DEBUG_STAGING/bin/zig" build -p stage3 -Denable-stage1 -Dstatic-llvm -Dtarget=native-native-musl --search-prefix "$DEPS_LOCAL"
41
42# simultaneously test building self-hosted without LLVM and with 32-bit arm
43stage3/bin/zig build -Dtarget=arm-linux-musleabihf
44
4537echo "Looking for non-conforming code formatting..."
46stage3/bin/zig fmt --check . \
47 --exclude test/cases/ \
48 --exclude build-debug \
49 --exclude build-release \
38stage3/bin/zig fmt --check .. \
39 --exclude ../test/cases/ \
40 --exclude ../build-debug \
41 --exclude ../build-release \
5042 --exclude "$ZIG_LOCAL_CACHE_DIR" \
5143 --exclude "$ZIG_GLOBAL_CACHE_DIR"
5244
45# simultaneously test building self-hosted without LLVM and with 32-bit arm
46stage3/bin/zig build -Dtarget=arm-linux-musleabihf
47
5348stage3/bin/zig build test \
5449 -fqemu \
5550 -fwasmtime \
ci/zinc/linux_test_stage3_release.sh+5-30
......@@ -13,9 +13,8 @@ export CXX="$OLD_ZIG c++ -target $TARGET -mcpu=$MCPU"
1313
1414mkdir build-release
1515cd build-release
16STAGE2_PREFIX="$(pwd)/stage2"
1716cmake .. \
18 -DCMAKE_INSTALL_PREFIX="$STAGE2_PREFIX" \
17 -DCMAKE_INSTALL_PREFIX="$RELEASE_STAGING" \
1918 -DCMAKE_PREFIX_PATH="$DEPS_LOCAL" \
2019 -DCMAKE_BUILD_TYPE=Release \
2120 -DZIG_TARGET_TRIPLE="$TARGET" \
......@@ -30,31 +29,7 @@ unset CXX
3029
3130ninja install
3231
33# Here we rebuild zig but this time using the Zig binary we just now produced to
34# build zig1.o rather than relying on the one built with stage0. See
35# https://github.com/ziglang/zig/issues/6830 for more details.
36cmake .. -DZIG_EXECUTABLE="$STAGE2_PREFIX/bin/zig"
37ninja install
38
39# This is the binary we will distribute. We intentionally test this one in this
40# script. If any test failures occur, hopefully they also occur in the debug
41# version of this script for easier troubleshooting. This prevents distribution
42# of a Zig binary that passes tests in debug mode but has a miscompilation in
43# release mode.
44"$STAGE2_PREFIX/bin/zig" build \
45 --prefix "$RELEASE_STAGING" \
46 --search-prefix "$DEPS_LOCAL" \
47 -Dstatic-llvm \
48 -Drelease \
49 -Dstrip \
50 -Dtarget="$TARGET" \
51 -Denable-stage1
52
53cd $WORKSPACE
54
55ZIG="$RELEASE_STAGING/bin/zig"
56
57$ZIG build test docs \
32"$RELEASE_STAGING/bin/zig" build test docs \
5833 -fqemu \
5934 -fwasmtime \
6035 -Dstatic-llvm \
......@@ -63,13 +38,13 @@ $ZIG build test docs \
6338
6439# Produce the experimental std lib documentation.
6540mkdir -p "$RELEASE_STAGING/docs/std"
66$ZIG test lib/std/std.zig \
41"$RELEASE_STAGING/bin/zig" test ../lib/std/std.zig \
6742 --zig-lib-dir lib \
6843 -femit-docs=$RELEASE_STAGING/docs/std \
6944 -fno-emit-bin
7045
71cp LICENSE $RELEASE_STAGING/
72cp zig-cache/langref.html $RELEASE_STAGING/docs/
46cp ../LICENSE $RELEASE_STAGING/
47cp ../zig-cache/langref.html $RELEASE_STAGING/docs/
7348
7449# Look for HTML errors.
7550tidy --drop-empty-elements no -qe $RELEASE_STAGING/docs/langref.html
cmake/install.cmake deleted-37
......@@ -1,37 +0,0 @@
1message("-- Installing: ${CMAKE_INSTALL_PREFIX}/lib")
2
3if(NOT EXISTS ${zig_EXE})
4 message("::")
5 message(":: ERROR: Executable not found")
6 message(":: (execute_process)")
7 message("::")
8 message(":: executable: ${zig_EXE}")
9 message("::")
10 message(FATAL_ERROR)
11endif()
12
13execute_process(COMMAND ${zig_EXE} ${ZIG_INSTALL_ARGS}
14 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
15 RESULT_VARIABLE _result
16)
17if(_result)
18 message("::")
19 message(":: ERROR: ${_result}")
20 message(":: (execute_process)")
21
22 string(REPLACE ";" " " s_INSTALL_LIBSTAGE2_ARGS "${ZIG_INSTALL_ARGS}")
23 message("::")
24 message(":: argv: ${zig_EXE} ${s_INSTALL_LIBSTAGE2_ARGS}")
25
26 set(_args ${zig_EXE} ${ZIG_INSTALL_ARGS})
27 list(LENGTH _args _len)
28 math(EXPR _len "${_len} - 1")
29 message("::")
30 foreach(_i RANGE 0 ${_len})
31 list(GET _args ${_i} _arg)
32 message(":: argv[${_i}]: ${_arg}")
33 endforeach()
34
35 message("::")
36 message(FATAL_ERROR)
37endif()