std.meta.hasUniqueRepresentation: better support packed structs
[zig.git] / CMakeLists.txt
blob22051f19024655abdcdc124591043c35adb3ab0e
1 cmake_minimum_required(VERSION 3.15)
3 if(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)
6 endif()
8 if(NOT CMAKE_INSTALL_PREFIX)
9     set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/stage3" CACHE PATH
10       "Directory to install zig to" FORCE)
11 endif()
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.
21 list(APPEND ZIG_CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}")
22 if(WIN32)
23   list(APPEND ZIG_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
24 else()
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}")
27 endif()
29 list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
31 project(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
40 set(ZIG_VERSION_MAJOR 0)
41 set(ZIG_VERSION_MINOR 13)
42 set(ZIG_VERSION_PATCH 0)
43 set(ZIG_VERSION "" CACHE STRING "Override Zig version string. Default is to find out with git.")
45 if("${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()
79 else()
80     set(RESOLVED_ZIG_VERSION "${ZIG_VERSION}")
81 endif()
82 message(STATUS "Configuring zig version ${RESOLVED_ZIG_VERSION}")
84 set(ZIG_NO_LIB off CACHE BOOL
85     "Disable copying lib/ files to install prefix during the build phase")
87 set(ZIG_STATIC off CACHE BOOL "Attempt to build a static zig executable (not compatible with glibc)")
88 set(ZIG_SHARED_LLVM off CACHE BOOL "Prefer linking against shared LLVM libraries")
89 set(ZIG_STATIC_LLVM ${ZIG_STATIC} CACHE BOOL "Prefer linking against static LLVM libraries")
90 set(ZIG_STATIC_ZLIB ${ZIG_STATIC} CACHE BOOL "Prefer linking against static zlib")
91 set(ZIG_STATIC_ZSTD ${ZIG_STATIC} CACHE BOOL "Prefer linking against static zstd")
92 if(APPLE AND ZIG_STATIC)
93   set(ZIG_STATIC_CURSES on)
94 else()
95   set(ZIG_STATIC_CURSES off)
96 endif()
97 set(ZIG_STATIC_CURSES ${ZIG_STATIC_CURSES} CACHE BOOL "Prefer linking against static curses")
99 if (ZIG_SHARED_LLVM AND ZIG_STATIC_LLVM)
100     message(SEND_ERROR "-DZIG_SHARED_LLVM and -DZIG_STATIC_LLVM cannot both be enabled simultaneously")
101 endif()
103 set(ZIG_TARGET_TRIPLE "native" CACHE STRING "arch-os-abi to output binaries for")
104 set(ZIG_TARGET_MCPU "native" CACHE STRING "-mcpu parameter to output binaries for")
105 set(ZIG_TARGET_DYNAMIC_LINKER "" CACHE STRING
106   "Override the dynamic linker used by the Zig binary. Default is to auto-detect the dynamic linker.")
107 set(ZIG_SINGLE_THREADED off CACHE BOOL "limit the zig compiler to use only 1 thread")
108 set(ZIG_AR_WORKAROUND off CACHE BOOL "append 'ar' subcommand to CMAKE_AR")
110 if("${ZIG_TARGET_TRIPLE}" STREQUAL "native")
111     set(ZIG_USE_LLVM_CONFIG ON CACHE BOOL "use llvm-config to find LLVM libraries")
112 else()
113     set(ZIG_USE_LLVM_CONFIG OFF CACHE BOOL "use llvm-config to find LLVM libraries")
114 endif()
116 if(ZIG_AR_WORKAROUND)
117   string(REPLACE "<CMAKE_AR>" "<CMAKE_AR> ar" CMAKE_C_ARCHIVE_CREATE ${CMAKE_C_ARCHIVE_CREATE})
118   string(REPLACE "<CMAKE_AR>" "<CMAKE_AR> ar" CMAKE_CXX_ARCHIVE_CREATE ${CMAKE_CXX_ARCHIVE_CREATE})
119 endif()
122 option(ZIG_PIE "Produce a position independent zig executable" ${CMAKE_POSITION_INDEPENDENT_CODE})
123 include(CheckPIESupported)
124 check_pie_supported(
125   OUTPUT_VARIABLE ZIG_PIE_SUPPORTED_BY_CMAKE
126   LANGUAGES C CXX
128 if(ZIG_PIE AND NOT ZIG_PIE_SUPPORTED_BY_CMAKE)
129   message(SEND_ERROR "ZIG_PIE was requested but CMake does not support it for \"zigcpp\" target")
130 endif()
133 # Detect system libcxx name.
134 if ("c++" IN_LIST CMAKE_CXX_IMPLICIT_LINK_LIBRARIES)
135     set(ZIG_SYSTEM_LIBCXX "c++" CACHE STRING "system libcxx name for build.zig")
136 else()
137     set(ZIG_SYSTEM_LIBCXX "stdc++" CACHE STRING "system libcxx name for build.zig")
138 endif()
140 find_package(llvm 18)
141 find_package(clang 18)
142 find_package(lld 18)
144 if(ZIG_STATIC_ZLIB)
145     if (MSVC)
146         list(REMOVE_ITEM LLVM_LIBRARIES "z.lib")
147     else()
148         list(REMOVE_ITEM LLVM_LIBRARIES "-lz")
149     endif()
151     find_library(ZLIB NAMES libz.a libzlibstatic.a z zlib libz NAMES_PER_DIR)
152     list(APPEND LLVM_LIBRARIES "${ZLIB}")
153 endif()
155 if(ZIG_STATIC_ZSTD)
156     if (MSVC)
157         list(REMOVE_ITEM LLVM_LIBRARIES "zstd.lib")
158     else()
159         list(REMOVE_ITEM LLVM_LIBRARIES "-lzstd")
160     endif()
162     find_library(ZSTD NAMES libzstd.a libzstdstatic.a zstd NAMES_PER_DIR)
163     list(APPEND LLVM_LIBRARIES "${ZSTD}")
164 endif()
166 if(ZIG_STATIC_CURSES)
167     list(REMOVE_ITEM LLVM_LIBRARIES "-lcurses")
168     find_library(CURSES NAMES libcurses.a libncurses.a NAMES_PER_DIR
169       PATHS
170         /usr/local/opt/ncurses/lib
171         /opt/homebrew/opt/ncurses/lib)
172     list(APPEND LLVM_LIBRARIES "${CURSES}")
173 endif()
175 find_package(Threads)
177 set(ZIG_CONFIG_H_OUT "${PROJECT_BINARY_DIR}/config.h")
178 set(ZIG_CONFIG_ZIG_OUT "${PROJECT_BINARY_DIR}/config.zig")
180 set(ZIG_WASM2C_SOURCES
181     stage1/wasm2c.c
183 # Sync with "zig_cpp_sources" in build.zig
184 set(ZIG_CPP_SOURCES
185     # These are planned to stay even when we are self-hosted.
186     src/zig_llvm.cpp
187     src/zig_llvm-ar.cpp
188     src/zig_clang.cpp
189     src/zig_clang_driver.cpp
190     src/zig_clang_cc1_main.cpp
191     src/zig_clang_cc1as_main.cpp
193 # Needed because we use cmake, not the zig build system, to build zig2.o.
194 set(ZIG_STAGE2_SOURCES
195     "${ZIG_CONFIG_ZIG_OUT}"
196     lib/compiler_rt.zig
197     lib/compiler_rt/absv.zig
198     lib/compiler_rt/absvdi2.zig
199     lib/compiler_rt/absvsi2.zig
200     lib/compiler_rt/absvti2.zig
201     lib/compiler_rt/adddf3.zig
202     lib/compiler_rt/addf3.zig
203     lib/compiler_rt/addo.zig
204     lib/compiler_rt/addsf3.zig
205     lib/compiler_rt/addtf3.zig
206     lib/compiler_rt/addxf3.zig
207     lib/compiler_rt/arm.zig
208     lib/compiler_rt/atomics.zig
209     lib/compiler_rt/aulldiv.zig
210     lib/compiler_rt/aullrem.zig
211     lib/compiler_rt/bswap.zig
212     lib/compiler_rt/ceil.zig
213     lib/compiler_rt/clear_cache.zig
214     lib/compiler_rt/cmp.zig
215     lib/compiler_rt/cmpdf2.zig
216     lib/compiler_rt/cmpsf2.zig
217     lib/compiler_rt/cmptf2.zig
218     lib/compiler_rt/cmpxf2.zig
219     lib/compiler_rt/common.zig
220     lib/compiler_rt/comparef.zig
221     lib/compiler_rt/cos.zig
222     lib/compiler_rt/count0bits.zig
223     lib/compiler_rt/divdf3.zig
224     lib/compiler_rt/divsf3.zig
225     lib/compiler_rt/divtf3.zig
226     lib/compiler_rt/divti3.zig
227     lib/compiler_rt/divxf3.zig
228     lib/compiler_rt/emutls.zig
229     lib/compiler_rt/exp.zig
230     lib/compiler_rt/exp2.zig
231     lib/compiler_rt/extenddftf2.zig
232     lib/compiler_rt/extenddfxf2.zig
233     lib/compiler_rt/extendf.zig
234     lib/compiler_rt/extendhfsf2.zig
235     lib/compiler_rt/extendhftf2.zig
236     lib/compiler_rt/extendhfxf2.zig
237     lib/compiler_rt/extendsfdf2.zig
238     lib/compiler_rt/extendsftf2.zig
239     lib/compiler_rt/extendsfxf2.zig
240     lib/compiler_rt/extendxftf2.zig
241     lib/compiler_rt/fabs.zig
242     lib/compiler_rt/fixdfdi.zig
243     lib/compiler_rt/fixdfsi.zig
244     lib/compiler_rt/fixdfti.zig
245     lib/compiler_rt/fixhfdi.zig
246     lib/compiler_rt/fixhfsi.zig
247     lib/compiler_rt/fixhfti.zig
248     lib/compiler_rt/fixsfdi.zig
249     lib/compiler_rt/fixsfsi.zig
250     lib/compiler_rt/fixsfti.zig
251     lib/compiler_rt/fixtfdi.zig
252     lib/compiler_rt/fixtfsi.zig
253     lib/compiler_rt/fixtfti.zig
254     lib/compiler_rt/fixunsdfdi.zig
255     lib/compiler_rt/fixunsdfsi.zig
256     lib/compiler_rt/fixunsdfti.zig
257     lib/compiler_rt/fixunshfdi.zig
258     lib/compiler_rt/fixunshfsi.zig
259     lib/compiler_rt/fixunshfti.zig
260     lib/compiler_rt/fixunssfdi.zig
261     lib/compiler_rt/fixunssfsi.zig
262     lib/compiler_rt/fixunssfti.zig
263     lib/compiler_rt/fixunstfdi.zig
264     lib/compiler_rt/fixunstfsi.zig
265     lib/compiler_rt/fixunstfti.zig
266     lib/compiler_rt/fixunsxfdi.zig
267     lib/compiler_rt/fixunsxfsi.zig
268     lib/compiler_rt/fixunsxfti.zig
269     lib/compiler_rt/fixxfdi.zig
270     lib/compiler_rt/fixxfsi.zig
271     lib/compiler_rt/fixxfti.zig
272     lib/compiler_rt/float_from_int.zig
273     lib/compiler_rt/floatdidf.zig
274     lib/compiler_rt/floatdihf.zig
275     lib/compiler_rt/floatdisf.zig
276     lib/compiler_rt/floatditf.zig
277     lib/compiler_rt/floatdixf.zig
278     lib/compiler_rt/floatsidf.zig
279     lib/compiler_rt/floatsihf.zig
280     lib/compiler_rt/floatsisf.zig
281     lib/compiler_rt/floatsitf.zig
282     lib/compiler_rt/floatsixf.zig
283     lib/compiler_rt/floattidf.zig
284     lib/compiler_rt/floattihf.zig
285     lib/compiler_rt/floattisf.zig
286     lib/compiler_rt/floattitf.zig
287     lib/compiler_rt/floattixf.zig
288     lib/compiler_rt/floatundidf.zig
289     lib/compiler_rt/floatundihf.zig
290     lib/compiler_rt/floatundisf.zig
291     lib/compiler_rt/floatunditf.zig
292     lib/compiler_rt/floatundixf.zig
293     lib/compiler_rt/floatunsidf.zig
294     lib/compiler_rt/floatunsihf.zig
295     lib/compiler_rt/floatunsisf.zig
296     lib/compiler_rt/floatunsitf.zig
297     lib/compiler_rt/floatunsixf.zig
298     lib/compiler_rt/floatuntidf.zig
299     lib/compiler_rt/floatuntihf.zig
300     lib/compiler_rt/floatuntisf.zig
301     lib/compiler_rt/floatuntitf.zig
302     lib/compiler_rt/floatuntixf.zig
303     lib/compiler_rt/floor.zig
304     lib/compiler_rt/fma.zig
305     lib/compiler_rt/fmax.zig
306     lib/compiler_rt/fmin.zig
307     lib/compiler_rt/fmod.zig
308     lib/compiler_rt/gedf2.zig
309     lib/compiler_rt/gesf2.zig
310     lib/compiler_rt/getf2.zig
311     lib/compiler_rt/gexf2.zig
312     lib/compiler_rt/int.zig
313     lib/compiler_rt/int_from_float.zig
314     lib/compiler_rt/log.zig
315     lib/compiler_rt/log10.zig
316     lib/compiler_rt/log2.zig
317     lib/compiler_rt/modti3.zig
318     lib/compiler_rt/mulXi3.zig
319     lib/compiler_rt/muldf3.zig
320     lib/compiler_rt/mulf3.zig
321     lib/compiler_rt/mulo.zig
322     lib/compiler_rt/mulsf3.zig
323     lib/compiler_rt/multf3.zig
324     lib/compiler_rt/mulxf3.zig
325     lib/compiler_rt/negXi2.zig
326     lib/compiler_rt/negdf2.zig
327     lib/compiler_rt/negsf2.zig
328     lib/compiler_rt/negtf2.zig
329     lib/compiler_rt/negv.zig
330     lib/compiler_rt/negxf2.zig
331     lib/compiler_rt/os_version_check.zig
332     lib/compiler_rt/parity.zig
333     lib/compiler_rt/popcount.zig
334     lib/compiler_rt/rem_pio2.zig
335     lib/compiler_rt/rem_pio2_large.zig
336     lib/compiler_rt/rem_pio2f.zig
337     lib/compiler_rt/round.zig
338     lib/compiler_rt/shift.zig
339     lib/compiler_rt/sin.zig
340     lib/compiler_rt/sincos.zig
341     lib/compiler_rt/sqrt.zig
342     lib/compiler_rt/stack_probe.zig
343     lib/compiler_rt/subdf3.zig
344     lib/compiler_rt/subo.zig
345     lib/compiler_rt/subsf3.zig
346     lib/compiler_rt/subtf3.zig
347     lib/compiler_rt/subxf3.zig
348     lib/compiler_rt/tan.zig
349     lib/compiler_rt/trig.zig
350     lib/compiler_rt/trunc.zig
351     lib/compiler_rt/truncdfhf2.zig
352     lib/compiler_rt/truncdfsf2.zig
353     lib/compiler_rt/truncf.zig
354     lib/compiler_rt/truncsfhf2.zig
355     lib/compiler_rt/trunctfdf2.zig
356     lib/compiler_rt/trunctfhf2.zig
357     lib/compiler_rt/trunctfsf2.zig
358     lib/compiler_rt/trunctfxf2.zig
359     lib/compiler_rt/truncxfdf2.zig
360     lib/compiler_rt/truncxfhf2.zig
361     lib/compiler_rt/truncxfsf2.zig
362     lib/compiler_rt/udivmod.zig
363     lib/compiler_rt/udivmodei4.zig
364     lib/compiler_rt/udivmodti4.zig
365     lib/compiler_rt/udivti3.zig
366     lib/compiler_rt/umodti3.zig
367     lib/compiler_rt/unorddf2.zig
368     lib/compiler_rt/unordsf2.zig
369     lib/compiler_rt/unordtf2.zig
370     lib/std/BitStack.zig
371     lib/std/Build.zig
372     lib/std/Build/Cache.zig
373     lib/std/Build/Cache/DepTokenizer.zig
374     lib/std/Progress.zig
375     lib/std/Random.zig
376     lib/std/Target.zig
377     lib/std/Target/Query.zig
378     lib/std/Target/aarch64.zig
379     lib/std/Target/amdgpu.zig
380     lib/std/Target/arm.zig
381     lib/std/Target/avr.zig
382     lib/std/Target/bpf.zig
383     lib/std/Target/hexagon.zig
384     lib/std/Target/mips.zig
385     lib/std/Target/msp430.zig
386     lib/std/Target/nvptx.zig
387     lib/std/Target/powerpc.zig
388     lib/std/Target/riscv.zig
389     lib/std/Target/s390x.zig
390     lib/std/Target/sparc.zig
391     lib/std/Target/wasm.zig
392     lib/std/Target/x86.zig
393     lib/std/Thread.zig
394     lib/std/Thread/Futex.zig
395     lib/std/Thread/Mutex.zig
396     lib/std/Thread/Pool.zig
397     lib/std/Thread/ResetEvent.zig
398     lib/std/Thread/WaitGroup.zig
399     lib/std/array_hash_map.zig
400     lib/std/array_list.zig
401     lib/std/ascii.zig
402     lib/std/atomic.zig
403     lib/std/base64.zig
404     lib/std/buf_map.zig
405     lib/std/builtin.zig
406     lib/std/c.zig
407     lib/std/c/linux.zig
408     lib/std/coff.zig
409     lib/std/crypto.zig
410     lib/std/crypto/blake3.zig
411     lib/std/crypto/siphash.zig
412     lib/std/debug.zig
413     lib/std/dwarf.zig
414     lib/std/dwarf/AT.zig
415     lib/std/dwarf/ATE.zig
416     lib/std/dwarf/FORM.zig
417     lib/std/dwarf/LANG.zig
418     lib/std/dwarf/OP.zig
419     lib/std/dwarf/TAG.zig
420     lib/std/elf.zig
421     lib/std/fifo.zig
422     lib/std/fmt.zig
423     lib/std/fmt/format_float.zig
424     lib/std/fmt/parse_float.zig
425     lib/std/fs.zig
426     lib/std/fs/AtomicFile.zig
427     lib/std/fs/Dir.zig
428     lib/std/fs/File.zig
429     lib/std/fs/get_app_data_dir.zig
430     lib/std/fs/path.zig
431     lib/std/hash.zig
432     lib/std/hash/auto_hash.zig
433     lib/std/hash/wyhash.zig
434     lib/std/hash_map.zig
435     lib/std/heap.zig
436     lib/std/heap/arena_allocator.zig
437     lib/std/io.zig
438     lib/std/io/Reader.zig
439     lib/std/io/Writer.zig
440     lib/std/io/buffered_atomic_file.zig
441     lib/std/io/buffered_writer.zig
442     lib/std/io/change_detection_stream.zig
443     lib/std/io/counting_reader.zig
444     lib/std/io/counting_writer.zig
445     lib/std/io/find_byte_writer.zig
446     lib/std/io/fixed_buffer_stream.zig
447     lib/std/io/limited_reader.zig
448     lib/std/io/seekable_stream.zig
449     lib/std/json.zig
450     lib/std/json/stringify.zig
451     lib/std/leb128.zig
452     lib/std/linked_list.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/AstGen.zig
495     lib/std/zig/AstRlAnnotate.zig
496     lib/std/zig/LibCInstallation.zig
497     lib/std/zig/Parse.zig
498     lib/std/zig/Server.zig
499     lib/std/zig/WindowsSdk.zig
500     lib/std/zig/Zir.zig
501     lib/std/zig/c_builtins.zig
502     lib/std/zig/render.zig
503     lib/std/zig/string_literal.zig
504     lib/std/zig/system.zig
505     lib/std/zig/system/NativePaths.zig
506     lib/std/zig/system/x86.zig
507     lib/std/zig/tokenizer.zig
508     src/Air.zig
509     src/Builtin.zig
510     src/Compilation.zig
511     src/Compilation/Config.zig
512     src/DarwinPosixSpawn.zig
513     src/InternPool.zig
514     src/Liveness.zig
515     src/Liveness/Verify.zig
516     src/Module.zig
517     src/Package.zig
518     src/Package/Fetch.zig
519     src/Package/Fetch/git.zig
520     src/Package/Manifest.zig
521     src/Package/Module.zig
522     src/RangeSet.zig
523     src/Sema.zig
524     src/Sema/bitcast.zig
525     src/Sema/comptime_ptr_access.zig
526     src/Value.zig
527     src/arch/aarch64/CodeGen.zig
528     src/arch/aarch64/Emit.zig
529     src/arch/aarch64/Mir.zig
530     src/arch/aarch64/abi.zig
531     src/arch/aarch64/bits.zig
532     src/arch/arm/CodeGen.zig
533     src/arch/arm/Emit.zig
534     src/arch/arm/Mir.zig
535     src/arch/arm/abi.zig
536     src/arch/arm/bits.zig
537     src/arch/riscv64/CodeGen.zig
538     src/arch/riscv64/Emit.zig
539     src/arch/riscv64/Mir.zig
540     src/arch/riscv64/abi.zig
541     src/arch/riscv64/bits.zig
542     src/arch/sparc64/CodeGen.zig
543     src/arch/sparc64/Emit.zig
544     src/arch/sparc64/Mir.zig
545     src/arch/sparc64/abi.zig
546     src/arch/sparc64/bits.zig
547     src/arch/wasm/CodeGen.zig
548     src/arch/wasm/Emit.zig
549     src/arch/wasm/Mir.zig
550     src/arch/wasm/abi.zig
551     src/arch/x86/bits.zig
552     src/arch/x86_64/CodeGen.zig
553     src/arch/x86_64/Disassembler.zig
554     src/arch/x86_64/Emit.zig
555     src/arch/x86_64/Encoding.zig
556     src/arch/x86_64/Lower.zig
557     src/arch/x86_64/Mir.zig
558     src/arch/x86_64/abi.zig
559     src/arch/x86_64/bits.zig
560     src/arch/x86_64/encoder.zig
561     src/arch/x86_64/encodings.zig
562     src/clang.zig
563     src/clang_options.zig
564     src/clang_options_data.zig
565     src/codegen.zig
566     src/codegen/c.zig
567     src/codegen/c/Type.zig
568     src/codegen/llvm.zig
569     src/codegen/llvm/BitcodeReader.zig
570     src/codegen/llvm/Builder.zig
571     src/codegen/llvm/bindings.zig
572     src/codegen/llvm/bitcode_writer.zig
573     src/codegen/llvm/ir.zig
574     src/codegen/spirv.zig
575     src/codegen/spirv/Assembler.zig
576     src/codegen/spirv/Module.zig
577     src/codegen/spirv/Section.zig
578     src/codegen/spirv/spec.zig
579     src/crash_report.zig
580     src/glibc.zig
581     src/introspect.zig
582     src/libcxx.zig
583     src/libtsan.zig
584     src/libunwind.zig
585     src/link.zig
586     src/link/C.zig
587     src/link/Coff.zig
588     src/link/Coff/Atom.zig
589     src/link/Coff/ImportTable.zig
590     src/link/Coff/Object.zig
591     src/link/Coff/Relocation.zig
592     src/link/Coff/lld.zig
593     src/link/Dwarf.zig
594     src/link/Elf.zig
595     src/link/Elf/Archive.zig
596     src/link/Elf/Atom.zig
597     src/link/Elf/LdScript.zig
598     src/link/Elf/LinkerDefined.zig
599     src/link/Elf/Object.zig
600     src/link/Elf/SharedObject.zig
601     src/link/Elf/Symbol.zig
602     src/link/Elf/ZigObject.zig
603     src/link/Elf/eh_frame.zig
604     src/link/Elf/file.zig
605     src/link/Elf/gc.zig
606     src/link/Elf/merge_section.zig
607     src/link/Elf/relocatable.zig
608     src/link/Elf/relocation.zig
609     src/link/Elf/synthetic_sections.zig
610     src/link/Elf/thunks.zig
611     src/link/MachO.zig
612     src/link/MachO/Archive.zig
613     src/link/MachO/Atom.zig
614     src/link/MachO/CodeSignature.zig
615     src/link/MachO/DebugSymbols.zig
616     src/link/MachO/Dylib.zig
617     src/link/MachO/InternalObject.zig
618     src/link/MachO/Object.zig
619     src/link/MachO/Relocation.zig
620     src/link/MachO/Symbol.zig
621     src/link/MachO/UnwindInfo.zig
622     src/link/MachO/ZigObject.zig
623     src/link/MachO/dead_strip.zig
624     src/link/MachO/dyld_info/Rebase.zig
625     src/link/MachO/dyld_info/Trie.zig
626     src/link/MachO/dyld_info/bind.zig
627     src/link/MachO/dwarf.zig
628     src/link/MachO/eh_frame.zig
629     src/link/MachO/fat.zig
630     src/link/MachO/file.zig
631     src/link/MachO/hasher.zig
632     src/link/MachO/load_commands.zig
633     src/link/MachO/relocatable.zig
634     src/link/MachO/synthetic.zig
635     src/link/MachO/thunks.zig
636     src/link/MachO/uuid.zig
637     src/link/NvPtx.zig
638     src/link/Plan9.zig
639     src/link/Plan9/aout.zig
640     src/link/SpirV.zig
641     src/link/SpirV/BinaryModule.zig
642     src/link/SpirV/deduplicate.zig
643     src/link/SpirV/lower_invocation_globals.zig
644     src/link/SpirV/prune_unused.zig
645     src/link/StringTable.zig
646     src/link/Wasm.zig
647     src/link/Wasm/Archive.zig
648     src/link/Wasm/Atom.zig
649     src/link/Wasm/Object.zig
650     src/link/Wasm/Symbol.zig
651     src/link/Wasm/ZigObject.zig
652     src/link/Wasm/file.zig
653     src/link/Wasm/types.zig
654     src/link/aarch64.zig
655     src/link/riscv.zig
656     src/link/table_section.zig
657     src/link/tapi.zig
658     src/link/tapi/Tokenizer.zig
659     src/link/tapi/parse.zig
660     src/link/tapi/parse/test.zig
661     src/link/tapi/yaml.zig
662     src/link/tapi/yaml/test.zig
663     src/main.zig
664     src/mingw.zig
665     src/musl.zig
666     src/mutable_value.zig
667     src/print_air.zig
668     src/print_env.zig
669     src/print_targets.zig
670     src/print_value.zig
671     src/print_zir.zig
672     src/register_manager.zig
673     src/target.zig
674     src/tracy.zig
675     src/translate_c.zig
676     src/type.zig
677     src/wasi_libc.zig
680 if(MSVC)
681     set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
682     if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
683         set(ZIG_DIA_GUIDS_LIB "${MSVC_DIA_SDK_DIR}/lib/amd64/diaguids.lib")
684         string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_DIA_GUIDS_LIB_ESCAPED "${ZIG_DIA_GUIDS_LIB}")
685     endif()
686 endif()
688 configure_file (
689     stage1/config.h.in
690     "${ZIG_CONFIG_H_OUT}"
692 configure_file (
693     stage1/config.zig.in
694     "${ZIG_CONFIG_ZIG_OUT}"
697 # zigcpp target
699 set(ZIGCPP_OUTPUT_DIR "${PROJECT_BINARY_DIR}/zigcpp")
701 add_library(zigcpp STATIC ${ZIG_CPP_SOURCES})
703 # Sync with minimum C++ standard required to build LLVM
704 # and with "exe_cflags" in build.zig
705 target_compile_features(zigcpp PRIVATE cxx_std_17)
706 set_target_properties(zigcpp PROPERTIES POSITION_INDEPENDENT_CODE ${ZIG_PIE})
708 if(NOT MSVC)
709   if(MINGW)
710     target_compile_options(zigcpp PRIVATE -Wno-format)
711   endif()
712   # Sync content below with "exe_cflags" in build.zig
713   target_compile_definitions(zigcpp PUBLIC
714     __STDC_CONSTANT_MACROS
715     __STDC_FORMAT_MACROS
716     __STDC_LIMIT_MACROS
718     _GNU_SOURCE
719   )
720   target_compile_options(zigcpp PRIVATE
721     -fno-exceptions
722     -fno-rtti
723     -fno-stack-protector
725     -fvisibility-inlines-hidden
727     -Wno-type-limits
728     -Wno-missing-braces
729     -Wno-comment
730   )
731 else()
732 target_compile_options(zigcpp PRIVATE /Zc:preprocessor)
733 set_property(TARGET zigcpp PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded")
734 endif()
736 target_include_directories(zigcpp PUBLIC
737     ${CLANG_INCLUDE_DIRS}
738     ${LLVM_INCLUDE_DIRS}
739     ${LLD_INCLUDE_DIRS}
741 target_link_libraries(zigcpp PUBLIC
742     ${CLANG_LIBRARIES}
743     ${LLD_LIBRARIES}
744     ${LLVM_LIBRARIES}
745     ${CMAKE_THREAD_LIBS_INIT}
748 # Handle multi-config builds and place each into a common lib. The VS generator
749 # for example will append a Debug folder by default if not explicitly specified.
750 set_target_properties(zigcpp PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ZIGCPP_OUTPUT_DIR})
751 foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
752     string(TOUPPER ${CONFIG_TYPE} CONFIG_TYPE)
753     set_target_properties(zigcpp PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_TYPE} ${ZIGCPP_OUTPUT_DIR})
754 endforeach()
756 # end of zigcpp target
758 include(CheckSymbolExists)
760 string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" ZIG_HOST_TARGET_OS)
761 if(ZIG_HOST_TARGET_OS STREQUAL "darwin")
762   set(ZIG_HOST_TARGET_OS "macos")
763 elseif(ZIG_HOST_TARGET_OS STREQUAL "sunos")
764   check_symbol_exists(__illumos__ "" ZIG_HOST_TARGET_HAS_ILLUMOS_MACRO)
765   if (ZIG_HOST_TARGET_HAS_ILLUMOS_MACRO)
766     set(ZIG_HOST_TARGET_OS "illumos")
767   else()
768     set(ZIG_HOST_TARGET_OS "solaris")
769   endif()
770 endif()
772 string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" ZIG_HOST_TARGET_ARCH)
773 if(ZIG_HOST_TARGET_ARCH MATCHES "^i[3-9]86$")
774   if (ZIG_HOST_TARGET_OS MATCHES "(solaris|illumos)")
775     set(ZIG_HOST_TARGET_ARCH "x86_64")
776   else()
777     set(ZIG_HOST_TARGET_ARCH "x86")
778   endif()
779 elseif(ZIG_HOST_TARGET_ARCH STREQUAL "amd64")
780   set(ZIG_HOST_TARGET_ARCH "x86_64")
781 elseif(ZIG_HOST_TARGET_ARCH STREQUAL "arm64")
782   set(ZIG_HOST_TARGET_ARCH "aarch64")
783 elseif(ZIG_HOST_TARGET_ARCH STREQUAL "armv7l")
784   set(ZIG_HOST_TARGET_ARCH "arm")
785 elseif(ZIG_HOST_TARGET_ARCH STREQUAL "armv7b")
786   set(ZIG_HOST_TARGET_ARCH "armeb")
787 endif()
788 string(REGEX REPLACE "^((arm|thumb)(hf?)?)el$" "\\1" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}")
789 if(ZIG_HOST_TARGET_ARCH MATCHES "^arm(hf?)?(eb)?$")
790   check_symbol_exists(__thumb__ "" ZIG_HOST_TARGET_DEFAULTS_TO_THUMB)
791   if(ZIG_HOST_TARGET_DEFAULTS_TO_THUMB)
792     string(REGEX REPLACE "^arm" "thumb" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}")
793   endif()
794 endif()
795 string(REGEX REPLACE "^ppc((64)?(le)?)$" "powerpc\\1" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}")
797 if(MSVC)
798   set(ZIG_HOST_TARGET_ABI "-msvc")
799 elseif(MINGW)
800   set(ZIG_HOST_TARGET_ABI "-gnu")
801 elseif(ZIG_HOST_TARGET_ARCH MATCHES "^(arm|thumb)hf?(eb)?$")
802   string(REGEX REPLACE "^(arm|thumb)hf?((eb)?)$" "\\1\\2" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}")
803   set(ZIG_HOST_TARGET_ABI "-eabihf")
804 else()
805   set(ZIG_HOST_TARGET_ABI "")
806 endif()
808 set(ZIG_HOST_TARGET_TRIPLE "${ZIG_HOST_TARGET_ARCH}-${ZIG_HOST_TARGET_OS}${ZIG_HOST_TARGET_ABI}" CACHE STRING "Host zig target triple.")
810 if(MSVC)
811   set(ZIG_WASM2C_COMPILE_FLAGS "")
812   set(ZIG1_COMPILE_FLAGS "/Os")
813   set(ZIG2_COMPILE_FLAGS "/Od")
814   set(ZIG2_LINK_FLAGS "/STACK:16777216 /FORCE:MULTIPLE")
815 else()
816   set(ZIG_WASM2C_COMPILE_FLAGS "-std=c99 -O2")
817   set(ZIG1_COMPILE_FLAGS "-std=c99 -Os")
818   set(ZIG2_COMPILE_FLAGS "-std=c99 -O0 -fno-stack-protector")
819   if(APPLE)
820     set(ZIG2_LINK_FLAGS "-Wl,-stack_size,0x10000000")
821   elseif(MINGW)
822     set(ZIG2_LINK_FLAGS "-Wl,--stack,0x10000000")
823   # Solaris/illumos ld(1) does not provide a --stack-size option.
824   elseif(CMAKE_HOST_SOLARIS)
825     unset(ZIG2_LINK_FLAGS)
826   else()
827     set(ZIG2_LINK_FLAGS "-Wl,-z,stack-size=0x10000000")
828   endif()
829 endif()
831 set(ZIG1_WASM_MODULE "${PROJECT_SOURCE_DIR}/stage1/zig1.wasm")
832 set(ZIG1_C_SOURCE "${PROJECT_BINARY_DIR}/zig1.c")
833 set(ZIG2_C_SOURCE "${PROJECT_BINARY_DIR}/zig2.c")
834 set(ZIG_COMPILER_RT_C_SOURCE "${PROJECT_BINARY_DIR}/compiler_rt.c")
836 add_executable(zig-wasm2c ${ZIG_WASM2C_SOURCES})
837 set_target_properties(zig-wasm2c PROPERTIES COMPILE_FLAGS "${ZIG_WASM2C_COMPILE_FLAGS}")
839 add_custom_command(
840   OUTPUT "${ZIG1_C_SOURCE}"
841   COMMAND zig-wasm2c "${ZIG1_WASM_MODULE}" "${ZIG1_C_SOURCE}"
842   DEPENDS zig-wasm2c "${ZIG1_WASM_MODULE}"
843   COMMENT STATUS "Converting ${ZIG1_WASM_MODULE} to ${ZIG1_C_SOURCE}"
844   WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
847 add_executable(zig1 ${ZIG1_C_SOURCE} stage1/wasi.c)
848 set_target_properties(zig1 PROPERTIES COMPILE_FLAGS ${ZIG1_COMPILE_FLAGS})
850 if(MSVC)
851   target_link_options(zig1 PRIVATE /STACK:0x10000000)
852 else()
853   target_link_libraries(zig1 LINK_PUBLIC m)
854   if(MINGW)
855     target_link_options(zig1 PRIVATE -Wl,--stack,0x10000000)
856   endif()
857 endif()
859 set(BUILD_ZIG2_ARGS
860   "${PROJECT_SOURCE_DIR}/lib"
861   build-exe -ofmt=c -lc -OReleaseSmall
862   --name zig2
863   -femit-bin="${ZIG2_C_SOURCE}"
864   -target "${ZIG_HOST_TARGET_TRIPLE}"
865   --dep "build_options"
866   --dep "aro"
867   --mod "root" "src/main.zig"
868   --mod "build_options" "${ZIG_CONFIG_ZIG_OUT}"
869   --mod "aro" "lib/compiler/aro/aro.zig"
872 add_custom_command(
873   OUTPUT "${ZIG2_C_SOURCE}"
874   COMMAND zig1 ${BUILD_ZIG2_ARGS}
875   DEPENDS zig1 "${ZIG_STAGE2_SOURCES}"
876   COMMENT STATUS "Running zig1.wasm to produce ${ZIG2_C_SOURCE}"
877   WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
880 set(BUILD_COMPILER_RT_ARGS
881   "${PROJECT_SOURCE_DIR}/lib"
882   build-obj -ofmt=c -OReleaseSmall
883   --name compiler_rt
884   -femit-bin="${ZIG_COMPILER_RT_C_SOURCE}"
885   -target "${ZIG_HOST_TARGET_TRIPLE}"
886   --dep "build_options"
887   --mod "root" "lib/compiler_rt.zig"
888   --mod "build_options" "${ZIG_CONFIG_ZIG_OUT}"
891 add_custom_command(
892   OUTPUT "${ZIG_COMPILER_RT_C_SOURCE}"
893   COMMAND zig1 ${BUILD_COMPILER_RT_ARGS}
894   DEPENDS zig1 "${ZIG_STAGE2_SOURCES}"
895   COMMENT STATUS "Running zig1.wasm to produce ${ZIG_COMPILER_RT_C_SOURCE}"
896   WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
899 add_executable(zig2 ${ZIG2_C_SOURCE} ${ZIG_COMPILER_RT_C_SOURCE})
900 set_target_properties(zig2 PROPERTIES
901   COMPILE_FLAGS ${ZIG2_COMPILE_FLAGS}
902   LINK_FLAGS "${ZIG2_LINK_FLAGS}"
904 target_include_directories(zig2 PUBLIC stage1)
905 target_link_libraries(zig2 LINK_PUBLIC zigcpp)
907 if(MSVC)
908   target_link_libraries(zig2 LINK_PUBLIC ntdll.lib ws2_32.lib)
909 elseif(MINGW)
910   target_link_libraries(zig2 LINK_PUBLIC ntdll ws2_32)
911 endif()
913 if(NOT MSVC)
914     target_link_libraries(zig2 LINK_PUBLIC ${LIBXML2})
915 endif()
917 if(ZIG_DIA_GUIDS_LIB)
918     target_link_libraries(zig2 LINK_PUBLIC ${ZIG_DIA_GUIDS_LIB})
919 endif()
921 if(MSVC OR MINGW)
922     target_link_libraries(zig2 LINK_PUBLIC version)
923 endif()
926 # "-Dno-langref" and "-Dstd-docs=false" are hardcoded because they take too long to build.
927 # To obtain these two forms of documentation, run zig build against stage3 rather than stage2.
928 set(ZIG_BUILD_ARGS
929   --zig-lib-dir "${PROJECT_SOURCE_DIR}/lib"
931   "-Dversion-string=${RESOLVED_ZIG_VERSION}"
932   "-Dtarget=${ZIG_TARGET_TRIPLE}"
933   "-Dcpu=${ZIG_TARGET_MCPU}"
935   -Denable-llvm
936   "-Dconfig_h=${ZIG_CONFIG_H_OUT}"
938   -Dno-langref
939   -Dstd-docs=false
942 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
943   list(APPEND ZIG_BUILD_ARGS -Doptimize=Debug)
944 elseif("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
945   list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseFast)
946 else()
947   list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseFast -Dstrip)
948 endif()
950 if(ZIG_STATIC AND NOT MSVC)
951   list(APPEND ZIG_BUILD_ARGS -Duse-zig-libcxx)
952 endif()
954 if(ZIG_NO_LIB)
955   list(APPEND ZIG_BUILD_ARGS -Dno-lib)
956 endif()
958 if(ZIG_SINGLE_THREADED)
959   list(APPEND ZIG_BUILD_ARGS -Dsingle-threaded)
960 endif()
962 if(ZIG_PIE)
963   list(APPEND ZIG_BUILD_ARGS -Dpie)
964 endif()
966 if(NOT "${ZIG_TARGET_DYNAMIC_LINKER}" STREQUAL "")
967   list(APPEND ZIG_BUILD_ARGS "-Ddynamic-linker=${ZIG_TARGET_DYNAMIC_LINKER}")
968 endif()
971 add_custom_target(stage3 ALL
972   DEPENDS "${PROJECT_BINARY_DIR}/stage3/bin/zig"
975 set(ZIG2_WORKING_DIR "${PROJECT_SOURCE_DIR}")
977 add_custom_command(
978   OUTPUT "${PROJECT_BINARY_DIR}/stage3/bin/zig"
979   COMMAND zig2 build --prefix "${PROJECT_BINARY_DIR}/stage3" ${ZIG_BUILD_ARGS}
980   COMMENT STATUS "Building stage3"
981   WORKING_DIRECTORY "${ZIG2_WORKING_DIR}"
984 if(WIN32)
985   set(ZIG_EXECUTABLE "${PROJECT_BINARY_DIR}/zig2.exe")
986 else()
987   set(ZIG_EXECUTABLE "${PROJECT_BINARY_DIR}/zig2")
988 endif()
990 install(CODE "set(ZIG_EXECUTABLE \"${ZIG_EXECUTABLE}\")")
991 install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")")
992 install(CODE "set(ZIG2_WORKING_DIR \"${ZIG2_WORKING_DIR}\")")
993 install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
994 install(SCRIPT cmake/install.cmake)