authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-27 23:43:21-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-27 23:43:21-04:00
log69aa09948b2463076ef22a550cb5d2483730ecaf
tree5f077ea69e3643cf4d064cb1e399582cb8d2ce1b
parent107b5196f65c4e77c6c61ff830d6eb7de8b8842b
signaturelock-open Commit is signed but in an unrecognized format.

cmake: support cross compiling


3 files changed, 141 insertions(+), 123 deletions(-)

CMakeLists.txt+24-10
......@@ -62,6 +62,9 @@ option(ZIG_TEST_COVERAGE "Build Zig with test coverage instrumentation" OFF)
6262# LLD to the tree. This option does nothing.
6363option(ZIG_FORCE_EXTERNAL_LLD "does nothing" OFF)
6464
65set(ZIG_TARGET_TRIPLE "native" CACHE STRING "arch-os-abi to output binaries for")
66set(ZIG_EXECUTABLE "" CACHE STRING "(when cross compiling) path to already-built zig binary")
67
6568find_package(llvm)
6669find_package(clang)
6770find_package(lld)
......@@ -338,7 +341,7 @@ if(MSVC)
338341 if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT "${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
339342 set(EXE_LDFLAGS "${EXE_LDFLAGS} /debug:fastlink")
340343 endif()
341elseif(MINGW)
344elseif(MINGW)
342345 set(EXE_LDFLAGS "${EXE_LDFLAGS} -Wl,--stack,16777216")
343346endif()
344347
......@@ -353,7 +356,7 @@ if(ZIG_STATIC)
353356else()
354357 if(MINGW)
355358 set(EXE_LDFLAGS "${EXE_LDFLAGS} -lz3")
356 endif()
359 endif()
357360endif()
358361
359362if(ZIG_TEST_COVERAGE)
......@@ -424,6 +427,7 @@ endif()
424427
425428set(BUILD_LIBSTAGE2_ARGS "build-lib"
426429 "src-self-hosted/stage2.zig"
430 -target "${ZIG_TARGET_TRIPLE}"
427431 -mcpu=baseline
428432 --name zigstage2
429433 --override-lib-dir "${CMAKE_SOURCE_DIR}/lib"
......@@ -436,12 +440,22 @@ set(BUILD_LIBSTAGE2_ARGS "build-lib"
436440 ${LIBSTAGE2_WINDOWS_ARGS}
437441)
438442
439add_custom_target(zig_build_libstage2 ALL
440 COMMAND zig0 ${BUILD_LIBSTAGE2_ARGS}
441 DEPENDS zig0
442 BYPRODUCTS "${LIBSTAGE2}"
443 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
444)
443if("${ZIG_TARGET_TRIPLE}" STREQUAL "native")
444 add_custom_target(zig_build_libstage2 ALL
445 COMMAND zig0 ${BUILD_LIBSTAGE2_ARGS}
446 DEPENDS zig0
447 BYPRODUCTS "${LIBSTAGE2}"
448 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
449 )
450 set(ZIG_EXECUTABLE "${zig_BINARY_DIR}/zig")
451else()
452 add_custom_target(zig_build_libstage2 ALL
453 COMMAND "${ZIG_EXECUTABLE}" ${BUILD_LIBSTAGE2_ARGS}
454 BYPRODUCTS "${LIBSTAGE2}"
455 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
456 )
457endif()
458
445459add_executable(zig "${ZIG_MAIN_SRC}")
446460
447461set_target_properties(zig PROPERTIES
......@@ -451,7 +465,7 @@ set_target_properties(zig PROPERTIES
451465target_link_libraries(zig zigcompiler "${LIBSTAGE2}")
452466if(MSVC)
453467 target_link_libraries(zig ntdll.lib)
454elseif(MINGW)
468elseif(MINGW)
455469 target_link_libraries(zig ntdll)
456470endif()
457471add_dependencies(zig zig_build_libstage2)
......@@ -480,7 +494,7 @@ if(MSVC)
480494 endif()
481495else()
482496 get_target_property(zig_BINARY_DIR zig BINARY_DIR)
483 install(CODE "set(zig_EXE \"${zig_BINARY_DIR}/zig\")")
497 install(CODE "set(zig_EXE \"${ZIG_EXECUTABLE}\")")
484498 install(CODE "set(ZIG_INSTALL_ARGS \"${ZIG_INSTALL_ARGS}\")")
485499 install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
486500 install(SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install.cmake)
cmake/Findllvm.cmake+113-113
......@@ -7,7 +7,119 @@
77# LLVM_LIBRARIES
88# LLVM_LIBDIRS
99
10if(ZIG_CROSSCOMPILING)
10if("${ZIG_TARGET_TRIPLE}" STREQUAL "native")
11 find_program(LLVM_CONFIG_EXE
12 NAMES llvm-config-10 llvm-config-10.0 llvm-config100 llvm-config
13 PATHS
14 "/mingw64/bin"
15 "/c/msys64/mingw64/bin"
16 "c:/msys64/mingw64/bin"
17 "C:/Libraries/llvm-10.0.0/bin")
18
19 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
20 message(FATAL_ERROR "unable to find llvm-config")
21 endif()
22
23 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
24 message(FATAL_ERROR "unable to find llvm-config")
25 endif()
26
27 execute_process(
28 COMMAND ${LLVM_CONFIG_EXE} --version
29 OUTPUT_VARIABLE LLVM_CONFIG_VERSION
30 OUTPUT_STRIP_TRAILING_WHITESPACE)
31
32 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 10)
33 message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}")
34 endif()
35 if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 11)
36 message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}")
37 endif()
38 if("${LLVM_CONFIG_VERSION}" VERSION_GREATER 11)
39 message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}")
40 endif()
41
42 execute_process(
43 COMMAND ${LLVM_CONFIG_EXE} --targets-built
44 OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES
45 OUTPUT_STRIP_TRAILING_WHITESPACE)
46 string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}")
47 function(NEED_TARGET TARGET_NAME)
48 list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index)
49 if (${_index} EQUAL -1)
50 message(FATAL_ERROR "LLVM is missing target ${TARGET_NAME}. Zig requires LLVM to be built with all default targets enabled.")
51 endif()
52 endfunction(NEED_TARGET)
53 NEED_TARGET("AArch64")
54 NEED_TARGET("AMDGPU")
55 NEED_TARGET("ARM")
56 NEED_TARGET("BPF")
57 NEED_TARGET("Hexagon")
58 NEED_TARGET("Lanai")
59 NEED_TARGET("Mips")
60 NEED_TARGET("MSP430")
61 NEED_TARGET("NVPTX")
62 NEED_TARGET("PowerPC")
63 NEED_TARGET("RISCV")
64 NEED_TARGET("Sparc")
65 NEED_TARGET("SystemZ")
66 NEED_TARGET("WebAssembly")
67 NEED_TARGET("X86")
68 NEED_TARGET("XCore")
69
70 if(ZIG_STATIC_LLVM)
71 execute_process(
72 COMMAND ${LLVM_CONFIG_EXE} --libfiles --link-static
73 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
74 OUTPUT_STRIP_TRAILING_WHITESPACE)
75 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
76
77 execute_process(
78 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
79 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
80 OUTPUT_STRIP_TRAILING_WHITESPACE)
81 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
82
83 execute_process(
84 COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static
85 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
86 OUTPUT_STRIP_TRAILING_WHITESPACE)
87 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
88 endif()
89 if(NOT LLVM_LIBRARIES)
90 execute_process(
91 COMMAND ${LLVM_CONFIG_EXE} --libs
92 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
93 OUTPUT_STRIP_TRAILING_WHITESPACE)
94 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
95
96 execute_process(
97 COMMAND ${LLVM_CONFIG_EXE} --system-libs
98 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
99 OUTPUT_STRIP_TRAILING_WHITESPACE)
100 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
101
102 execute_process(
103 COMMAND ${LLVM_CONFIG_EXE} --libdir
104 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
105 OUTPUT_STRIP_TRAILING_WHITESPACE)
106 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
107 endif()
108
109 execute_process(
110 COMMAND ${LLVM_CONFIG_EXE} --includedir
111 OUTPUT_VARIABLE LLVM_INCLUDE_DIRS
112 OUTPUT_STRIP_TRAILING_WHITESPACE)
113
114 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
115
116 if(NOT LLVM_LIBRARIES)
117 find_library(LLVM_LIBRARIES NAMES LLVM LLVM-10 LLVM-10.0)
118 endif()
119
120 link_directories("${CMAKE_PREFIX_PATH}/lib")
121 link_directories("${LLVM_LIBDIRS}")
122else()
11123 # Here we assume that we're cross compiling with Zig, of course. No reason
12124 # to support more complicated setups. We also assume the experimental target
13125 # AVR is enabled.
......@@ -189,118 +301,6 @@ if(ZIG_CROSSCOMPILING)
189301 FIND_AND_ADD_LLVM_LIB(LLVMAArch64Info)
190302 FIND_AND_ADD_LLVM_LIB(LLVMSupport)
191303 FIND_AND_ADD_LLVM_LIB(LLVMDemangle)
192else()
193 find_program(LLVM_CONFIG_EXE
194 NAMES llvm-config-10 llvm-config-10.0 llvm-config100 llvm-config
195 PATHS
196 "/mingw64/bin"
197 "/c/msys64/mingw64/bin"
198 "c:/msys64/mingw64/bin"
199 "C:/Libraries/llvm-10.0.0/bin")
200
201 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
202 message(FATAL_ERROR "unable to find llvm-config")
203 endif()
204
205 if ("${LLVM_CONFIG_EXE}" STREQUAL "LLVM_CONFIG_EXE-NOTFOUND")
206 message(FATAL_ERROR "unable to find llvm-config")
207 endif()
208
209 execute_process(
210 COMMAND ${LLVM_CONFIG_EXE} --version
211 OUTPUT_VARIABLE LLVM_CONFIG_VERSION
212 OUTPUT_STRIP_TRAILING_WHITESPACE)
213
214 if("${LLVM_CONFIG_VERSION}" VERSION_LESS 10)
215 message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}")
216 endif()
217 if("${LLVM_CONFIG_VERSION}" VERSION_EQUAL 11)
218 message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}")
219 endif()
220 if("${LLVM_CONFIG_VERSION}" VERSION_GREATER 11)
221 message(FATAL_ERROR "expected LLVM 10.x but found ${LLVM_CONFIG_VERSION}")
222 endif()
223
224 execute_process(
225 COMMAND ${LLVM_CONFIG_EXE} --targets-built
226 OUTPUT_VARIABLE LLVM_TARGETS_BUILT_SPACES
227 OUTPUT_STRIP_TRAILING_WHITESPACE)
228 string(REPLACE " " ";" LLVM_TARGETS_BUILT "${LLVM_TARGETS_BUILT_SPACES}")
229 function(NEED_TARGET TARGET_NAME)
230 list (FIND LLVM_TARGETS_BUILT "${TARGET_NAME}" _index)
231 if (${_index} EQUAL -1)
232 message(FATAL_ERROR "LLVM is missing target ${TARGET_NAME}. Zig requires LLVM to be built with all default targets enabled.")
233 endif()
234 endfunction(NEED_TARGET)
235 NEED_TARGET("AArch64")
236 NEED_TARGET("AMDGPU")
237 NEED_TARGET("ARM")
238 NEED_TARGET("BPF")
239 NEED_TARGET("Hexagon")
240 NEED_TARGET("Lanai")
241 NEED_TARGET("Mips")
242 NEED_TARGET("MSP430")
243 NEED_TARGET("NVPTX")
244 NEED_TARGET("PowerPC")
245 NEED_TARGET("RISCV")
246 NEED_TARGET("Sparc")
247 NEED_TARGET("SystemZ")
248 NEED_TARGET("WebAssembly")
249 NEED_TARGET("X86")
250 NEED_TARGET("XCore")
251
252 if(ZIG_STATIC_LLVM)
253 execute_process(
254 COMMAND ${LLVM_CONFIG_EXE} --libfiles --link-static
255 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
256 OUTPUT_STRIP_TRAILING_WHITESPACE)
257 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
258
259 execute_process(
260 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
261 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
262 OUTPUT_STRIP_TRAILING_WHITESPACE)
263 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
264
265 execute_process(
266 COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static
267 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
268 OUTPUT_STRIP_TRAILING_WHITESPACE)
269 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
270 endif()
271 if(NOT LLVM_LIBRARIES)
272 execute_process(
273 COMMAND ${LLVM_CONFIG_EXE} --libs
274 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
275 OUTPUT_STRIP_TRAILING_WHITESPACE)
276 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
277
278 execute_process(
279 COMMAND ${LLVM_CONFIG_EXE} --system-libs
280 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
281 OUTPUT_STRIP_TRAILING_WHITESPACE)
282 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
283
284 execute_process(
285 COMMAND ${LLVM_CONFIG_EXE} --libdir
286 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
287 OUTPUT_STRIP_TRAILING_WHITESPACE)
288 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
289 endif()
290
291 execute_process(
292 COMMAND ${LLVM_CONFIG_EXE} --includedir
293 OUTPUT_VARIABLE LLVM_INCLUDE_DIRS
294 OUTPUT_STRIP_TRAILING_WHITESPACE)
295
296 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
297
298 if(NOT LLVM_LIBRARIES)
299 find_library(LLVM_LIBRARIES NAMES LLVM LLVM-10 LLVM-10.0)
300 endif()
301
302 link_directories("${CMAKE_PREFIX_PATH}/lib")
303 link_directories("${LLVM_LIBDIRS}")
304304endif()
305305
306306include(FindPackageHandleStandardArgs)
src/stage2.cpp+4
......@@ -197,6 +197,10 @@ Error stage2_target_parse(struct ZigTarget *target, const char *zig_triple, cons
197197{
198198 Error err;
199199
200 if (zig_triple != nullptr && strcmp(zig_triple, "native") == 0) {
201 zig_triple = nullptr;
202 }
203
200204 if (zig_triple == nullptr) {
201205 get_native_target(target);
202206