1
- cmake_minimum_required (VERSION 3.20.0)
1
+ #===============================================================================
2
+ # Setup Project
3
+ #===============================================================================
2
4
3
- if (NOT IS_DIRECTORY "${CMAKE_CURRENT_LIST_DIR} /../libunwind" )
4
- message (FATAL_ERROR "llvm-libgcc requires being built in a monorepo layout with libunwind available" )
5
- endif ()
5
+ cmake_minimum_required (VERSION 3.20.0)
6
6
7
7
set (LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR} /../cmake" )
8
8
9
- list (APPEND CMAKE_MODULE_PATH
9
+ # Check if llvm-libgcc is built as a standalone project
10
+ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LLVM_LIBGCC_STANDALONE_BUILD)
11
+ project (llvm-libgcc LANGUAGES C CXX ASM)
12
+ set (COMPILER_RT_STANDALONE_BUILD ON )
13
+ set_property (GLOBAL PROPERTY USE_FOLDERS ON )
14
+ set (LLVM_LIBGCC_COMPILER_RT_BINARY_DIR "compiler-rt" )
15
+ set (LLVM_LIBGCC_LIBUNWIND_BINARY_DIR "libunwind" )
16
+ else ()
17
+ set (LLVM_LIBGCC_COMPILER_RT_BINARY_DIR "../compiler-rt" )
18
+ set (LLVM_LIBGCC_LIBUNWIND_BINARY_DIR "../libunwind" )
19
+ endif ()
20
+
21
+ # Add path for custom modules
22
+ list (INSERT CMAKE_MODULE_PATH 0
10
23
"${CMAKE_CURRENT_SOURCE_DIR} /cmake"
11
24
"${CMAKE_CURRENT_SOURCE_DIR} /cmake/Modules"
25
+ "${CMAKE_CURRENT_SOURCE_DIR} /../runtimes/cmake/Modules"
12
26
"${LLVM_COMMON_CMAKE_UTILS} "
13
27
"${LLVM_COMMON_CMAKE_UTILS} /Modules"
14
- )
28
+ )
29
+
30
+ set (LLVM_LIBGCC_LIBUNWIND_PATH "${CMAKE_CURRENT_LIST_DIR} /../libunwind"
31
+ CACHE PATH "Specify path to libunwind source." )
32
+ set (LLVM_LIBGCC_COMPILER_RT_PATH "${CMAKE_CURRENT_LIST_DIR} /../compiler-rt"
33
+ CACHE PATH "Specify path to compiler-rt source." )
15
34
16
- project (llvm-libgcc LANGUAGES C CXX ASM )
35
+ include (GNUInstallDirs )
17
36
18
37
if (NOT LLVM_LIBGCC_EXPLICIT_OPT_IN)
19
38
message (FATAL_ERROR
@@ -25,18 +44,114 @@ if(NOT LLVM_LIBGCC_EXPLICIT_OPT_IN)
25
44
"to your CMake invocation and try again." )
26
45
endif ()
27
46
28
- set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR} /lib${LLVMLIB_DIR_SUFFIX} " )
29
- set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR} /lib${LLVMLIB_DIR_SUFFIX} " )
30
- set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR} /bin" )
47
+ if (HAVE_COMPILER_RT)
48
+ message (FATAL_ERROR
49
+ "Attempting to build both compiler-rt and llvm-libgcc will cause irreconcilable "
50
+ "target clashes. Please choose one or the other, but not both." )
51
+ endif ()
52
+
53
+ if (HAVE_LIBUNWIND)
54
+ message (FATAL_ERROR
55
+ "Attempting to build both libunwind and llvm-libgcc will cause irreconcilable "
56
+ "target clashes. Please choose one or the other, but not both." )
57
+ endif ()
58
+
59
+ #===============================================================================
60
+ # Configure System
61
+ #===============================================================================
62
+
63
+ if (LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE )
64
+ set (LLVM_LIBGCC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR} /${LLVM_DEFAULT_TARGET_TRIPLE} )
65
+ set (LLVM_LIBGCC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX} /${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
66
+ "Path where built llvm-libgcc libraries should be installed." )
67
+ if (LIBCXX_LIBDIR_SUBDIR)
68
+ string (APPEND LLVM_LIBGCC_LIBRARY_DIR /${LLVM_LIBGCC_LIBDIR_SUBDIR} )
69
+ string (APPEND LLVM_LIBGCC_INSTALL_LIBRARY_DIR /${LLVM_LIBGCC_LIBDIR_SUBDIR} )
70
+ endif ()
71
+ else ()
72
+ if (LLVM_LIBRARY_OUTPUT_INTDIR)
73
+ set (LLVM_LIBGCC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR} )
74
+ else ()
75
+ set (LLVM_LIBGCC_LIBRARY_DIR ${CMAKE_BINARY_DIR} /lib${LLVM_LIBGCC_LIBDIR_SUFFIX} )
76
+ endif ()
77
+ set (LLVM_LIBGCC_INSTALL_LIBRARY_DIR lib${LLVM_LIBGCC_LIBDIR_SUFFIX} CACHE PATH
78
+ "Path where built llvm-libgcc libraries should be installed." )
79
+ endif ()
80
+
81
+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR} )
82
+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR} )
83
+ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_LIBGCC_LIBRARY_DIR} )
84
+
85
+ #===============================================================================
86
+ # Build libraries
87
+ #===============================================================================
88
+
89
+ set (COMPILER_RT_BUILD_BUILTINS ON )
90
+ set (COMPILER_RT_BUILTINS_HIDE_SYMBOLS OFF )
91
+ add_subdirectory (${LLVM_LIBGCC_COMPILER_RT_PATH} ${LLVM_LIBGCC_COMPILER_RT_BINARY_DIR} )
92
+
93
+ set (LIBUNWIND_ENABLE_STATIC ON )
94
+ set (LIBUNWIND_ENABLE_SHARED ON )
95
+ set (LIBUNWIND_USE_COMPILER_RT OFF )
96
+ set (LIBUNWIND_HAS_GCC_LIB OFF )
97
+ set (LIBUNWIND_HAS_GCC_S_LIB OFF )
98
+ add_subdirectory (${LLVM_LIBGCC_LIBUNWIND_PATH} ${LLVM_LIBGCC_LIBUNWIND_BINARY_DIR} )
99
+
100
+ add_custom_target (gcc_s.ver
101
+ SOURCES ${CMAKE_CURRENT_SOURCE_DIR} /gcc_s.ver.in
102
+ COMMAND ${CMAKE_C_COMPILER} -E
103
+ -xc ${CMAKE_CURRENT_SOURCE_DIR} /gcc_s.ver.in
104
+ -o ${CMAKE_CURRENT_BINARY_DIR} /gcc_s.ver
105
+ )
106
+
107
+ add_dependencies (unwind_shared gcc_s.ver)
108
+
109
+ construct_compiler_rt_default_triple()
110
+
111
+ target_link_options (unwind_shared PUBLIC
112
+ -Wl,--version -script,${CMAKE_CURRENT_BINARY_DIR} /gcc_s.ver
113
+ )
114
+
115
+ target_link_libraries (unwind_shared PUBLIC
116
+ $<TARGET_OBJECTS:clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH} >
117
+ m
118
+ )
119
+
120
+ #===============================================================================
121
+ # Install Symlinks
122
+ #===============================================================================
123
+
124
+ get_compiler_rt_install_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} install_dir_builtins)
125
+ string (REGEX REPLACE "^lib/" "" install_dir_builtins "${install_dir_builtins} " )
126
+ string (FIND "${install_dir_builtins} " "clang" install_path_contains_triple)
127
+ if (install_path_contains_triple EQUAL -1)
128
+ set (builtins_suffix "-${COMPILER_RT_DEFAULT_TARGET_ARCH} " )
129
+ else ()
130
+ string (PREPEND install_dir_builtins "../" )
131
+ endif ()
132
+ set (LLVM_LIBGCC_COMPILER_RT ${install_dir_builtins} /libclang_rt.builtins${builtins_suffix} .a)
133
+
134
+ add_custom_target (llvm-libgcc ALL
135
+ DEPENDS unwind_shared unwind_static clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}
136
+ COMMAND ${CMAKE_COMMAND} -E create_symlink ${LLVM_LIBGCC_COMPILER_RT} libgcc.a
137
+ COMMAND ${CMAKE_COMMAND} -E create_symlink libunwind.a libgcc_eh.a
138
+ COMMAND ${CMAKE_COMMAND} -E create_symlink libunwind.so libgcc_s.so.1.0
139
+ COMMAND ${CMAKE_COMMAND} -E create_symlink libgcc_s.so.1.0 libgcc_s.so.1
140
+ COMMAND ${CMAKE_COMMAND} -E create_symlink libgcc_s.so.1 libgcc_s.so
141
+ )
31
142
32
- set (COMPILER_RT_BUILD_BUILTINS On )
33
- set (COMPILER_RT_BUILTINS_HIDE_SYMBOLS Off )
34
- add_subdirectory ("../compiler-rt" "compiler-rt" )
143
+ install (TARGETS unwind_shared unwind_static
144
+ LIBRARY DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} COMPONENT llvm-libgcc
145
+ ARCHIVE DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} COMPONENT llvm-libgcc
146
+ RUNTIME DESTINATION ${LLVM_LIBGCC_INSTALL_RUNTIME_DIR} COMPONENT llvm-libgcc)
35
147
36
- set (LIBUNWIND_ENABLE_STATIC On )
37
- set (LIBUNWIND_ENABLE_SHARED Off )
38
- set (LIBUNWIND_HAS_COMMENT_LIB_PRAGMA Off )
39
- set (LIBUNWIND_USE_COMPILER_RT On )
40
- add_subdirectory ("../libunwind" "libunwind" )
148
+ install (TARGETS clang_rt.builtins-${COMPILER_RT_DEFAULT_TARGET_ARCH}
149
+ LIBRARY DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} /${install_dir_builtins} COMPONENT llvm-libgcc
150
+ ARCHIVE DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR} /${install_dir_builtins} COMPONENT llvm-libgcc
151
+ RUNTIME DESTINATION ${LLVM_LIBGCC_INSTALL_RUNTIME_DIR} /${install_dir_builtins} COMPONENT llvm-libgcc)
41
152
42
- add_subdirectory (lib)
153
+ foreach (VAR libgcc.a libgcc_eh.a libgcc_s.so.1.0 libgcc_s.so.1 libgcc_s.so)
154
+ install (FILES ${CMAKE_CURRENT_BINARY_DIR} /${VAR}
155
+ DESTINATION ${LLVM_LIBGCC_INSTALL_LIBRARY_DIR}
156
+ COMPONENT llvm-libgcc)
157
+ endforeach ()
0 commit comments