Skip to content

Commit 4c2c8ca

Browse files
authored
Detect musl in cmake and link with libunwind (#4645)
1 parent 59c0c60 commit 4c2c8ca

File tree

4 files changed

+27
-6
lines changed

4 files changed

+27
-6
lines changed

runtime/CMakeLists.txt

+16-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ set(RT_ARCHIVE_WITH_LDC ON CACHE STRING "Whet
4444
set(RT_CFLAGS "" CACHE STRING "Runtime extra C compiler flags, separated by ' '")
4545
set(LD_FLAGS "" CACHE STRING "Runtime extra C linker flags, separated by ' '")
4646
set(C_SYSTEM_LIBS AUTO CACHE STRING "C system libraries for linking shared libraries and test runners, separated by ';'")
47-
set(TARGET_SYSTEM AUTO CACHE STRING "Target OS/toolchain for cross-compilation (e.g., 'Linux;UNIX', 'Darwin;APPLE;UNIX', 'Windows;MSVC')")
47+
set(TARGET_SYSTEM AUTO CACHE STRING "Target OS/toolchain for cross-compilation (e.g., 'Linux;UNIX', 'Linux;UNIX;musl', 'Darwin;APPLE;UNIX', 'Windows;MSVC')")
4848
set(RT_SUPPORT_SANITIZERS OFF CACHE BOOL "Build runtime libraries with sanitizer support (e.g. for AddressSanitizer)")
4949

5050
set(CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
@@ -73,6 +73,17 @@ if("${TARGET_SYSTEM}" STREQUAL "AUTO")
7373
endif()
7474
if(UNIX)
7575
list(APPEND TARGET_SYSTEM "UNIX")
76+
77+
# Determines if host system uses musl libc
78+
execute_process(COMMAND ldd /bin/ls OUTPUT_VARIABLE OUTPUT ERROR_VARIABLE OUTPUT RESULT_VARIABLE RETVAL)
79+
if(NOT ${RETVAL})
80+
if("${OUTPUT}" MATCHES "-musl-" )
81+
if(NOT CMAKE_REQUIRED_QUIET)
82+
message(STATUS "Detected musl libc")
83+
endif()
84+
list(APPEND TARGET_SYSTEM "musl")
85+
endif()
86+
endif()
7687
endif()
7788
endif()
7889

@@ -122,6 +133,9 @@ if("${C_SYSTEM_LIBS}" STREQUAL "AUTO")
122133
set(C_SYSTEM_LIBS m c)
123134
elseif("${TARGET_SYSTEM}" MATCHES "Linux")
124135
set(C_SYSTEM_LIBS m pthread rt dl)
136+
if("${TARGET_SYSTEM}" MATCHES "musl")
137+
list(APPEND C_SYSTEM_LIBS "unwind")
138+
endif()
125139
elseif("${TARGET_SYSTEM}" MATCHES "FreeBSD")
126140
set(C_SYSTEM_LIBS m pthread execinfo z)
127141
else()
@@ -137,6 +151,7 @@ message(STATUS "-- LDC runtime configuration:")
137151
message(STATUS "-- - Building 32/64-bit libraries (MULTILIB): ${MULTILIB}")
138152
message(STATUS "-- - Building shared libraries (BUILD_SHARED_LIBS): ${BUILD_SHARED_LIBS}")
139153
message(STATUS "-- - Building LTO libraries (BUILD_LTO_LIBS): ${BUILD_LTO_LIBS}")
154+
message(STATUS "-- - Linking shared libraries (and test runners) with (C_SYSTEM_LIBS): ${C_SYSTEM_LIBS}")
140155

141156
get_directory_property(PROJECT_PARENT_DIR DIRECTORY ${PROJECT_SOURCE_DIR} PARENT_DIRECTORY)
142157
set(RUNTIME_DIR ${PROJECT_SOURCE_DIR}/druntime CACHE PATH "druntime root directory")

runtime/DRuntimeIntegrationTests.cmake

+5-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ set(linkdl "")
4242
if("${TARGET_SYSTEM}" MATCHES "Linux")
4343
set(linkdl "LINKDL=-L-ldl")
4444
endif()
45+
set(linkunwind "")
46+
if("${TARGET_SYSTEM}" MATCHES "musl")
47+
set(linkunwind "LINKUNWIND=-L-lunwind")
48+
endif()
4549

4650
get_subdirs(testnames ${PROJECT_SOURCE_DIR}/druntime/test)
4751
if(${BUILD_SHARED_LIBS} STREQUAL "OFF")
@@ -74,7 +78,7 @@ foreach(name ${testnames})
7478
COMMAND ${GNU_MAKE_BIN} -C ${PROJECT_SOURCE_DIR}/druntime/test/${name}
7579
ROOT=${outdir} DMD=${LDMD_EXE_FULL} BUILD=${build}
7680
DRUNTIME=${druntime_path_build} DRUNTIMESO=${shared_druntime_path_build}
77-
SHARED=1 ${cflags_base} ${linkdl}
81+
SHARED=1 ${cflags_base} ${linkdl} ${linkunwind}
7882
)
7983
set_tests_properties(${fullname} PROPERTIES DEPENDS clean-${fullname})
8084
endforeach()

runtime/druntime/test/common.mak

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ DMD:=
1212
DRUNTIME:=
1313
DRUNTIMESO:=
1414
LINKDL:=
15+
LINKUNWIND:=
1516
QUIET:=
1617
TIMELIMIT:=
1718
PIC:=
@@ -25,6 +26,7 @@ ifeq (,$(findstring ldmd2,$(DMD)))
2526
endif
2627

2728
LDL:=$(subst -L,,$(LINKDL)) # -ldl
29+
LUNWIND:=$(subst -L,,$(LINKUNWIND)) # -lunwind
2830
SRC:=src
2931
GENERATED:=./generated
3032
ROOT:=$(GENERATED)/$(OS)/$(BUILD)/$(MODEL)

runtime/druntime/test/stdcpp/Makefile

+4-4
Original file line numberDiff line numberDiff line change
@@ -98,22 +98,22 @@ $(ROOT)/%_old.done: $(ROOT)/%_old$(DOTEXE)
9898
$(ROOT)/%$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d
9999
@mkdir -p $(dir $@)
100100
$(QUIET)$(DMD) $(DFLAGS) -extern-std=c++98 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_d$(DOTOBJ) $(SRC)/$*_test.d
101-
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++98 -o $@ $< $(ROOT)/$*_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL)
101+
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++98 -o $@ $< $(ROOT)/$*_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) $(LUNWIND)
102102
# build C++11 tests
103103
$(ROOT)/%_11$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d
104104
@mkdir -p $(dir $@)
105105
$(QUIET)$(DMD) $(DFLAGS) -extern-std=c++11 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_11_d$(DOTOBJ) $(SRC)/$*_test.d
106-
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++11 -o $@ $< $(ROOT)/$*_11_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL)
106+
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++11 -o $@ $< $(ROOT)/$*_11_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) $(LUNWIND)
107107
# build C++17 tests
108108
$(ROOT)/%_17$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d
109109
@mkdir -p $(dir $@)
110110
$(QUIET)$(DMD) $(DFLAGS) -extern-std=c++17 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_17_d$(DOTOBJ) $(SRC)/$*_test.d
111-
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++17 -o $@ $< $(ROOT)/$*_17_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL)
111+
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++17 -o $@ $< $(ROOT)/$*_17_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) $(LUNWIND)
112112
# build libstdc++ _GLIBCXX_USE_CXX11_ABI=0 tests
113113
$(ROOT)/%_old$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d
114114
@mkdir -p $(dir $@)
115115
$(QUIET)$(DMD) $(DFLAGS) -version=_GLIBCXX_USE_CXX98_ABI -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_old_d$(DOTOBJ) $(SRC)/$*_test.d
116-
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -D_GLIBCXX_USE_CXX11_ABI=0 -o $@ $< $(ROOT)/$*_old_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL)
116+
$(QUIET)$(CXX) $(CXXFLAGS_BASE) -D_GLIBCXX_USE_CXX11_ABI=0 -o $@ $< $(ROOT)/$*_old_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) $(LUNWIND)
117117

118118
endif # end Posix
119119

0 commit comments

Comments
 (0)