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