@@ -35,6 +35,13 @@ include_directories(deps/cppdecl/include)
3535
3636
3737option (MRBIND_STATIC_BUILD "Build the parser and the generators as static binaries." OFF )
38+ option (MRBIND_FORCE_LLVM_STATIC "Use llvm-config to get LLVM static libraries for linking." OFF )
39+ # helper function to link statically with libstdc++ on some platforms
40+ function (apply_static_stdlib tgt )
41+ if (NOT APPLE AND NOT MSVC )
42+ target_link_libraries (${tgt} PRIVATE -static-libstdc++ -static-libgcc )
43+ endif ()
44+ endfunction ()
3845
3946
4047add_library (mrbind_common STATIC
@@ -61,7 +68,7 @@ if(MRBIND_BUILD_PARSER)
6168 src/parser/multiplex_data.cpp
6269 )
6370
64- if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
71+ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" )
6572 set_source_files_properties (src/parser/disable_rtti.cpp PROPERTIES COMPILE_FLAGS -fno-rtti)
6673 endif ()
6774
@@ -72,11 +79,60 @@ if(MRBIND_BUILD_PARSER)
7279 target_include_directories (mrbind PRIVATE ${LLVM_INCLUDE_DIR} ${CLANG_INCLUDE_DIR} )
7380
7481 if (MRBIND_STATIC_BUILD)
75- target_link_libraries (mrbind PRIVATE -static-libstdc++ -static-libgcc )
76- if (NOT TARGET clangTooling)
77- message (FATAL_ERROR "clangTooling is required for static builds" )
82+ if (MRBIND_FORCE_LLVM_STATIC)
83+ # by default libclang static libraries try to link with dynamic libLLVM
84+ function (recurse_remove_llvm tgt )
85+ if (TARGET ${tgt} )
86+ get_target_property (lib_deps ${tgt} INTERFACE_LINK_LIBRARIES )
87+ if (lib_deps)
88+ list (REMOVE_ITEM lib_deps LLVM)
89+ set_target_properties (${tgt} PROPERTIES INTERFACE_LINK_LIBRARIES "${lib_deps} " )
90+ foreach (dep ${lib_deps} )
91+ recurse_remove_llvm (${dep} )
92+ endforeach ()
93+ endif ()
94+ endif ()
95+ endfunction ()
96+ recurse_remove_llvm (clangTooling )
97+
98+ # link with static LLVM libraries explicitly
99+ execute_process (
100+ COMMAND llvm-config --libdir
101+ OUTPUT_VARIABLE LLVM_LIBDIR
102+ OUTPUT_STRIP_TRAILING_WHITESPACE
103+ )
104+ execute_process (
105+ COMMAND llvm-config --link-static --libs
106+ OUTPUT_VARIABLE LLVM_STATIC_LIBS
107+ OUTPUT_STRIP_TRAILING_WHITESPACE
108+ )
109+ execute_process (
110+ COMMAND llvm-config --link-static --system-libs
111+ OUTPUT_VARIABLE LLVM_SYSTEM_LIBS
112+ OUTPUT_STRIP_TRAILING_WHITESPACE
113+ )
114+ separate_arguments (LLVM_STATIC_LIBS )
115+ separate_arguments (LLVM_SYSTEM_LIBS )
116+
117+ # link with static unwind
118+ find_library (UNWIND_STATIC NAMES libunwind.a PATHS ${LLVM_LIBDIR} NO_DEFAULT_PATH )
119+
120+ # macOS quirk: force replace dynamic zstd with static
121+ if ("-lzstd" IN_LIST LLVM_SYSTEM_LIBS)
122+ find_library (ZSTD_STATIC NAMES libzstd.a REQUIRED )
123+ list (REMOVE_ITEM LLVM_SYSTEM_LIBS "-lzstd" )
124+ list (APPEND LLVM_SYSTEM_LIBS ${ZSTD_STATIC} )
125+ endif ()
126+
127+ target_link_directories (mrbind PRIVATE ${LLVM_LIBDIR} )
128+ target_link_libraries (mrbind PRIVATE clangTooling ${LLVM_STATIC_LIBS} ${LLVM_SYSTEM_LIBS} ${UNWIND_STATIC} )
129+ else ()
130+ apply_static_stdlib (mrbind )
131+ if (NOT TARGET clangTooling)
132+ message (FATAL_ERROR "clangTooling is required for static builds" )
133+ endif ()
134+ target_link_libraries (mrbind PRIVATE clangTooling )
78135 endif ()
79- target_link_libraries (mrbind PRIVATE clangTooling )
80136 else ()
81137 # Clang lets you choose between large dynamic libraries, and fine-grained static libraries.
82138 # Those are the large dynamic ones. If they are not available for some reason,
@@ -138,7 +194,7 @@ if(MRBIND_BUILD_GENERATOR_C)
138194 mrbind_c_interop
139195 )
140196 if (MRBIND_STATIC_BUILD)
141- target_link_libraries (mrbind_gen_c PRIVATE -static-libstdc++ -static-libgcc )
197+ apply_static_stdlib (mrbind_gen_c )
142198 endif ()
143199endif ()
144200
@@ -156,6 +212,6 @@ if(MRBIND_BUILD_GENERATOR_CSHARP)
156212 mrbind_c_interop
157213 )
158214 if (MRBIND_STATIC_BUILD)
159- target_link_libraries (mrbind_gen_csharp PRIVATE -static-libstdc++ -static-libgcc )
215+ apply_static_stdlib (mrbind_gen_csharp )
160216 endif ()
161217endif ()
0 commit comments