Commit 69aa09948b

Andrew Kelley <andrew@ziglang.org>
2020-03-28 04:43:21
cmake: support cross compiling
1 parent 107b519
Changed files (3)
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)
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);
 
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)