-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
136 lines (104 loc) · 4.48 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
cmake_minimum_required(VERSION 3.5)
### project version
set(OPENBASE_TYPE_VERSION_MAJOR 1)
set(OPENBASE_TYPE_VERSION_MINOR 4)
set(OPENBASE_TYPE_VERSION_PATCH 0)
set(OPENBASE_TYPE_VERSION "${OPENBASE_TYPE_VERSION_MAJOR}.${OPENBASE_TYPE_VERSION_MINOR}.${OPENBASE_TYPE_VERSION_PATCH}")
### project name
project(openbase-type VERSION ${OPENBASE_TYPE_VERSION} LANGUAGES CXX)
### project setup
set(PROJECT_VERSION ${OPENBASE_TYPE_VERSION})
set(PROJECT_NAMESPACE "org-openbase")
set(CONFIG_PACKAGE_LOCATION "lib/cmake/${PROJECT_NAME}")
set(CMAKE_CONFIG_FILE_NAME "${PROJECT_NAME}-config.cmake")
set(CMAKE_CONFIG_VERSION_FILE_NAME "${PROJECT_NAME}-config-version.cmake")
set(CMAKE_CONFIG_FILE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CONFIG_FILE_NAME}")
set(CMAKE_CONFIG_VERSION_FILE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CONFIG_VERSION_FILE_NAME}")
### declare deps
find_package(Protobuf 3.21.5 REQUIRED)
### prepare generated type code
set(PROTO_SOURCE_DIR "${PROJECT_SOURCE_DIR}/src/main/proto")
file(GLOB_RECURSE PROTO "${PROTO_SOURCE_DIR}/*.proto")
set(PROTOBUF_IMPORT_DIRS "${PROJECT_SOURCE_DIR}/src/main/proto/")
set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE)
set(PROTO_SOURCES)
set(PROTO_HEADERS)
foreach (PROTOFILE ${PROTO})
string(REPLACE "${PROTO_SOURCE_DIR}/" "" PROTONAME "${PROTOFILE}")
string(REPLACE "/" "." TARGETNAME "${PROTONAME}")
string(REPLACE "${PROTO_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" PROTOTARGET "${PROTOFILE}")
string(REPLACE ".proto" ".pb.cc" CFILE "${PROTOTARGET}")
string(REPLACE ".proto" ".pb.h" HFILE "${PROTOTARGET}")
list(APPEND PROTO_SOURCES ${CFILE})
list(APPEND PROTO_HEADERS ${HFILE})
add_custom_command(
OUTPUT "${CFILE}" "${HFILE}"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path=${PROTO_SOURCE_DIR} ${PROTOFILE}
DEPENDS ${PROTOFILE} ${PROTOBUF_PROTOC_EXECUTABLE}
COMMENT "Running C++ protocol buffer compiler on ${FIL}"
VERBATIM)
endforeach ()
add_library(${PROJECT_NAME} SHARED ${PROTO_SOURCES})
target_include_directories(${PROJECT_NAME}
PUBLIC
$<INSTALL_INTERFACE:include>
PRIVATE
$<BUILD_INTERFACE: ${CMAKE_BINARY_DIR} ${PROTOBUF_INCLUDE_DIRS}>)
target_link_libraries(${PROJECT_NAME}
PUBLIC
${PROTOBUF_LIBRARIES})
if (UNIX OR APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -std=c++11")
endif ()
### setup package config
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_CONFIG_VERSION_FILE_PATH}
VERSION ${OPENBASE_TYPE_VERSION}
COMPATIBILITY SameMajorVersion)
### install targets
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-export
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include)
install(DIRECTORY "${CMAKE_BINARY_DIR}/openbase"
DESTINATION "include"
FILES_MATCHING PATTERN "*.h*")
install(DIRECTORY "${CMAKE_SOURCE_DIR}/src/main/proto"
DESTINATION "share/${PROJECT_NAME}/"
FILES_MATCHING PATTERN "*.proto*")
### export
install(EXPORT ${PROJECT_NAME}-export
FILE ${CMAKE_CONFIG_FILE_NAME}
NAMESPACE ${PROJECT_NAMESPACE}::
DESTINATION share/${PROJECT_NAME})
export(EXPORT ${PROJECT_NAME}-export
FILE ${CMAKE_CONFIG_FILE_PATH}
NAMESPACE ${PROJECT_NAMESPACE}::)
install(EXPORT ${PROJECT_NAME}-export
FILE ${CMAKE_CONFIG_FILE_NAME}
NAMESPACE ${PROJECT_NAMESPACE}::
DESTINATION ${CONFIG_PACKAGE_LOCATION})
install(FILES ${CMAKE_CONFIG_FILE_PATH}
${CMAKE_CONFIG_VERSION_FILE_PATH}
DESTINATION ${CONFIG_PACKAGE_LOCATION}
COMPONENT Devel)
install(FILES ${CMAKE_CONFIG_FILE_PATH}
${CMAKE_CONFIG_VERSION_FILE_PATH}
DESTINATION share/${PROJECT_NAME}
COMPONENT Devel)
# debian packaging
set(CPACK_PACKAGE_VERSION_MAJOR ${OPENBASE_TYPE_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${OPENBASE_TYPE_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${OPENBASE_TYPE_VERSION_PATCH})
set(CPACK_PACKAGE_VERSION ${OPENBASE_TYPE_VERSION})
set(CPACK_PACKAGE_VENDOR "openbase.org")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
#include(ProvideFlexibleCPack)
# pkgconfig packaging
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp/${PROJECT_NAME}.pc.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
@ONLY)
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
DESTINATION lib/pkgconfig)