authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-01 18:45:19-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-03 09:52:14-07:00
log5c441f7f8abe31f21e53169c05c8816d8b4c89e3
tree02c9cfd4b376543470d4f0b22228f040094fa064
parent8e687cb0d994568879a98a94585562294e3dea36

cmake: find LLVM libraries unambiguously

Before, we would end up with the LLVM_LIBRARIES variable containing, for example, "-lLLVMAnalysis;-lz" and the Zig compiler CLI would be stuck with ambiguous library names. In this branch, that ambiguity is not allowed; it will look for a dynamically linked LLVMAnalysis and fail to find it in the case that the build of LLVM is static. With this change, LLVM_LIBRARIES will contain, for example, "/full/path/to/libLLVMAnalysis.a;-lz" and it is unambiguous that the first library should be linked statically and the second dynamically. In the case of a dynamically linked system LLVM, it will look like "/full/path/to/libLLVM.so;-lz" which again is fully unambiguous. This fixes building Zig from source.

1 files changed, 21 insertions(+), 57 deletions(-)

cmake/Findllvm.cmake+21-57
......@@ -52,6 +52,8 @@ if(ZIG_USE_LLVM_CONFIG)
5252 set(STATIC_OR_SHARED_LINK "--link-shared")
5353 elseif (ZIG_STATIC_LLVM)
5454 set(STATIC_OR_SHARED_LINK "--link-static")
55 else()
56 set(STATIC_OR_SHARED_LINK "")
5557 endif()
5658
5759 execute_process(
......@@ -103,69 +105,31 @@ if(ZIG_USE_LLVM_CONFIG)
103105 break()
104106 endwhile()
105107
106 if(ZIG_SHARED_LLVM OR ZIG_STATIC_LLVM)
107 execute_process(
108 COMMAND ${LLVM_CONFIG_EXE} --libfiles ${STATIC_OR_SHARED_LINK}
109 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
110 OUTPUT_STRIP_TRAILING_WHITESPACE)
111 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
112108
113 execute_process(
114 COMMAND ${LLVM_CONFIG_EXE} --libdir ${STATIC_OR_SHARED_LINK}
115 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
116 OUTPUT_STRIP_TRAILING_WHITESPACE)
117 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
118
119 execute_process(
120 COMMAND ${LLVM_CONFIG_EXE} --system-libs ${STATIC_OR_SHARED_LINK}
121 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
122 OUTPUT_STRIP_TRAILING_WHITESPACE)
123 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
109 execute_process(
110 COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
111 OUTPUT_VARIABLE LLVM_LINK_MODE
112 OUTPUT_STRIP_TRAILING_WHITESPACE)
124113
125 execute_process(
126 COMMAND ${LLVM_CONFIG_EXE} --shared-mode ${STATIC_OR_SHARED_LINK}
127 OUTPUT_VARIABLE LLVM_LINK_MODE
114 execute_process(
115 COMMAND ${LLVM_CONFIG_EXE} --libfiles ${STATIC_OR_SHARED_LINK}
116 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
128117 OUTPUT_STRIP_TRAILING_WHITESPACE)
129 else()
130 execute_process(
131 COMMAND ${LLVM_CONFIG_EXE} --libs
132 OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES
133 OUTPUT_STRIP_TRAILING_WHITESPACE)
134 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
118 string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}")
135119
136 execute_process(
137 COMMAND ${LLVM_CONFIG_EXE} --libdir
138 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
139 OUTPUT_STRIP_TRAILING_WHITESPACE)
140 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
141
142 execute_process(
143 COMMAND ${LLVM_CONFIG_EXE} --system-libs
144 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
145 OUTPUT_STRIP_TRAILING_WHITESPACE)
146 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
147
148 execute_process(
149 COMMAND ${LLVM_CONFIG_EXE} --shared-mode
150 OUTPUT_VARIABLE LLVM_LINK_MODE
120 execute_process(
121 COMMAND ${LLVM_CONFIG_EXE} --libdir ${STATIC_OR_SHARED_LINK}
122 OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES
151123 OUTPUT_STRIP_TRAILING_WHITESPACE)
152 endif()
124 string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}")
153125
154 if (${LLVM_LINK_MODE} STREQUAL "shared")
155 # We always ask for the system libs corresponding to static linking,
156 # since on some distros LLD is only available as a static library
157 # and we need these libraries to link it successfully
158 execute_process(
159 COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static
160 OUTPUT_VARIABLE LLVM_STATIC_SYSTEM_LIBS_SPACES
161 ERROR_QUIET # Some installations have no static libs, we just ignore the failure
162 OUTPUT_STRIP_TRAILING_WHITESPACE)
163 string(REPLACE " " ";" LLVM_STATIC_SYSTEM_LIBS "${LLVM_STATIC_SYSTEM_LIBS_SPACES}")
126 execute_process(
127 COMMAND ${LLVM_CONFIG_EXE} --system-libs ${STATIC_OR_SHARED_LINK}
128 OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES
129 OUTPUT_STRIP_TRAILING_WHITESPACE)
130 string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}")
164131
165 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS} ${LLVM_STATIC_SYSTEM_LIBS})
166 else()
167 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
168 endif()
132 set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
169133
170134 execute_process(
171135 COMMAND ${LLVM_CONFIG_EXE} --includedir
......@@ -373,4 +337,4 @@ endif()
373337include(FindPackageHandleStandardArgs)
374338find_package_handle_standard_args(llvm DEFAULT_MSG LLVM_LIBRARIES LLVM_INCLUDE_DIRS)
375339
376mark_as_advanced(LLVM_INCLUDE_DIRS LLVM_LIBRARIES LLVM_LIBDIRS)
340mark_as_advanced(LLVM_INCLUDE_DIRS LLVM_LIBRARIES LLVM_LIBDIRS LLVM_LINK_MODE)