╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ CMakeLists.txt ───────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
469 470 # The /RTC[c][s][u] flag enables extra runtime checks. ("/RTC1" == "/RTCsu") 471 # The "c" (PossibleDataLoss) and "u" (UninitializeVariable) flags trap on valid C code so we disable 472 # them. The "s" flag seems like it might be OK. 473 string(REPLACE "/RTC1" "/RTCs" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") 474 string(REPLACE "/RTC1" "/RTCs" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") 475 endif() 476 477 configure_file ( 478 stage1/config.h.in 479 "${ZIG_CONFIG_H_OUT}" 480 ) 481 configure_file ( 482 stage1/config.zig.in 483 "${ZIG_CONFIG_ZIG_OUT}" 484 ) 485 486 # zigcpp target 487 488 set(ZIGCPP_OUTPUT_DIR "${PROJECT_BINARY_DIR}/zigcpp") 489 490 add_library(zigcpp STATIC ${ZIG_CPP_SOURCES}) 491 492 # Sync with minimum C++ standard required to build LLVM 493 # and with "exe_cflags" in build.zig 494 target_compile_features(zigcpp PRIVATE cxx_std_17) 495 set_target_properties(zigcpp PROPERTIES POSITION_INDEPENDENT_CODE ${ZIG_PIE}) 496 497 if(LLVM_LINK_MODE STREQUAL "static") 498 target_compile_definitions(zigcpp PRIVATE 499 LLVM_BUILD_STATIC 500 CLANG_BUILD_STATIC 501 ) 502 endif() 503 504 if(NOT MSVC) 505 if(MINGW) 506 target_compile_options(zigcpp PRIVATE -Wno-format) 507 endif() 508 # Sync content below with "exe_cflags" in build.zig 509 target_compile_definitions(zigcpp PUBLIC 510 __STDC_CONSTANT_MACROS 511 __STDC_FORMAT_MACROS 512 __STDC_LIMIT_MACROS 513 514 _GNU_SOURCE 515 ) 516 target_compile_options(zigcpp PRIVATE 517 -fno-exceptions 518 -fno-rtti 519 -fno-stack-protector 520 521 -fvisibility-inlines-hidden 522 523 -Wno-type-limits 524 -Wno-missing-braces 525 -Wno-comment 526 ) 527 else() 528 target_compile_options(zigcpp PRIVATE /Zc:preprocessor) 529 set_property(TARGET zigcpp PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") 530 endif() 531 532 target_include_directories(zigcpp PUBLIC 533 ${CLANG_INCLUDE_DIRS} 534 ${LLVM_INCLUDE_DIRS} 535 ${LLD_INCLUDE_DIRS} 536 ) 537 target_link_libraries(zigcpp PUBLIC 538 ${CLANG_LIBRARIES} 539 ${LLD_LIBRARIES} 540 ${LLVM_LIBRARIES} 541 ${CMAKE_THREAD_LIBS_INIT} 542 ) 543 544 # Handle multi-config builds and place each into a common lib. The VS generator 545 # for example will append a Debug folder by default if not explicitly specified. 546 set_target_properties(zigcpp PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ZIGCPP_OUTPUT_DIR}) 547 foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES}) 548 string(TOUPPER ${CONFIG_TYPE} CONFIG_TYPE) 549 set_target_properties(zigcpp PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_TYPE} ${ZIGCPP_OUTPUT_DIR}) 550 endforeach() 551 552 # end of zigcpp target 553 554 include(CheckSymbolExists) 555 556 string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" ZIG_HOST_TARGET_OS) 557 if(ZIG_HOST_TARGET_OS STREQUAL "android") 558 set(ZIG_HOST_TARGET_OS "linux") 559 set(ZIG_HOST_TARGET_IS_ANDROID TRUE) 560 elseif(ZIG_HOST_TARGET_OS STREQUAL "darwin") 561 set(ZIG_HOST_TARGET_OS "macos") 562 elseif(ZIG_HOST_TARGET_OS STREQUAL "gnu") 563 set(ZIG_HOST_TARGET_OS "hurd") 564 elseif(ZIG_HOST_TARGET_OS STREQUAL "serenityos") 565 set(ZIG_HOST_TARGET_OS "serenity") 566 elseif(ZIG_HOST_TARGET_OS STREQUAL "sunos") 567 set(ZIG_HOST_TARGET_OS "illumos") 568 endif() 569 570 string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" ZIG_HOST_TARGET_ARCH) 571 if(ZIG_HOST_TARGET_ARCH MATCHES "^i[3-9]86$") 572 if (ZIG_HOST_TARGET_OS STREQUAL "illumos") 573 set(ZIG_HOST_TARGET_ARCH "x86_64") 574 else() 575 set(ZIG_HOST_TARGET_ARCH "x86") 576 endif() 577 elseif(ZIG_HOST_TARGET_ARCH STREQUAL "amd64") 578 set(ZIG_HOST_TARGET_ARCH "x86_64") 579 elseif(ZIG_HOST_TARGET_ARCH STREQUAL "arm64") 580 set(ZIG_HOST_TARGET_ARCH "aarch64") 581 elseif(ZIG_HOST_TARGET_ARCH MATCHES "^arm(el)?$" OR ZIG_HOST_TARGET_ARCH MATCHES "^armv[7-8]l$") 582 set(ZIG_HOST_TARGET_ARCH "arm") 583 elseif(ZIG_HOST_TARGET_ARCH STREQUAL "armeb" OR ZIG_HOST_TARGET_ARCH MATCHES "^armv[7-8]b$") 584 set(ZIG_HOST_TARGET_ARCH "armeb") 585 endif() 586 if(ZIG_HOST_TARGET_ARCH MATCHES "^arm(eb)?$") 587 check_symbol_exists(__thumb__ "" ZIG_HOST_TARGET_DEFAULTS_TO_THUMB) 588 if(ZIG_HOST_TARGET_DEFAULTS_TO_THUMB) 589 string(REGEX REPLACE "^arm" "thumb" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}") 590 endif() 591 endif() 592 string(REGEX REPLACE "^ppc((64)?(le)?)$" "powerpc\\1" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}") 593 594 set(ZIG_HOST_TARGET_ABI "") 595 if(MSVC) 596 set(ZIG_HOST_TARGET_ABI "-msvc") 597 elseif(MINGW) 598 set(ZIG_HOST_TARGET_ABI "-gnu") 599 elseif(ZIG_HOST_TARGET_IS_ANDROID) 600 if(ZIG_HOST_TARGET_ARCH STREQUAL "arm") 601 set(ZIG_HOST_TARGET_ABI "-androideabi") 602 else() 603 set(ZIG_HOST_TARGET_ABI "-android") 604 endif() 605 endif() 606 607 set(ZIG_HOST_TARGET_TRIPLE "${ZIG_HOST_TARGET_ARCH}-${ZIG_HOST_TARGET_OS}${ZIG_HOST_TARGET_ABI}" CACHE STRING "Host zig target triple.") 608 609 if(MSVC) 610 set(ZIG_WASM2C_COMPILE_FLAGS "") 611 set(ZIG1_COMPILE_FLAGS "/Os") 612 set(ZIG2_COMPILE_FLAGS "/Od") 613 set(ZIG2_LINK_FLAGS "/STACK:16777216 /FORCE:MULTIPLE") 614 else() 615 set(ZIG_WASM2C_COMPILE_FLAGS "-std=c99") 616 set(ZIG1_COMPILE_FLAGS "-std=c99 -Oz -fno-strict-aliasing") 617 set(ZIG2_COMPILE_FLAGS "-std=c99 -Oz -fno-sanitize=undefined -fno-stack-protector -fno-strict-aliasing") 618 if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND ZIG_HOST_TARGET_ARCH STREQUAL "s390x") 619 string(REPLACE -Oz -O0 ZIG2_COMPILE_FLAGS "${ZIG2_COMPILE_FLAGS}") # llvm 22 assertion failure 620 endif() 621 # Must match the condition in build.zig. 622 if(ZIG_HOST_TARGET_ARCH MATCHES "^(arm|thumb)(eb)?$" OR ZIG_HOST_TARGET_ARCH EQUAL "hexagon" OR ZIG_HOST_TARGET_ARCH MATCHES "^powerpc(64)?(le)?$") 623 set(ZIG1_COMPILE_FLAGS "${ZIG1_COMPILE_FLAGS} -ffunction-sections -fdata-sections") 624 set(ZIG2_COMPILE_FLAGS "${ZIG2_COMPILE_FLAGS} -ffunction-sections -fdata-sections") 625 endif() 626 if (CMAKE_C_COMPILER_ID STREQUAL "GNU") 627 # Prevent GCC from miscompiling 'zig2.c'. See also 'GCC_BUG_119085_PRESENT' workaround details in 'bootstrap.c'. 628 if ( 629 (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "10.0" AND 630 CMAKE_C_COMPILER_VERSION VERSION_LESS_EQUAL "13.4") OR 631 (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "14.0" AND 632 CMAKE_C_COMPILER_VERSION VERSION_LESS_EQUAL "14.3") OR 633 (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "15.0" AND 634 CMAKE_C_COMPILER_VERSION VERSION_LESS "15.2") 635 ) 636 set(ZIG2_COMPILE_FLAGS "${ZIG2_COMPILE_FLAGS} -fno-tree-sra") 637 endif() 638 639 # Prevent GCC from spamming false positive `-Waddress-of-packed-member` warnings in 'zig2.c'. 640 # See also 'GCC_BUG_94081_PRESENT' workaround details in 'bootstrap.c'. 641 set(ZIG2_COMPILE_FLAGS "${ZIG2_COMPILE_FLAGS} -Wno-address-of-packed-member") 642 endif() 643 endif() 644 645 set(ZIG1_WASM_MODULE "${PROJECT_SOURCE_DIR}/stage1/zig1.wasm") 646 set(ZIG1_C_SOURCE "${PROJECT_BINARY_DIR}/zig1.c") 647 set(ZIG2_C_SOURCE "${PROJECT_BINARY_DIR}/zig2.c") 648 set(ZIG_COMPILER_RT_C_SOURCE "${PROJECT_BINARY_DIR}/compiler_rt.c") 649 650 add_executable(zig-wasm2c ${ZIG_WASM2C_SOURCES}) 651 set_target_properties(zig-wasm2c PROPERTIES COMPILE_FLAGS "${ZIG_WASM2C_COMPILE_FLAGS}") 652 653 add_custom_command( 654 OUTPUT "${ZIG1_C_SOURCE}" 655 COMMAND zig-wasm2c "${ZIG1_WASM_MODULE}" "${ZIG1_C_SOURCE}" 656 DEPENDS zig-wasm2c "${ZIG1_WASM_MODULE}" 657 COMMENT "Converting ${ZIG1_WASM_MODULE} to ${ZIG1_C_SOURCE}" 658 WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" 659 ) 660 661 add_executable(zig1 ${ZIG1_C_SOURCE} stage1/wasi.c) 662 set_target_properties(zig1 PROPERTIES COMPILE_FLAGS ${ZIG1_COMPILE_FLAGS}) 663 664 if(MSVC) 665 target_link_options(zig1 PRIVATE /STACK:0x10000000) 666 else() 667 target_link_libraries(zig1 LINK_PUBLIC m) 668 if(MINGW) 669 target_link_options(zig1 PRIVATE -Wl,--stack,0x10000000) 670 endif() 671 endif() 672 673 set(BUILD_ZIG2_ARGS 674 "${PROJECT_SOURCE_DIR}/lib" 675 build-exe -ofmt=c -lc -OReleaseSmall 676 --name zig2 677 -femit-bin="${ZIG2_C_SOURCE}" 678 -target "${ZIG_HOST_TARGET_TRIPLE}" 679 --dep "build_options" 680 "-Mroot=src/main.zig" 681 "-Mbuild_options=${ZIG_CONFIG_ZIG_OUT}" 682 ) 683 684 add_custom_command( 685 OUTPUT "${ZIG2_C_SOURCE}" 686 COMMAND zig1 ${BUILD_ZIG2_ARGS} 687 DEPENDS zig1 "${ZIG_STAGE2_SOURCES}" 688 COMMENT "Running zig1.wasm to produce ${ZIG2_C_SOURCE}" 689 WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" 690 ) 691 692 set(BUILD_COMPILER_RT_ARGS 693 "${PROJECT_SOURCE_DIR}/lib" 694 build-obj -ofmt=c -OReleaseSmall 695 --name compiler_rt 696 -femit-bin="${ZIG_COMPILER_RT_C_SOURCE}" 697 -target "${ZIG_HOST_TARGET_TRIPLE}" 698 "-Mroot=lib/compiler_rt.zig" 699 ) 700 701 add_custom_command( 702 OUTPUT "${ZIG_COMPILER_RT_C_SOURCE}" 703 COMMAND zig1 ${BUILD_COMPILER_RT_ARGS} 704 DEPENDS zig1 "${ZIG_STAGE2_SOURCES}" 705 COMMENT "Running zig1.wasm to produce ${ZIG_COMPILER_RT_C_SOURCE}" 706 WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" 707 ) 708 709 add_executable(zig2 ${ZIG2_C_SOURCE} ${ZIG_COMPILER_RT_C_SOURCE}) 710 set_target_properties(zig2 PROPERTIES 711 COMPILE_FLAGS ${ZIG2_COMPILE_FLAGS} 712 LINK_FLAGS "${ZIG2_LINK_FLAGS}" 713 ) 714 target_include_directories(zig2 PUBLIC stage1) 715 target_link_libraries(zig2 LINK_PUBLIC zigcpp) 716 717 if(MSVC) 718 target_link_libraries(zig2 LINK_PUBLIC ntdll.lib ws2_32.lib) 719 elseif(MINGW) 720 target_link_libraries(zig2 LINK_PUBLIC ntdll ws2_32) 721 endif() 722 723 if(NOT MSVC) 724 target_link_libraries(zig2 LINK_PUBLIC ${LIBXML2}) 725 endif() 726 727 if(ZIG_DIA_GUIDS_LIB) 728 target_link_libraries(zig2 LINK_PUBLIC ${ZIG_DIA_GUIDS_LIB}) 729 endif() 730 731 if(MSVC OR MINGW) 732 target_link_libraries(zig2 LINK_PUBLIC version) 733 endif() 734 735 736 set(ZIG_BUILD_ARGS 737 "--zig-lib=${PROJECT_SOURCE_DIR}/lib" 738 739 "-Dversion-string=${RESOLVED_ZIG_VERSION}" 740 "-Dtarget=${ZIG_TARGET_TRIPLE}" 741 "-Dcpu=${ZIG_TARGET_MCPU}" 742 743 -Denable-llvm 744 "-Dconfig_h=${ZIG_CONFIG_H_OUT}" 745 ) 746 747 set(ZIG_EXTRA_BUILD_ARGS "" CACHE STRING "Extra zig build args") 748 if(ZIG_EXTRA_BUILD_ARGS) 749 list(APPEND ZIG_BUILD_ARGS ${ZIG_EXTRA_BUILD_ARGS}) 750 endif() 751 752 set(ZIG_RELEASE_SAFE OFF CACHE BOOL "Build Zig as ReleaseSafe (with debug assertions on)") 753 754 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") 755 list(APPEND ZIG_BUILD_ARGS -Doptimize=Debug) 756 else() 757 if("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel") 758 list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseSmall) 759 else() 760 # Release and RelWithDebInfo 761 if(ZIG_RELEASE_SAFE) 762 list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseSafe) 763 else() 764 list(APPEND ZIG_BUILD_ARGS -Doptimize=ReleaseFast) 765 endif() 766 if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") 767 list(APPEND ZIG_BUILD_ARGS -Dstrip) 768 endif() 769 endif() 770 endif() 771 772 if(ZIG_STATIC AND NOT MSVC) 773 list(APPEND ZIG_BUILD_ARGS -Duse-zig-libcxx) 774 endif() 775 776 if(ZIG_NO_LIB) 777 list(APPEND ZIG_BUILD_ARGS -Dno-lib) 778 endif() 779 780 if(ZIG_SINGLE_THREADED) 781 list(APPEND ZIG_BUILD_ARGS -Dsingle-threaded) 782 endif() 783 784 if(ZIG_PIE) 785 list(APPEND ZIG_BUILD_ARGS -Dpie) 786 endif() 787 788 if(NOT "${ZIG_TARGET_DYNAMIC_LINKER}" STREQUAL "") 789 list(APPEND ZIG_BUILD_ARGS "-Ddynamic-linker=${ZIG_TARGET_DYNAMIC_LINKER}") 790 endif() 791 792 793 add_custom_target(stage3 ALL 794 DEPENDS "${PROJECT_BINARY_DIR}/stage3/bin/zig" 795 ) 796 797 set(ZIG2_WORKING_DIR "${PROJECT_SOURCE_DIR}") 798 799 add_custom_command( 800 OUTPUT "${PROJECT_BINARY_DIR}/stage3/bin/zig" 801 COMMAND zig2 build ${ZIG_BUILD_ARGS} --prefix "${PROJECT_BINARY_DIR}/stage3" 802 COMMENT "Building stage3" 803 WORKING_DIRECTORY "${ZIG2_WORKING_DIR}" 804 ) 805 806 set(ZIG_EXECUTABLE "$<TARGET_FILE:zig2>") 807 808 install(CODE "set(ZIG_EXECUTABLE \"${ZIG_EXECUTABLE}\")") 809 install(CODE "set(ZIG_BUILD_ARGS \"${ZIG_BUILD_ARGS}\")") 810 install(CODE "set(ZIG2_WORKING_DIR \"${ZIG2_WORKING_DIR}\")") 811 install(CODE "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")") 812 install(SCRIPT cmake/install.cmake) 813