Skip to content

Commit f71a7bb

Browse files
authored
cmake: add cmake install + export (#7)
1 parent 4ec46c3 commit f71a7bb

File tree

14 files changed

+530
-267
lines changed

14 files changed

+530
-267
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@
44
[submodule "third_party/zlib/zlib"]
55
path = third_party/zlib/zlib
66
url = https://chromium.googlesource.com/chromium/src/third_party/zlib
7+
[submodule "third_party/lss/lss"]
8+
path = third_party/lss/lss
9+
url = https://chromium.googlesource.com/linux-syscall-support

CMakeLists.txt

Lines changed: 92 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
1-
cmake_minimum_required(VERSION 3.0)
1+
cmake_minimum_required(VERSION 3.10)
22
project(crashpad LANGUAGES C CXX)
33

4+
set(CRASHPAD_MAIN_PROJECT OFF)
5+
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
6+
set(CRASHPAD_MAIN_PROJECT ON)
7+
endif()
8+
9+
option(CRASHPAD_ENABLE_INSTALL "Enable crashpad installation" "${CRASHPAD_MAIN_PROJECT}")
10+
option(CRASHPAD_ENABLE_INSTALL_DEV "Enable crashpad development installation" "${CRASHPAD_MAIN_PROJECT}")
11+
12+
if(MSVC)
13+
set(CRASHPAD_ZLIB_SYSTEM_DEFAULT OFF)
14+
else()
15+
set(CRASHPAD_ZLIB_SYSTEM_DEFAULT ON)
16+
endif()
17+
option(CRASHPAD_ZLIB_SYSTEM "Use system zlib library" "${CRASHPAD_ZLIB_SYSTEM_DEFAULT}")
18+
19+
if(CRASHPAD_ZLIB_SYSTEM)
20+
find_package(ZLIB REQUIRED)
21+
endif()
22+
23+
include(GNUInstallDirs)
24+
set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/crashpad")
25+
26+
function(crashpad_install_target)
27+
if(CRASHPAD_ENABLE_INSTALL)
28+
install(TARGETS ${ARGN} EXPORT crashpad_export
29+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
30+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
31+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
32+
)
33+
endif()
34+
endfunction()
35+
function(crashpad_install_dev)
36+
if(CRASHPAD_ENABLE_INSTALL_DEV)
37+
install(${ARGN})
38+
endif()
39+
endfunction()
40+
41+
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
42+
set(LINUX TRUE)
43+
endif()
44+
445
if(WIN32)
546
enable_language(ASM_MASM)
647
IF(MINGW)
@@ -9,86 +50,73 @@ if(WIN32)
950
SET(CMAKE_ASM_MASM_COMPILER "uasm")
1051
SET(CMAKE_ASM_MASM_FLAGS "-win64 -10")
1152
else()
12-
message(FATAL_ERROR "UASM is required for MinGW builds ! Make sure you have it installed")
53+
message(FATAL_ERROR "UASM is required for MinGW builds! Make sure you have it installed")
1354
endif()
1455
endif()
1556
else()
1657
enable_language(ASM)
1758
endif()
1859

1960
set(CMAKE_CXX_STANDARD 14)
20-
set(CMAKE_CXX_STANDARD_REQUIRED True)
21-
22-
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
23-
set(LINUX TRUE)
24-
endif()
61+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
2562

26-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
27-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/third_party/mini_chromium/mini_chromium")
28-
29-
# These should really be in `compat`, but we want them for the whole project
30-
if(APPLE)
31-
include_directories(SYSTEM "compat/mac")
32-
else()
33-
include_directories(PUBLIC "compat/non_mac")
34-
endif()
35-
36-
if(LINUX OR ANDROID)
37-
include_directories(SYSTEM "compat/linux")
38-
endif()
39-
if(ANDROID)
40-
include_directories(SYSTEM "compat/android")
41-
endif()
42-
43-
if(MSVC)
44-
include_directories(SYSTEM "compat/win")
45-
elseif(MINGW)
46-
include_directories(PUBLIC "compat/mingw")
47-
else()
48-
include_directories(PUBLIC "compat/non_win")
49-
endif()
50-
51-
if(NOT LINUX AND NOT ANDROID)
52-
include_directories(SYSTEM "compat/non_elf")
53-
endif()
63+
add_library(crashpad_interface INTERFACE)
64+
target_include_directories(crashpad_interface INTERFACE
65+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
66+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/third_party/mini_chromium/mini_chromium>
67+
)
68+
target_compile_definitions(crashpad_interface INTERFACE
69+
CRASHPAD_LSS_SOURCE_EMBEDDED
70+
)
5471

5572
if(MSVC)
56-
add_definitions(
57-
/DNOMINMAX
58-
/DUNICODE
59-
/DWIN32_LEAN_AND_MEAN
60-
/D_CRT_SECURE_NO_WARNINGS
61-
/D_HAS_EXCEPTIONS=0
62-
/D_UNICODE
63-
/FS
64-
/W4
65-
/WX
66-
/Zi
67-
/bigobj # Support larger number of sections in obj file.
68-
/wd4100 # Unreferenced formal parameter.
69-
/wd4127 # Conditional expression is constant.
70-
/wd4324 # Structure was padded due to alignment specifier.
71-
/wd4351 # New behavior: elements of array will be default initialized.
72-
/wd4577 # 'noexcept' used with no exception handling mode specified.
73-
/wd4996 # 'X' was declared deprecated.
73+
target_compile_definitions(crashpad_interface INTERFACE
74+
NOMINMAX
75+
UNICODE
76+
WIN32_LEAN_AND_MEAN
77+
_CRT_SECURE_NO_WARNINGS
78+
_HAS_EXCEPTIONS=0
79+
_UNICODE
7480
)
75-
elseif(MINGW)
76-
#redirect to wmain
77-
add_link_options(
78-
-municode
81+
target_compile_options(crashpad_interface INTERFACE
82+
$<$<COMPILE_LANGUAGE:C,CXX>:/FS>
83+
$<$<COMPILE_LANGUAGE:C,CXX>:/W4>
84+
$<$<COMPILE_LANGUAGE:C,CXX>:/WX>
85+
$<$<COMPILE_LANGUAGE:C,CXX>:/Zi>
86+
$<$<COMPILE_LANGUAGE:C,CXX>:/bigobj> # Support larger number of sections in obj file.
87+
$<$<COMPILE_LANGUAGE:C,CXX>:/wd4100> # Unreferenced formal parameter.
88+
$<$<COMPILE_LANGUAGE:C,CXX>:/wd4127> # Conditional expression is constant.
89+
$<$<COMPILE_LANGUAGE:C,CXX>:/wd4324> # Structure was padded due to alignment specifier.
90+
$<$<COMPILE_LANGUAGE:C,CXX>:/wd4351> # New behavior: elements of array will be default initialized.
91+
$<$<COMPILE_LANGUAGE:C,CXX>:/wd4577> # 'noexcept' used with no exception handling mode specified.
92+
$<$<COMPILE_LANGUAGE:C,CXX>:/wd4996> # 'X' was declared deprecated.
7993
)
94+
elseif(MINGW)
95+
# redirect to wmain
96+
# FIXME: cmake 3.13 added target_link_options
97+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode")
8098
endif()
99+
add_library(crashpad::interface ALIAS crashpad_interface)
81100

82-
add_subdirectory(client)
83101
add_subdirectory(compat)
84-
add_subdirectory(handler)
85102
add_subdirectory(minidump)
86103
add_subdirectory(snapshot)
87-
add_subdirectory(tools)
88104
add_subdirectory(util)
89105
add_subdirectory(third_party/mini_chromium)
106+
add_subdirectory(client)
90107

91-
if(MSVC)
92-
add_subdirectory(third_party/getopt)
93-
add_subdirectory(third_party/zlib)
94-
endif()
108+
add_subdirectory(third_party/zlib)
109+
add_subdirectory(third_party/getopt)
110+
111+
add_subdirectory(tools)
112+
add_subdirectory(handler)
113+
114+
if(CRASHPAD_ENABLE_INSTALL_DEV)
115+
install(EXPORT crashpad_export NAMESPACE crashpad:: FILE crashpad-targets.cmake
116+
DESTINATION "${CMAKE_INSTALL_CMAKEDIR}")
117+
include(CMakePackageConfigHelpers)
118+
configure_package_config_file(crashpad-config.cmake.in crashpad-config.cmake
119+
INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
120+
)
121+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/crashpad-config.cmake" DESTINATION "${CMAKE_INSTALL_CMAKEDIR}")
122+
endif()

client/CMakeLists.txt

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
list(APPEND CLIENT_SOURCES
1+
add_library(crashpad_client STATIC
22
annotation.cc
33
annotation.h
44
annotation_list.cc
@@ -18,7 +18,7 @@ list(APPEND CLIENT_SOURCES
1818
)
1919

2020
if(APPLE)
21-
list(APPEND CLIENT_SOURCES
21+
target_sources(crashpad_client PRIVATE
2222
crash_report_database_mac.mm
2323
crashpad_client_mac.cc
2424
simulate_crash_mac.cc
@@ -27,37 +27,47 @@ if(APPLE)
2727
endif()
2828

2929
if(LINUX OR ANDROID)
30-
list(APPEND CLIENT_SOURCES
31-
crashpad_client_linux.cc
32-
simulate_crash_linux.h
33-
client_argv_handling.cc
34-
client_argv_handling.h
35-
crashpad_info_note.S
36-
crash_report_database_generic.cc
30+
target_sources(crashpad_client PRIVATE
31+
crashpad_client_linux.cc
32+
simulate_crash_linux.h
33+
client_argv_handling.cc
34+
client_argv_handling.h
35+
crashpad_info_note.S
36+
crash_report_database_generic.cc
3737
)
3838
endif()
3939

4040
if(WIN32)
41-
list(APPEND CLIENT_SOURCES
42-
crash_report_database_win.cc
43-
crashpad_client_win.cc
44-
simulate_crash_win.h
41+
target_sources(crashpad_client PRIVATE
42+
crash_report_database_win.cc
43+
crashpad_client_win.cc
44+
simulate_crash_win.h
4545
)
4646
endif()
4747

48-
add_library(crashpad_client STATIC ${CLIENT_SOURCES})
48+
target_include_directories(crashpad_client INTERFACE
49+
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>"
50+
"$<INSTALL_INTERFACE:include/crashpad/client>"
51+
)
4952
target_link_libraries(crashpad_client
50-
crashpad_compat
51-
crashpad_util
52-
mini_chromium
53+
PRIVATE
54+
$<BUILD_INTERFACE:crashpad_interface>
55+
PUBLIC
56+
crashpad_compat
57+
crashpad_util
58+
mini_chromium
5359
)
60+
target_compile_features(crashpad_client PUBLIC cxx_std_14)
61+
62+
set_property(TARGET crashpad_client PROPERTY EXPORT_NAME client)
63+
add_library(crashpad::client ALIAS crashpad_client)
5464

5565
if(WIN32)
56-
target_link_libraries(crashpad_client "rpcrt4")
66+
target_link_libraries(crashpad_client PRIVATE rpcrt4)
5767
if(MSVC)
58-
target_compile_options(crashpad_client PUBLIC "/wd4201")
68+
target_compile_options(crashpad_client PRIVATE "/wd4201")
5969
elseif(MINGW)
60-
target_compile_options(crashpad_client PRIVATE
70+
target_compile_options(crashpad_client PUBLIC
6171
"-municode"
6272
)
6373
endif()
@@ -73,3 +83,9 @@ if(WIN32)
7383
)
7484
endif()
7585
endif()
86+
87+
crashpad_install_target(crashpad_client)
88+
crashpad_install_dev(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/"
89+
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/crashpad/client"
90+
FILES_MATCHING PATTERN "*.h"
91+
)

compat/CMakeLists.txt

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
list(APPEND COMPAT_SOURCES "")
1+
set(COMPAT_SOURCES)
22

33
if(APPLE)
44
list(APPEND COMPAT_SOURCES
@@ -83,13 +83,39 @@ endif()
8383

8484
if(APPLE)
8585
add_library(crashpad_compat INTERFACE)
86-
list(TRANSFORM COMPAT_SOURCES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/")
87-
target_sources(crashpad_compat INTERFACE ${COMPAT_SOURCES})
86+
set(TI_TYPE "INTERFACE")
8887
else()
8988
add_library(crashpad_compat STATIC ${COMPAT_SOURCES})
9089
set_target_properties(crashpad_compat PROPERTIES LINKER_LANGUAGE CXX)
90+
set(TI_TYPE "PUBLIC")
91+
target_link_libraries(crashpad_compat PRIVATE
92+
$<BUILD_INTERFACE:crashpad_interface>
93+
)
9194
endif()
9295

9396
if(MSVC)
94-
target_link_libraries(crashpad_compat getopt)
97+
target_include_directories(crashpad_compat ${TI_TYPE} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/win>")
98+
elseif(MINGW)
99+
target_include_directories(crashpad_compat ${TI_TYPE} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/mingw>")
100+
else()
101+
target_include_directories(crashpad_compat ${TI_TYPE} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/non_win>")
102+
endif()
103+
104+
if(APPLE)
105+
target_include_directories(crashpad_compat ${TI_TYPE} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/mac>")
106+
else()
107+
target_include_directories(crashpad_compat ${TI_TYPE} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/non_mac>")
95108
endif()
109+
110+
if(LINUX OR ANDROID)
111+
target_include_directories(crashpad_compat ${TI_YPE} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/linux>")
112+
endif()
113+
114+
if(ANDROID)
115+
target_include_directories(crashpad_compat ${TI_YPE} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/android>")
116+
endif()
117+
118+
set_property(TARGET crashpad_compat PROPERTY EXPORT_NAME compat)
119+
add_library(crashpad::compat ALIAS crashpad_compat)
120+
121+
crashpad_install_target(crashpad_compat)

crashpad-config.cmake.in

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
include("${CMAKE_CURRENT_LIST_DIR}/crashpad-targets.cmake")
2+
3+
if(@CRASHPAD_ZLIB_SYSTEM@)
4+
find_package(ZLIB REQUIRED)
5+
target_include_directories(crashpad::zlib INTERFACE ${ZLIB_INCLUDE_DIRS})
6+
target_compile_definitions(crashpad::zlib INTERFACE ${ZLIB_COMPILE_DEFINITIONS})
7+
target_link_libraries(crashpad::zlib INTERFACE ${ZLIB_LIBRARIES})
8+
endif()
9+
10+
@PACKAGE_INIT@

0 commit comments

Comments
 (0)