master
  1cmake_minimum_required(VERSION 3.15)
  2
  3if(NOT CMAKE_BUILD_TYPE)
  4    set(CMAKE_BUILD_TYPE "Debug" CACHE STRING
  5        "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
  6endif()
  7
  8if(NOT CMAKE_INSTALL_PREFIX)
  9    set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/stage3" CACHE PATH
 10      "Directory to install zig to" FORCE)
 11endif()
 12
 13# CMake recognizes the CMAKE_PREFIX_PATH environment variable for some things,
 14# and also the CMAKE_PREFIX_PATH cache variable for other things. However, it
 15# does not relate these two things, i.e. if the environment variable is set,
 16# CMake does not populate the cache variable in a corresponding manner. Some
 17# package systems, such as Homebrew, set the environment variable but not the
 18# cache variable. Furthermore, the environment variable follows the system path
 19# separator, such as ':' on POSIX and ';' on Windows, but the cache variable
 20# follows CMake's array behavior, i.e. always ';' for a separator.
 21list(APPEND ZIG_CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}")
 22if(WIN32)
 23  list(APPEND ZIG_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
 24else()
 25  string(REGEX REPLACE ":" ";" ZIG_CMAKE_PREFIX_PATH_STRING "$ENV{CMAKE_PREFIX_PATH}")
 26  list(APPEND ZIG_CMAKE_PREFIX_PATH "${ZIG_CMAKE_PREFIX_PATH_STRING}")
 27endif()
 28
 29list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 30
 31project(zig
 32  DESCRIPTION
 33    "Zig is a general-purpose programming language and toolchain for maintaining robust, optimal and reusable software"
 34  HOMEPAGE_URL
 35    "https://ziglang.org"
 36  LANGUAGES
 37    C CXX
 38)
 39
 40set(ZIG_VERSION_MAJOR 0)
 41set(ZIG_VERSION_MINOR 16)
 42set(ZIG_VERSION_PATCH 0)
 43set(ZIG_VERSION "" CACHE STRING "Override Zig version string. Default is to find out with git.")
 44
 45if("${ZIG_VERSION}" STREQUAL "")
 46    set(RESOLVED_ZIG_VERSION "${ZIG_VERSION_MAJOR}.${ZIG_VERSION_MINOR}.${ZIG_VERSION_PATCH}")
 47    find_program(GIT_EXE NAMES git NAMES_PER_DIR)
 48    if(GIT_EXE AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
 49        execute_process(
 50            COMMAND ${GIT_EXE} -C "${PROJECT_SOURCE_DIR}" describe --match *.*.* --tags --abbrev=9
 51            RESULT_VARIABLE EXIT_STATUS
 52            OUTPUT_VARIABLE GIT_DESCRIBE
 53            OUTPUT_STRIP_TRAILING_WHITESPACE
 54            ERROR_QUIET)
 55        if(EXIT_STATUS EQUAL "0")
 56            set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/.git/HEAD")
 57            if(GIT_DESCRIBE MATCHES "^v?([0-9]+\\.[0-9]+\\.[0-9]+)$")
 58                # Tagged release version.
 59                set(GIT_TAG ${CMAKE_MATCH_1})
 60                if(NOT GIT_TAG VERSION_EQUAL RESOLVED_ZIG_VERSION)
 61                    message(SEND_ERROR "Zig version (${RESOLVED_ZIG_VERSION}) does not match Git tag (${GIT_TAG}).")
 62                endif()
 63            elseif(GIT_DESCRIBE MATCHES "^v?([0-9]+\\.[0-9]+\\.[0-9]+)-([0-9]+)-g(.+)$")
 64                # Untagged pre-release. The Zig version is updated to include the number of commits
 65                # since the last tagged version and the commit hash. The version is formatted in
 66                # accordance with the https://semver.org specification.
 67                set(GIT_TAG ${CMAKE_MATCH_1})
 68                set(GIT_COMMITS_AFTER_TAG ${CMAKE_MATCH_2})
 69                set(GIT_COMMIT ${CMAKE_MATCH_3})
 70                if(NOT RESOLVED_ZIG_VERSION VERSION_GREATER GIT_TAG)
 71                    message(SEND_ERROR "Zig version (${RESOLVED_ZIG_VERSION}) must be greater than tagged ancestor (${GIT_TAG}).")
 72                endif()
 73                set(RESOLVED_ZIG_VERSION "${RESOLVED_ZIG_VERSION}-dev.${GIT_COMMITS_AFTER_TAG}+${GIT_COMMIT}")
 74            else()
 75                message(WARNING "Failed to parse version from output of `git describe`.")
 76            endif()
 77        endif()
 78    endif()
 79else()
 80    set(RESOLVED_ZIG_VERSION "${ZIG_VERSION}")
 81endif()
 82message(STATUS "Configuring zig version ${RESOLVED_ZIG_VERSION}")
 83
 84set(ZIG_NO_LIB off CACHE BOOL
 85    "Disable copying lib/ files to install prefix during the build phase")
 86
 87set(ZIG_STATIC off CACHE BOOL "Attempt to build a static zig executable (not compatible with glibc)")
 88set(ZIG_SHARED_LLVM off CACHE BOOL "Prefer linking against shared LLVM libraries")
 89set(ZIG_STATIC_LLVM ${ZIG_STATIC} CACHE BOOL "Prefer linking against static LLVM libraries")
 90set(ZIG_STATIC_ZLIB ${ZIG_STATIC} CACHE BOOL "Prefer linking against static zlib")
 91set(ZIG_STATIC_ZSTD ${ZIG_STATIC} CACHE BOOL "Prefer linking against static zstd")
 92set(ZIG_STATIC_CURSES OFF CACHE BOOL "Enable static linking against curses")
 93set(ZIG_STATIC_LIBXML2 OFF CACHE BOOL "Enable static linking against libxml2")
 94
 95if (ZIG_SHARED_LLVM AND ZIG_STATIC_LLVM)
 96    message(SEND_ERROR "-DZIG_SHARED_LLVM and -DZIG_STATIC_LLVM cannot both be enabled simultaneously")
 97endif()
 98
 99set(ZIG_TARGET_TRIPLE "native" CACHE STRING "arch-os-abi to output binaries for")
100set(ZIG_TARGET_MCPU "native" CACHE STRING "-mcpu parameter to output binaries for")
101set(ZIG_TARGET_DYNAMIC_LINKER "" CACHE STRING
102  "Override the dynamic linker used by the Zig binary. Default is to auto-detect the dynamic linker.")
103set(ZIG_SINGLE_THREADED off CACHE BOOL "limit the zig compiler to use only 1 thread")
104set(ZIG_AR_WORKAROUND off CACHE BOOL "append 'ar' subcommand to CMAKE_AR")
105
106if("${ZIG_TARGET_TRIPLE}" STREQUAL "native")
107    set(ZIG_USE_LLVM_CONFIG ON CACHE BOOL "use llvm-config to find LLVM libraries")
108else()
109    set(ZIG_USE_LLVM_CONFIG OFF CACHE BOOL "use llvm-config to find LLVM libraries")
110endif()
111
112if(ZIG_AR_WORKAROUND)
113  string(REPLACE "<CMAKE_AR>" "<CMAKE_AR> ar" CMAKE_C_ARCHIVE_CREATE ${CMAKE_C_ARCHIVE_CREATE})
114  string(REPLACE "<CMAKE_AR>" "<CMAKE_AR> ar" CMAKE_CXX_ARCHIVE_CREATE ${CMAKE_CXX_ARCHIVE_CREATE})
115endif()
116
117
118option(ZIG_PIE "Produce a position independent zig executable" ${CMAKE_POSITION_INDEPENDENT_CODE})
119include(CheckPIESupported)
120check_pie_supported(
121  OUTPUT_VARIABLE ZIG_PIE_SUPPORTED_BY_CMAKE
122  LANGUAGES C CXX
123)
124if(ZIG_PIE AND NOT CMAKE_CXX_LINK_PIE_SUPPORTED)
125  message(SEND_ERROR "ZIG_PIE was requested but CMake does not support it for \"zigcpp\" target: ${ZIG_PIE_SUPPORTED_BY_CMAKE}")
126endif()
127
128
129# Detect system libcxx name.
130if ("c++" IN_LIST CMAKE_CXX_IMPLICIT_LINK_LIBRARIES)
131    set(ZIG_SYSTEM_LIBCXX "c++" CACHE STRING "system libcxx name for build.zig")
132else()
133    set(ZIG_SYSTEM_LIBCXX "stdc++" CACHE STRING "system libcxx name for build.zig")
134endif()
135
136find_package(llvm 21)
137find_package(clang 21)
138find_package(lld 21)
139
140if(ZIG_STATIC_ZLIB)
141    if (MSVC)
142        list(REMOVE_ITEM LLVM_LIBRARIES "z.lib")
143    else()
144        list(REMOVE_ITEM LLVM_LIBRARIES "-lz")
145    endif()
146
147    find_library(ZLIB NAMES libz.a libzlibstatic.a z zlib libz NAMES_PER_DIR)
148    list(APPEND LLVM_LIBRARIES "${ZLIB}")
149endif()
150
151if(ZIG_STATIC_ZSTD)
152    if (MSVC)
153        list(REMOVE_ITEM LLVM_LIBRARIES "zstd.lib")
154    else()
155        list(REMOVE_ITEM LLVM_LIBRARIES "-lzstd")
156    endif()
157
158    find_library(ZSTD NAMES libzstd.a libzstdstatic.a zstd NAMES_PER_DIR)
159    list(APPEND LLVM_LIBRARIES "${ZSTD}")
160endif()
161
162if (MSVC)
163    if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
164        if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
165            # avoid linking to the debug versions of ucrt by default
166            # as they are not redistributable.
167            set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
168        endif()
169    endif()
170endif ()
171
172if(ZIG_STATIC_CURSES)
173    list(REMOVE_ITEM LLVM_LIBRARIES "-lcurses")
174    find_library(CURSES NAMES libcurses.a libncurses.a NAMES_PER_DIR
175      PATHS
176        /usr/local/opt/ncurses/lib
177        /opt/homebrew/opt/ncurses/lib)
178    list(APPEND LLVM_LIBRARIES "${CURSES}")
179endif()
180
181if(ZIG_STATIC_LIBXML2)
182    list(REMOVE_ITEM LLVM_LIBRARIES "-lxml2")
183    find_library(LIBXML2 NAMES libxml2.a NAMES_PER_DIR)
184    list(APPEND LLVM_LIBRARIES "${LIBXML2}")
185endif()
186
187find_package(Threads)
188
189set(ZIG_CONFIG_H_OUT "${PROJECT_BINARY_DIR}/config.h")
190set(ZIG_CONFIG_ZIG_OUT "${PROJECT_BINARY_DIR}/config.zig")
191
192set(ZIG_WASM2C_SOURCES
193    stage1/wasm2c.c
194)
195# Sync with "zig_cpp_sources" in build.zig
196set(ZIG_CPP_SOURCES
197    # These are planned to stay even when we are self-hosted.
198    src/zig_llvm.cpp
199    src/zig_llvm-ar.cpp
200    src/zig_clang_driver.cpp
201    src/zig_clang_cc1_main.cpp
202    src/zig_clang_cc1as_main.cpp
203)
204# Needed because we use cmake, not the zig build system, to build zig2.o.
205set(ZIG_STAGE2_SOURCES
206    "${ZIG_CONFIG_ZIG_OUT}"
207    lib/compiler_rt.zig
208    lib/compiler_rt/absv.zig
209    lib/compiler_rt/absvdi2.zig
210    lib/compiler_rt/absvsi2.zig
211    lib/compiler_rt/absvti2.zig
212    lib/compiler_rt/adddf3.zig
213    lib/compiler_rt/addf3.zig
214    lib/compiler_rt/addsf3.zig
215    lib/compiler_rt/addtf3.zig
216    lib/compiler_rt/addvsi3.zig
217    lib/compiler_rt/addvdi3.zig
218    lib/compiler_rt/addxf3.zig
219    lib/compiler_rt/arm.zig
220    lib/compiler_rt/atomics.zig
221    lib/compiler_rt/aulldiv.zig
222    lib/compiler_rt/aullrem.zig
223    lib/compiler_rt/bswap.zig
224    lib/compiler_rt/ceil.zig
225    lib/compiler_rt/clear_cache.zig
226    lib/compiler_rt/cmp.zig
227    lib/compiler_rt/cmpdf2.zig
228    lib/compiler_rt/cmpsf2.zig
229    lib/compiler_rt/cmptf2.zig
230    lib/compiler_rt/cmpxf2.zig
231    lib/compiler_rt/common.zig
232    lib/compiler_rt/comparef.zig
233    lib/compiler_rt/cos.zig
234    lib/compiler_rt/count0bits.zig
235    lib/compiler_rt/divdf3.zig
236    lib/compiler_rt/divsf3.zig
237    lib/compiler_rt/divtf3.zig
238    lib/compiler_rt/divti3.zig
239    lib/compiler_rt/divxf3.zig
240    lib/compiler_rt/emutls.zig
241    lib/compiler_rt/exp.zig
242    lib/compiler_rt/exp2.zig
243    lib/compiler_rt/extenddftf2.zig
244    lib/compiler_rt/extenddfxf2.zig
245    lib/compiler_rt/extendf.zig
246    lib/compiler_rt/extendhfsf2.zig
247    lib/compiler_rt/extendhftf2.zig
248    lib/compiler_rt/extendhfxf2.zig
249    lib/compiler_rt/extendsfdf2.zig
250    lib/compiler_rt/extendsftf2.zig
251    lib/compiler_rt/extendsfxf2.zig
252    lib/compiler_rt/extendxftf2.zig
253    lib/compiler_rt/fabs.zig
254    lib/compiler_rt/fixdfdi.zig
255    lib/compiler_rt/fixdfsi.zig
256    lib/compiler_rt/fixdfti.zig
257    lib/compiler_rt/fixhfdi.zig
258    lib/compiler_rt/fixhfsi.zig
259    lib/compiler_rt/fixhfti.zig
260    lib/compiler_rt/fixsfdi.zig
261    lib/compiler_rt/fixsfsi.zig
262    lib/compiler_rt/fixsfti.zig
263    lib/compiler_rt/fixtfdi.zig
264    lib/compiler_rt/fixtfsi.zig
265    lib/compiler_rt/fixtfti.zig
266    lib/compiler_rt/fixunsdfdi.zig
267    lib/compiler_rt/fixunsdfsi.zig
268    lib/compiler_rt/fixunsdfti.zig
269    lib/compiler_rt/fixunshfdi.zig
270    lib/compiler_rt/fixunshfsi.zig
271    lib/compiler_rt/fixunshfti.zig
272    lib/compiler_rt/fixunssfdi.zig
273    lib/compiler_rt/fixunssfsi.zig
274    lib/compiler_rt/fixunssfti.zig
275    lib/compiler_rt/fixunstfdi.zig
276    lib/compiler_rt/fixunstfsi.zig
277    lib/compiler_rt/fixunstfti.zig
278    lib/compiler_rt/fixunsxfdi.zig
279    lib/compiler_rt/fixunsxfsi.zig
280    lib/compiler_rt/fixunsxfti.zig
281    lib/compiler_rt/fixxfdi.zig
282    lib/compiler_rt/fixxfsi.zig
283    lib/compiler_rt/fixxfti.zig
284    lib/compiler_rt/float_from_int.zig
285    lib/compiler_rt/floatdidf.zig
286    lib/compiler_rt/floatdihf.zig
287    lib/compiler_rt/floatdisf.zig
288    lib/compiler_rt/floatditf.zig
289    lib/compiler_rt/floatdixf.zig
290    lib/compiler_rt/floatsidf.zig
291    lib/compiler_rt/floatsihf.zig
292    lib/compiler_rt/floatsisf.zig
293    lib/compiler_rt/floatsitf.zig
294    lib/compiler_rt/floatsixf.zig
295    lib/compiler_rt/floattidf.zig
296    lib/compiler_rt/floattihf.zig
297    lib/compiler_rt/floattisf.zig
298    lib/compiler_rt/floattitf.zig
299    lib/compiler_rt/floattixf.zig
300    lib/compiler_rt/floatundidf.zig
301    lib/compiler_rt/floatundihf.zig
302    lib/compiler_rt/floatundisf.zig
303    lib/compiler_rt/floatunditf.zig
304    lib/compiler_rt/floatundixf.zig
305    lib/compiler_rt/floatunsidf.zig
306    lib/compiler_rt/floatunsihf.zig
307    lib/compiler_rt/floatunsisf.zig
308    lib/compiler_rt/floatunsitf.zig
309    lib/compiler_rt/floatunsixf.zig
310    lib/compiler_rt/floatuntidf.zig
311    lib/compiler_rt/floatuntihf.zig
312    lib/compiler_rt/floatuntisf.zig
313    lib/compiler_rt/floatuntitf.zig
314    lib/compiler_rt/floatuntixf.zig
315    lib/compiler_rt/floor.zig
316    lib/compiler_rt/fma.zig
317    lib/compiler_rt/fmax.zig
318    lib/compiler_rt/fmin.zig
319    lib/compiler_rt/fmod.zig
320    lib/compiler_rt/gedf2.zig
321    lib/compiler_rt/gesf2.zig
322    lib/compiler_rt/getf2.zig
323    lib/compiler_rt/gexf2.zig
324    lib/compiler_rt/int.zig
325    lib/compiler_rt/int_from_float.zig
326    lib/compiler_rt/log.zig
327    lib/compiler_rt/log10.zig
328    lib/compiler_rt/log2.zig
329    lib/compiler_rt/modti3.zig
330    lib/compiler_rt/mulXi3.zig
331    lib/compiler_rt/muldf3.zig
332    lib/compiler_rt/mulf3.zig
333    lib/compiler_rt/mulo.zig
334    lib/compiler_rt/mulsf3.zig
335    lib/compiler_rt/multf3.zig
336    lib/compiler_rt/mulvsi3.zig
337    lib/compiler_rt/mulxf3.zig
338    lib/compiler_rt/negXi2.zig
339    lib/compiler_rt/negdf2.zig
340    lib/compiler_rt/negsf2.zig
341    lib/compiler_rt/negtf2.zig
342    lib/compiler_rt/negv.zig
343    lib/compiler_rt/negxf2.zig
344    lib/compiler_rt/os_version_check.zig
345    lib/compiler_rt/parity.zig
346    lib/compiler_rt/popcount.zig
347    lib/compiler_rt/rem_pio2.zig
348    lib/compiler_rt/rem_pio2_large.zig
349    lib/compiler_rt/rem_pio2f.zig
350    lib/compiler_rt/round.zig
351    lib/compiler_rt/shift.zig
352    lib/compiler_rt/sin.zig
353    lib/compiler_rt/sincos.zig
354    lib/compiler_rt/sqrt.zig
355    lib/compiler_rt/stack_probe.zig
356    lib/compiler_rt/subdf3.zig
357    lib/compiler_rt/subsf3.zig
358    lib/compiler_rt/subtf3.zig
359    lib/compiler_rt/subvdi3.zig
360    lib/compiler_rt/subvsi3.zig
361    lib/compiler_rt/subxf3.zig
362    lib/compiler_rt/tan.zig
363    lib/compiler_rt/trig.zig
364    lib/compiler_rt/trunc.zig
365    lib/compiler_rt/truncdfhf2.zig
366    lib/compiler_rt/truncdfsf2.zig
367    lib/compiler_rt/truncf.zig
368    lib/compiler_rt/truncsfhf2.zig
369    lib/compiler_rt/trunctfdf2.zig
370    lib/compiler_rt/trunctfhf2.zig
371    lib/compiler_rt/trunctfsf2.zig
372    lib/compiler_rt/trunctfxf2.zig
373    lib/compiler_rt/truncxfdf2.zig
374    lib/compiler_rt/truncxfhf2.zig
375    lib/compiler_rt/truncxfsf2.zig
376    lib/compiler_rt/udivmod.zig
377    lib/compiler_rt/udivmodei4.zig
378    lib/compiler_rt/udivmodti4.zig
379    lib/compiler_rt/udivti3.zig
380    lib/compiler_rt/umodti3.zig
381    lib/compiler_rt/unorddf2.zig
382    lib/compiler_rt/unordsf2.zig
383    lib/compiler_rt/unordtf2.zig
384    lib/std/BitStack.zig
385    lib/std/Build.zig
386    lib/std/Build/Cache.zig
387    lib/std/Build/Cache/DepTokenizer.zig
388    lib/std/Io.zig
389    lib/std/Io/Reader.zig
390    lib/std/Io/Writer.zig
391    lib/std/Progress.zig
392    lib/std/Random.zig
393    lib/std/Target.zig
394    lib/std/Target/Query.zig
395    lib/std/Target/aarch64.zig
396    lib/std/Target/amdgcn.zig
397    lib/std/Target/arm.zig
398    lib/std/Target/avr.zig
399    lib/std/Target/bpf.zig
400    lib/std/Target/hexagon.zig
401    lib/std/Target/loongarch.zig
402    lib/std/Target/mips.zig
403    lib/std/Target/msp430.zig
404    lib/std/Target/nvptx.zig
405    lib/std/Target/powerpc.zig
406    lib/std/Target/riscv.zig
407    lib/std/Target/s390x.zig
408    lib/std/Target/sparc.zig
409    lib/std/Target/wasm.zig
410    lib/std/Target/x86.zig
411    lib/std/Thread.zig
412    lib/std/Thread/Futex.zig
413    lib/std/Thread/Mutex.zig
414    lib/std/Thread/Pool.zig
415    lib/std/Thread/WaitGroup.zig
416    lib/std/array_hash_map.zig
417    lib/std/array_list.zig
418    lib/std/ascii.zig
419    lib/std/atomic.zig
420    lib/std/base64.zig
421    lib/std/buf_map.zig
422    lib/std/builtin.zig
423    lib/std/c.zig
424    lib/std/coff.zig
425    lib/std/crypto.zig
426    lib/std/crypto/blake3.zig
427    lib/std/crypto/siphash.zig
428    lib/std/debug.zig
429    lib/std/dwarf.zig
430    lib/std/dwarf/AT.zig
431    lib/std/dwarf/ATE.zig
432    lib/std/dwarf/FORM.zig
433    lib/std/dwarf/LANG.zig
434    lib/std/dwarf/OP.zig
435    lib/std/dwarf/TAG.zig
436    lib/std/elf.zig
437    lib/std/fmt.zig
438    lib/std/fmt/parse_float.zig
439    lib/std/fs.zig
440    lib/std/fs/AtomicFile.zig
441    lib/std/fs/Dir.zig
442    lib/std/fs/File.zig
443    lib/std/fs/get_app_data_dir.zig
444    lib/std/fs/path.zig
445    lib/std/hash.zig
446    lib/std/hash/auto_hash.zig
447    lib/std/hash/wyhash.zig
448    lib/std/hash_map.zig
449    lib/std/heap.zig
450    lib/std/heap/arena_allocator.zig
451    lib/std/json.zig
452    lib/std/leb128.zig
453    lib/std/log.zig
454    lib/std/macho.zig
455    lib/std/math.zig
456    lib/std/math/big.zig
457    lib/std/math/big/int.zig
458    lib/std/math/float.zig
459    lib/std/math/frexp.zig
460    lib/std/math/isinf.zig
461    lib/std/math/isnan.zig
462    lib/std/math/log.zig
463    lib/std/math/log10.zig
464    lib/std/math/log2.zig
465    lib/std/math/signbit.zig
466    lib/std/math/sqrt.zig
467    lib/std/mem.zig
468    lib/std/mem/Allocator.zig
469    lib/std/meta.zig
470    lib/std/meta/trailer_flags.zig
471    lib/std/multi_array_list.zig
472    lib/std/os.zig
473    lib/std/os/linux.zig
474    lib/std/os/linux.zig
475    lib/std/os/linux/IoUring.zig
476    lib/std/os/linux/io_uring_sqe.zig
477    lib/std/os/linux/x86_64.zig
478    lib/std/os/linux/x86_64.zig
479    lib/std/os/windows.zig
480    lib/std/os/windows/ntstatus.zig
481    lib/std/os/windows/win32error.zig
482    lib/std/pdb.zig
483    lib/std/process.zig
484    lib/std/process/Child.zig
485    lib/std/sort.zig
486    lib/std/start.zig
487    lib/std/static_string_map.zig
488    lib/std/std.zig
489    lib/std/time.zig
490    lib/std/treap.zig
491    lib/std/unicode.zig
492    lib/std/zig.zig
493    lib/std/zig/Ast.zig
494    lib/std/zig/Ast/Render.zig
495    lib/std/zig/AstGen.zig
496    lib/std/zig/AstRlAnnotate.zig
497    lib/std/zig/LibCInstallation.zig
498    lib/std/zig/Parse.zig
499    lib/std/zig/Server.zig
500    lib/std/zig/WindowsSdk.zig
501    lib/std/zig/Zir.zig
502    lib/std/zig/string_literal.zig
503    lib/std/zig/system.zig
504    lib/std/zig/system/NativePaths.zig
505    lib/std/zig/system/x86.zig
506    lib/std/zig/tokenizer.zig
507    lib/std/zig/llvm.zig
508    lib/std/zig/llvm/BitcodeReader.zig
509    lib/std/zig/llvm/Builder.zig
510    lib/std/zig/llvm/bitcode_writer.zig
511    lib/std/zig/llvm/ir.zig
512    src/Air.zig
513    src/Air/Legalize.zig
514    src/Air/Liveness.zig
515    src/Air/Liveness/Verify.zig
516    src/Air/print.zig
517    src/Air/types_resolved.zig
518    src/Builtin.zig
519    src/Compilation.zig
520    src/Compilation/Config.zig
521    src/DarwinPosixSpawn.zig
522    src/InternPool.zig
523    src/Package.zig
524    src/Package/Fetch.zig
525    src/Package/Fetch/git.zig
526    src/Package/Manifest.zig
527    src/Package/Module.zig
528    src/RangeSet.zig
529    src/Sema.zig
530    src/Sema/bitcast.zig
531    src/Sema/comptime_ptr_access.zig
532    src/Type.zig
533    src/Value.zig
534    src/Zcu.zig
535    src/Zcu/PerThread.zig
536    src/clang_options.zig
537    src/clang_options_data.zig
538    src/codegen.zig
539    src/codegen/aarch64.zig
540    src/codegen/aarch64/abi.zig
541    src/codegen/aarch64/Assemble.zig
542    src/codegen/aarch64/Disassemble.zig
543    src/codegen/aarch64/encoding.zig
544    src/codegen/aarch64/instructions.zon
545    src/codegen/aarch64/Mir.zig
546    src/codegen/aarch64/Select.zig
547    src/codegen/c.zig
548    src/codegen/c/Type.zig
549    src/codegen/llvm.zig
550    src/codegen/llvm/bindings.zig
551    src/crash_report.zig
552    src/dev.zig
553    src/libs/freebsd.zig
554    src/libs/glibc.zig
555    src/libs/netbsd.zig
556    src/introspect.zig
557    src/libs/libcxx.zig
558    src/libs/libtsan.zig
559    src/libs/libunwind.zig
560    src/link.zig
561    src/link/C.zig
562    src/link/Coff.zig
563    src/link/Dwarf.zig
564    src/link/Elf.zig
565    src/link/Elf/Archive.zig
566    src/link/Elf/Atom.zig
567    src/link/Elf/AtomList.zig
568    src/link/Elf/LinkerDefined.zig
569    src/link/Elf/Merge.zig
570    src/link/Elf/Object.zig
571    src/link/Elf/SharedObject.zig
572    src/link/Elf/Symbol.zig
573    src/link/Elf/Thunk.zig
574    src/link/Elf/ZigObject.zig
575    src/link/Elf/eh_frame.zig
576    src/link/Elf/file.zig
577    src/link/Elf/gc.zig
578    src/link/Elf/relocatable.zig
579    src/link/Elf/relocation.zig
580    src/link/Elf/synthetic_sections.zig
581    src/link/Elf2.zig
582    src/link/LdScript.zig
583    src/link/Lld.zig
584    src/link/MachO.zig
585    src/link/MachO/Archive.zig
586    src/link/MachO/Atom.zig
587    src/link/MachO/CodeSignature.zig
588    src/link/MachO/DebugSymbols.zig
589    src/link/MachO/Dwarf.zig
590    src/link/MachO/Dylib.zig
591    src/link/MachO/InternalObject.zig
592    src/link/MachO/Object.zig
593    src/link/MachO/Relocation.zig
594    src/link/MachO/Symbol.zig
595    src/link/MachO/UnwindInfo.zig
596    src/link/MachO/ZigObject.zig
597    src/link/MachO/dead_strip.zig
598    src/link/MachO/dyld_info/Rebase.zig
599    src/link/MachO/dyld_info/Trie.zig
600    src/link/MachO/dyld_info/bind.zig
601    src/link/MachO/eh_frame.zig
602    src/link/MachO/fat.zig
603    src/link/MachO/file.zig
604    src/link/MachO/hasher.zig
605    src/link/MachO/load_commands.zig
606    src/link/MachO/relocatable.zig
607    src/link/MachO/synthetic.zig
608    src/link/MachO/Thunk.zig
609    src/link/MachO/uuid.zig
610    src/link/MappedFile.zig
611    src/link/Queue.zig
612    src/link/StringTable.zig
613    src/link/Wasm.zig
614    src/link/Wasm/Archive.zig
615    src/link/Wasm/Flush.zig
616    src/link/Wasm/Object.zig
617    src/link/aarch64.zig
618    src/link/riscv.zig
619    src/link/table_section.zig
620    src/link/tapi.zig
621    src/link/tapi/Tokenizer.zig
622    src/link/tapi/parse.zig
623    src/link/tapi/parse/test.zig
624    src/link/tapi/yaml.zig
625    src/link/tapi/yaml/test.zig
626    src/main.zig
627    src/libs/mingw.zig
628    src/libs/musl.zig
629    src/mutable_value.zig
630    src/print_env.zig
631    src/print_targets.zig
632    src/print_value.zig
633    src/print_zir.zig
634    src/register_manager.zig
635    src/target.zig
636    src/tracy.zig
637    src/libs/wasi_libc.zig
638)
639
640if(MSVC)
641    set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
642    if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
643        set(ZIG_DIA_GUIDS_LIB "${MSVC_DIA_SDK_DIR}/lib/amd64/diaguids.lib")
644        string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_DIA_GUIDS_LIB_ESCAPED "${ZIG_DIA_GUIDS_LIB}")
645    endif()
646
647    # The /RTC[c][s][u] flag enables extra runtime checks. ("/RTC1" == "/RTCsu")
648    # The "c" (PossibleDataLoss) and "u" (UninitializeVariable) flags trap on valid C code so we disable
649    # them.  The "s" flag seems like it might be OK.
650    string(REPLACE "/RTC1" "/RTCs" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
651    string(REPLACE "/RTC1" "/RTCs" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
652endif()
653
654configure_file (
655    stage1/config.h.in
656    "${ZIG_CONFIG_H_OUT}"
657)
658configure_file (
659    stage1/config.zig.in
660    "${ZIG_CONFIG_ZIG_OUT}"
661)
662
663# zigcpp target
664
665set(ZIGCPP_OUTPUT_DIR "${PROJECT_BINARY_DIR}/zigcpp")
666
667add_library(zigcpp STATIC ${ZIG_CPP_SOURCES})
668
669# Sync with minimum C++ standard required to build LLVM
670# and with "exe_cflags" in build.zig
671target_compile_features(zigcpp PRIVATE cxx_std_17)
672set_target_properties(zigcpp PROPERTIES POSITION_INDEPENDENT_CODE ${ZIG_PIE})
673
674if(LLVM_LINK_MODE STREQUAL "static")
675  target_compile_definitions(zigcpp PRIVATE
676    LLVM_BUILD_STATIC
677    CLANG_BUILD_STATIC
678  )
679endif()
680
681if(NOT MSVC)
682  if(MINGW)
683    target_compile_options(zigcpp PRIVATE -Wno-format)
684  endif()
685  # Sync content below with "exe_cflags" in build.zig
686  target_compile_definitions(zigcpp PUBLIC
687    __STDC_CONSTANT_MACROS
688    __STDC_FORMAT_MACROS
689    __STDC_LIMIT_MACROS
690
691    _GNU_SOURCE
692  )
693  target_compile_options(zigcpp PRIVATE
694    -fno-exceptions
695    -fno-rtti
696    -fno-stack-protector
697
698    -fvisibility-inlines-hidden
699
700    -Wno-type-limits
701    -Wno-missing-braces
702    -Wno-comment
703  )
704else()
705target_compile_options(zigcpp PRIVATE /Zc:preprocessor)
706set_property(TARGET zigcpp PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded")
707endif()
708
709target_include_directories(zigcpp PUBLIC
710    ${CLANG_INCLUDE_DIRS}
711    ${LLVM_INCLUDE_DIRS}
712    ${LLD_INCLUDE_DIRS}
713)
714target_link_libraries(zigcpp PUBLIC
715    ${CLANG_LIBRARIES}
716    ${LLD_LIBRARIES}
717    ${LLVM_LIBRARIES}
718    ${CMAKE_THREAD_LIBS_INIT}
719)
720
721# Handle multi-config builds and place each into a common lib. The VS generator
722# for example will append a Debug folder by default if not explicitly specified.
723set_target_properties(zigcpp PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ZIGCPP_OUTPUT_DIR})
724foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
725    string(TOUPPER ${CONFIG_TYPE} CONFIG_TYPE)
726    set_target_properties(zigcpp PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_TYPE} ${ZIGCPP_OUTPUT_DIR})
727endforeach()
728
729# end of zigcpp target
730
731include(CheckSymbolExists)
732
733string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" ZIG_HOST_TARGET_OS)
734if(ZIG_HOST_TARGET_OS STREQUAL "android")
735  set(ZIG_HOST_TARGET_OS "linux")
736  set(ZIG_HOST_TARGET_IS_ANDROID TRUE)
737elseif(ZIG_HOST_TARGET_OS STREQUAL "darwin")
738  set(ZIG_HOST_TARGET_OS "macos")
739elseif(ZIG_HOST_TARGET_OS STREQUAL "gnu")
740  set(ZIG_HOST_TARGET_OS "hurd")
741elseif(ZIG_HOST_TARGET_OS STREQUAL "serenityos")
742  set(ZIG_HOST_TARGET_OS "serenity")
743elseif(ZIG_HOST_TARGET_OS STREQUAL "sunos")
744  set(ZIG_HOST_TARGET_OS "illumos")
745endif()
746
747string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" ZIG_HOST_TARGET_ARCH)
748if(ZIG_HOST_TARGET_ARCH MATCHES "^i[3-9]86$")
749  if (ZIG_HOST_TARGET_OS STREQUAL "illumos")
750    set(ZIG_HOST_TARGET_ARCH "x86_64")
751  else()
752    set(ZIG_HOST_TARGET_ARCH "x86")
753  endif()
754elseif(ZIG_HOST_TARGET_ARCH STREQUAL "amd64")
755  set(ZIG_HOST_TARGET_ARCH "x86_64")
756elseif(ZIG_HOST_TARGET_ARCH STREQUAL "arm64")
757  set(ZIG_HOST_TARGET_ARCH "aarch64")
758elseif(ZIG_HOST_TARGET_ARCH MATCHES "^arm(el)?$" OR ZIG_HOST_TARGET_ARCH MATCHES "^armv[7-8]l$")
759  set(ZIG_HOST_TARGET_ARCH "arm")
760elseif(ZIG_HOST_TARGET_ARCH STREQUAL "armeb" OR ZIG_HOST_TARGET_ARCH MATCHES "^armv[7-8]b$")
761  set(ZIG_HOST_TARGET_ARCH "armeb")
762endif()
763if(ZIG_HOST_TARGET_ARCH MATCHES "^arm(eb)?$")
764  check_symbol_exists(__thumb__ "" ZIG_HOST_TARGET_DEFAULTS_TO_THUMB)
765  if(ZIG_HOST_TARGET_DEFAULTS_TO_THUMB)
766    string(REGEX REPLACE "^arm" "thumb" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}")
767  endif()
768endif()
769string(REGEX REPLACE "^ppc((64)?(le)?)$" "powerpc\\1" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}")
770
771set(ZIG_HOST_TARGET_ABI "")
772if(MSVC)
773  set(ZIG_HOST_TARGET_ABI "-msvc")
774elseif(MINGW)
775  set(ZIG_HOST_TARGET_ABI "-gnu")
776elseif(ZIG_HOST_TARGET_IS_ANDROID)
777  if(ZIG_HOST_TARGET_ARCH STREQUAL "arm")
778    set(ZIG_HOST_TARGET_ABI "-androideabi")
779  else()
780    set(ZIG_HOST_TARGET_ABI "-android")
781  endif()
782endif()
783
784set(ZIG_HOST_TARGET_TRIPLE "${ZIG_HOST_TARGET_ARCH}-${ZIG_HOST_TARGET_OS}${ZIG_HOST_TARGET_ABI}" CACHE STRING "Host zig target triple.")
785
786if(MSVC)
787  set(ZIG_WASM2C_COMPILE_FLAGS "")
788  set(ZIG1_COMPILE_FLAGS "/Os")
789  set(ZIG2_COMPILE_FLAGS "/Od")
790  set(ZIG2_LINK_FLAGS "/STACK:16777216 /FORCE:MULTIPLE")
791else()
792  set(ZIG_WASM2C_COMPILE_FLAGS "-std=c99 -O2")
793  set(ZIG1_COMPILE_FLAGS "-std=c99 -Os")
794  set(ZIG2_COMPILE_FLAGS "-std=c99 -O0 -fno-sanitize=undefined -fno-stack-protector")
795  if(APPLE)
796    set(ZIG2_LINK_FLAGS "-Wl,-stack_size,0x10000000")
797  elseif(MINGW)
798    set(ZIG2_LINK_FLAGS "-Wl,--stack,0x10000000")
799  # Solaris/illumos ld(1) does not provide a --stack-size option.
800  elseif(CMAKE_HOST_SOLARIS)
801    unset(ZIG2_LINK_FLAGS)
802  else()
803    set(ZIG2_LINK_FLAGS "-Wl,-z,stack-size=0x10000000")
804  endif()
805endif()
806
807set(ZIG1_WASM_MODULE "${PROJECT_SOURCE_DIR}/stage1/zig1.wasm")
808set(ZIG1_C_SOURCE "${PROJECT_BINARY_DIR}/zig1.c")
809set(ZIG2_C_SOURCE "${PROJECT_BINARY_DIR}/zig2.c")
810set(ZIG_COMPILER_RT_C_SOURCE "${PROJECT_BINARY_DIR}/compiler_rt.c")
811
812add_executable(zig-wasm2c ${ZIG_WASM2C_SOURCES})
813set_target_properties(zig-wasm2c PROPERTIES COMPILE_FLAGS "${ZIG_WASM2C_COMPILE_FLAGS}")
814
815add_custom_command(
816  OUTPUT "${ZIG1_C_SOURCE}"
817  COMMAND zig-wasm2c "${ZIG1_WASM_MODULE}" "${ZIG1_C_SOURCE}"
818  DEPENDS zig-wasm2c "${ZIG1_WASM_MODULE}"
819  COMMENT "Converting ${ZIG1_WASM_MODULE} to ${ZIG1_C_SOURCE}"
820  WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
821)
822
823add_executable(zig1 ${ZIG1_C_SOURCE} stage1/wasi.c)
824set_target_properties(zig1 PROPERTIES COMPILE_FLAGS ${ZIG1_COMPILE_FLAGS})
825
826if(MSVC)
827  target_link_options(zig1 PRIVATE /STACK:0x10000000)
828else()
829  target_link_libraries(zig1 LINK_PUBLIC m)
830  if(MINGW)
831    target_link_options(zig1 PRIVATE -Wl,--stack,0x10000000)
832  endif()
833endif()
834
835set(BUILD_ZIG2_ARGS
836  "${PROJECT_SOURCE_DIR}/lib"
837  build-exe -ofmt=c -lc -OReleaseSmall
838  --name zig2
839  -femit-bin="${ZIG2_C_SOURCE}"
840  -target "${ZIG_HOST_TARGET_TRIPLE}"
841  --dep "build_options"
842  --dep "aro"
843  "-Mroot=src/main.zig"
844  "-Mbuild_options=${ZIG_CONFIG_ZIG_OUT}"
845  "-Maro=lib/compiler/aro/aro.zig"
846)
847
848add_custom_command(
849  OUTPUT "${ZIG2_C_SOURCE}"
850  COMMAND zig1 ${BUILD_ZIG2_ARGS}
851  DEPENDS zig1 "${ZIG_STAGE2_SOURCES}"
852  COMMENT "Running zig1.wasm to produce ${ZIG2_C_SOURCE}"
853  WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
854)
855
856set(BUILD_COMPILER_RT_ARGS
857  "${PROJECT_SOURCE_DIR}/lib"
858  build-obj -ofmt=c -OReleaseSmall
859  --name compiler_rt
860  -femit-bin="${ZIG_COMPILER_RT_C_SOURCE}"
861  -target "${ZIG_HOST_TARGET_TRIPLE}"
862  "-Mroot=lib/compiler_rt.zig"
863)
864
865add_custom_command(
866  OUTPUT "${ZIG_COMPILER_RT_C_SOURCE}"
867  COMMAND zig1 ${BUILD_COMPILER_RT_ARGS}
868  DEPENDS zig1 "${ZIG_STAGE2_SOURCES}"
869  COMMENT "Running zig1.wasm to produce ${ZIG_COMPILER_RT_C_SOURCE}"
870  WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
871)
872
873add_executable(zig2 ${ZIG2_C_SOURCE} ${ZIG_COMPILER_RT_C_SOURCE})
874set_target_properties(zig2 PROPERTIES
875  COMPILE_FLAGS ${ZIG2_COMPILE_FLAGS}
876  LINK_FLAGS "${ZIG2_LINK_FLAGS}"
877)
878target_include_directories(zig2 PUBLIC stage1)
879target_link_libraries(zig2 LINK_PUBLIC zigcpp)
880
881if(MSVC)
882  target_link_libraries(zig2 LINK_PUBLIC ntdll.lib ws2_32.lib)
883elseif(MINGW)
884  target_link_libraries(zig2 LINK_PUBLIC ntdll ws2_32)
885endif()
886
887if(NOT MSVC)
888    target_link_libraries(zig2 LINK_PUBLIC ${LIBXML2})
889endif()
890
891if(ZIG_DIA_GUIDS_LIB)
892    target_link_libraries(zig2 LINK_PUBLIC ${ZIG_DIA_GUIDS_LIB})
893endif()
894
895if(MSVC OR MINGW)
896    target_link_libraries(zig2 LINK_PUBLIC version)
897endif()
898
899
900# "-Dno-langref" is hardcoded because stage2 builds lack the `@cImport`
901# feature, which some of the doctests rely on.
902
903# To obtain this document, run `zig build` against stage3 rather than stage2.
904# Note that the `langref` step can be used to isolate this task.
905set(ZIG_BUILD_ARGS
906  --zig-lib-dir "${PROJECT_SOURCE_DIR}/lib"
907
908  "-Dversion-string=${RESOLVED_ZIG_VERSION}"
909  "-Dtarget=${ZIG_TARGET_TRIPLE}"
910  "-Dcpu=${ZIG_TARGET_MCPU}"
911
912  -Denable-llvm
913  "-Dconfig_h=${ZIG_CONFIG_H_OUT}"
914
915  -Dno-langref
916)
917
918set(ZIG_EXTRA_BUILD_ARGS "" CACHE STRING "Extra zig build args")
919if(ZIG_EXTRA_BUILD_ARGS)
920  list(APPEND ZIG_BUILD_ARGS ${ZIG_EXTRA_BUILD_ARGS})
921endif()
922
923set(ZIG_RELEASE_SAFE OFF CACHE BOOL "Build Zig as ReleaseSafe (with debug assertions on)")
924
925if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
926  list(APPEND ZIG_BUILD_ARGS -Doptimize=Debug)
927else()
928  if("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
929    list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseSmall)
930  else()
931    # Release and RelWithDebInfo
932    if(ZIG_RELEASE_SAFE)
933      list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseSafe)
934    else()
935      list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseFast)
936    endif()
937    if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
938      list(APPEND ZIG_BUILD_ARGS -Dstrip)
939    endif()
940  endif()
941endif()
942
943if(ZIG_STATIC AND NOT MSVC)
944  list(APPEND ZIG_BUILD_ARGS -Duse-zig-libcxx)
945endif()
946
947if(ZIG_NO_LIB)
948  list(APPEND ZIG_BUILD_ARGS -Dno-lib)
949endif()
950
951if(ZIG_SINGLE_THREADED)
952  list(APPEND ZIG_BUILD_ARGS -Dsingle-threaded)
953endif()
954
955if(ZIG_PIE)
956  list(APPEND ZIG_BUILD_ARGS -Dpie)
957endif()
958
959if(NOT "${ZIG_TARGET_DYNAMIC_LINKER}" STREQUAL "")
960  list(APPEND ZIG_BUILD_ARGS "-Ddynamic-linker=${ZIG_TARGET_DYNAMIC_LINKER}")
961endif()
962
963
964add_custom_target(stage3 ALL
965  DEPENDS "${PROJECT_BINARY_DIR}/stage3/bin/zig"
966)
967
968set(ZIG2_WORKING_DIR "${PROJECT_SOURCE_DIR}")
969
970add_custom_command(
971  OUTPUT "${PROJECT_BINARY_DIR}/stage3/bin/zig"
972  COMMAND zig2 build --prefix "${PROJECT_BINARY_DIR}/stage3" ${ZIG_BUILD_ARGS}
973  COMMENT "Building stage3"
974  WORKING_DIRECTORY "${ZIG2_WORKING_DIR}"
975)
976
977set(ZIG_EXECUTABLE "$<TARGET_FILE:zig2>")
978
979install(CODE "set(ZIG_EXECUTABLE \"${ZIG_EXECUTABLE}\")")
980install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
981install(CODE "set(ZIG2_WORKING_DIR \"${ZIG2_WORKING_DIR}\")")
982install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
983install(SCRIPT cmake/install.cmake)