diff --git a/CMakeLists.txt b/CMakeLists.txt index 97608cddfc..9e54f8cf6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,9 @@ option(ZIG_TEST_COVERAGE "Build Zig with test coverage instrumentation" OFF) # LLD to the tree. This option does nothing. option(ZIG_FORCE_EXTERNAL_LLD "does nothing" OFF) +set(ZIG_TARGET_TRIPLE "native" CACHE STRING "arch-os-abi to output binaries for") +set(ZIG_EXECUTABLE "" CACHE STRING "(when cross compiling) path to already-built zig binary") + find_package(llvm) find_package(clang) find_package(lld) @@ -338,7 +341,7 @@ if(MSVC) if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT "${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel") set(EXE_LDFLAGS "${EXE_LDFLAGS} /debug:fastlink") endif() -elseif(MINGW) +elseif(MINGW) set(EXE_LDFLAGS "${EXE_LDFLAGS} -Wl,--stack,16777216") endif() @@ -353,7 +356,7 @@ if(ZIG_STATIC) else() if(MINGW) set(EXE_LDFLAGS "${EXE_LDFLAGS} -lz3") - endif() + endif() endif() if(ZIG_TEST_COVERAGE) @@ -424,6 +427,7 @@ endif() set(BUILD_LIBSTAGE2_ARGS "build-lib" "src-self-hosted/stage2.zig" + -target "${ZIG_TARGET_TRIPLE}" -mcpu=baseline --name zigstage2 --override-lib-dir "${CMAKE_SOURCE_DIR}/lib" @@ -436,12 +440,22 @@ set(BUILD_LIBSTAGE2_ARGS "build-lib" ${LIBSTAGE2_WINDOWS_ARGS} ) -add_custom_target(zig_build_libstage2 ALL - COMMAND zig0 ${BUILD_LIBSTAGE2_ARGS} - DEPENDS zig0 - BYPRODUCTS "${LIBSTAGE2}" - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" -) +if("${ZIG_TARGET_TRIPLE}" STREQUAL "native") + add_custom_target(zig_build_libstage2 ALL + COMMAND zig0 ${BUILD_LIBSTAGE2_ARGS} + DEPENDS zig0 + BYPRODUCTS "${LIBSTAGE2}" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + ) + set(ZIG_EXECUTABLE "${zig_BINARY_DIR}/zig") +else() + add_custom_target(zig_build_libstage2 ALL + COMMAND "${ZIG_EXECUTABLE}" ${BUILD_LIBSTAGE2_ARGS} + BYPRODUCTS "${LIBSTAGE2}" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + ) +endif() + add_executable(zig "${ZIG_MAIN_SRC}") set_target_properties(zig PROPERTIES @@ -451,7 +465,7 @@ set_target_properties(zig PROPERTIES target_link_libraries(zig zigcompiler "${LIBSTAGE2}") if(MSVC) target_link_libraries(zig ntdll.lib) -elseif(MINGW) +elseif(MINGW) target_link_libraries(zig ntdll) endif() add_dependencies(zig zig_build_libstage2) @@ -480,7 +494,7 @@ if(MSVC) endif() else() get_target_property(zig_BINARY_DIR zig BINARY_DIR) - install(CODE "set(zig_EXE \"${zig_BINARY_DIR}/zig\")") + install(CODE "set(zig_EXE \"${ZIG_EXECUTABLE}\")") install(CODE "set(ZIG_INSTALL_ARGS \"${ZIG_INSTALL_ARGS}\")") install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")") install(SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install.cmake) diff --git a/cmake/Findllvm.cmake b/cmake/Findllvm.cmake index b3a2b14f3e..6819c23ee5 100644 --- a/cmake/Findllvm.cmake +++ b/cmake/Findllvm.cmake @@ -7,7 +7,119 @@ # LLVM_LIBRARIES # LLVM_LIBDIRS -if(ZIG_CROSSCOMPILING) +if("${ZIG_TARGET_TRIPLE}" STREQUAL "native") + find_program(LLVM_CONFIG_EXE + NAMES llvm-config-10 llvm-config-10.0 llvm-config100 llvm-config + PATHS + "/mingw64/bin" + "/c/msys64/mingw64/bin" + "c:/msys64/mingw64/bin" + "C:/Libraries/llvm-10.0.0/bin") + + if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND") + message(FATAL_ERROR "unable to find llvm-config") + endif() + + if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND") + message(FATAL_ERROR "unable to find llvm-config") + endif() + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --version + OUTPUT_VARIABLE LLVM_CONFIG_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if("${LLVM_CONFIG_VERSION}" VERSION_LESS 10) + message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}") + endif() + if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 11) + message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}") + endif() + if("${LLVM_CONFIG_VERSION}" VERSION_GREATER 11) + message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}") + endif() + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --targets-built + OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}") + function(NEED_TARGET TARGET_NAME) + list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index) + if (${_index} EQUAL -1) + message(FATAL_ERROR "LLVM is missing target ${TARGET_NAME}. Zig requires LLVM to be built with all default targets enabled.") + endif() + endfunction(NEED_TARGET) + NEED_TARGET("AArch64") + NEED_TARGET("AMDGPU") + NEED_TARGET("ARM") + NEED_TARGET("BPF") + NEED_TARGET("Hexagon") + NEED_TARGET("Lanai") + NEED_TARGET("Mips") + NEED_TARGET("MSP430") + NEED_TARGET("NVPTX") + NEED_TARGET("PowerPC") + NEED_TARGET("RISCV") + NEED_TARGET("Sparc") + NEED_TARGET("SystemZ") + NEED_TARGET("WebAssembly") + NEED_TARGET("X86") + NEED_TARGET("XCore") + + if(ZIG_STATIC_LLVM) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libfiles --link-static + OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}") + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static + OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static + OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") + endif() + if(NOT LLVM_LIBRARIES) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libs + OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}") + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --system-libs + OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libdir + OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") + endif() + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --includedir + OUTPUT_VARIABLE LLVM_INCLUDE_DIRS + OUTPUT_STRIP_TRAILING_WHITESPACE) + + set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS}) + + if(NOT LLVM_LIBRARIES) + find_library(LLVM_LIBRARIES NAMES LLVM LLVM-10 LLVM-10.0) + endif() + + link_directories("${CMAKE_PREFIX_PATH}/lib") + link_directories("${LLVM_LIBDIRS}") +else() # Here we assume that we're cross compiling with Zig, of course. No reason # to support more complicated setups. We also assume the experimental target # AVR is enabled. @@ -189,118 +301,6 @@ if(ZIG_CROSSCOMPILING) FIND_AND_ADD_LLVM_LIB(LLVMAArch64Info) FIND_AND_ADD_LLVM_LIB(LLVMSupport) FIND_AND_ADD_LLVM_LIB(LLVMDemangle) -else() - find_program(LLVM_CONFIG_EXE - NAMES llvm-config-10 llvm-config-10.0 llvm-config100 llvm-config - PATHS - "/mingw64/bin" - "/c/msys64/mingw64/bin" - "c:/msys64/mingw64/bin" - "C:/Libraries/llvm-10.0.0/bin") - - if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND") - message(FATAL_ERROR "unable to find llvm-config") - endif() - - if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND") - message(FATAL_ERROR "unable to find llvm-config") - endif() - - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --version - OUTPUT_VARIABLE LLVM_CONFIG_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - - if("${LLVM_CONFIG_VERSION}" VERSION_LESS 10) - message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}") - endif() - if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 11) - message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}") - endif() - if("${LLVM_CONFIG_VERSION}" VERSION_GREATER 11) - message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}") - endif() - - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --targets-built - OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}") - function(NEED_TARGET TARGET_NAME) - list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index) - if (${_index} EQUAL -1) - message(FATAL_ERROR "LLVM is missing target ${TARGET_NAME}. Zig requires LLVM to be built with all default targets enabled.") - endif() - endfunction(NEED_TARGET) - NEED_TARGET("AArch64") - NEED_TARGET("AMDGPU") - NEED_TARGET("ARM") - NEED_TARGET("BPF") - NEED_TARGET("Hexagon") - NEED_TARGET("Lanai") - NEED_TARGET("Mips") - NEED_TARGET("MSP430") - NEED_TARGET("NVPTX") - NEED_TARGET("PowerPC") - NEED_TARGET("RISCV") - NEED_TARGET("Sparc") - NEED_TARGET("SystemZ") - NEED_TARGET("WebAssembly") - NEED_TARGET("X86") - NEED_TARGET("XCore") - - if(ZIG_STATIC_LLVM) - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --libfiles --link-static - OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}") - - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static - OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") - - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static - OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") - endif() - if(NOT LLVM_LIBRARIES) - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --libs - OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}") - - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --system-libs - OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") - - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --libdir - OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") - endif() - - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --includedir - OUTPUT_VARIABLE LLVM_INCLUDE_DIRS - OUTPUT_STRIP_TRAILING_WHITESPACE) - - set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS}) - - if(NOT LLVM_LIBRARIES) - find_library(LLVM_LIBRARIES NAMES LLVM LLVM-10 LLVM-10.0) - endif() - - link_directories("${CMAKE_PREFIX_PATH}/lib") - link_directories("${LLVM_LIBDIRS}") endif() include(FindPackageHandleStandardArgs) diff --git a/src/stage2.cpp b/src/stage2.cpp index f8a485f93b..44e788b01c 100644 --- a/src/stage2.cpp +++ b/src/stage2.cpp @@ -197,6 +197,10 @@ Error stage2_target_parse(struct ZigTarget *target, const char *zig_triple, cons { Error err; + if (zig_triple != nullptr && strcmp(zig_triple, "native") == 0) { + zig_triple = nullptr; + } + if (zig_triple == nullptr) { get_native_target(target);