Skip to content

Commit 3438153

Browse files
committed
Initial CMake setup
Signed-off-by: Pierre R. Mai <pmai@pmsf.de>
0 parents  commit 3438153

10 files changed

+650
-0
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "open-simulation-interface"]
2+
path = open-simulation-interface
3+
url = https://github.com/OpenSimulationInterface/open-simulation-interface.git

CMakeLists.txt

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
3+
project(open_simulation_interface)
4+
5+
# Toplevel check
6+
set(OSI_IS_TOP_LEVEL OFF)
7+
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
8+
set(OSI_IS_TOP_LEVEL ON)
9+
endif()
10+
11+
# Set the C++ standard
12+
set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ standard to be used")
13+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
14+
15+
if(MSVC)
16+
add_compile_options(/wd4141 /wd4244 /wd4251 /wd4267 /wd4305 /wd4355 /wd4800 /wd4996)
17+
endif()
18+
19+
# Set a default build type if none was specified
20+
set(default_build_type "Release")
21+
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
22+
set(default_build_type "Debug")
23+
endif()
24+
25+
# read the version number from the file "VERSION"
26+
file(STRINGS "open-simulation-interface/VERSION" VERSION_CONTENTS)
27+
foreach(LINE ${VERSION_CONTENTS})
28+
string(REGEX REPLACE " |\t" "" LINE ${LINE})
29+
string(REGEX MATCH "^[^=]+" VERSION_NAME ${LINE})
30+
string(REPLACE "${VERSION_NAME}=" "" VERSION_VALUE ${LINE})
31+
set(${VERSION_NAME} "${VERSION_VALUE}")
32+
endforeach()
33+
set(OPEN_SIMULATION_INTERFACE_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
34+
35+
set(${PROJECT_NAME}_SOVERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
36+
set(${PROJECT_NAME}_LIBVERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
37+
38+
# configure build version
39+
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
40+
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
41+
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
42+
STRING "Choose the type of build." FORCE)
43+
# Set the possible values of build type for cmake-gui
44+
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
45+
"Debug" "Release" "MinSizeRel" "RelWithDebInfo")
46+
endif()
47+
48+
# Offer the user the choice of overriding the installation directories
49+
set(OSI_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
50+
set(OSI_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
51+
52+
if(WIN32 AND NOT CYGWIN)
53+
set(DEF_INSTALL_CMAKE_DIR CMake/${PROJECT_NAME}-${VERSION_MAJOR})
54+
else()
55+
set(DEF_INSTALL_CMAKE_DIR lib/cmake/${PROJECT_NAME}-${VERSION_MAJOR})
56+
endif()
57+
set(OSI_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
58+
59+
set(OSI_INSTALL_LIB_DIR ${OSI_INSTALL_LIB_DIR}/osi${VERSION_MAJOR})
60+
set(OSI_INSTALL_INCLUDE_DIR ${OSI_INSTALL_INCLUDE_DIR}/osi${VERSION_MAJOR})
61+
62+
configure_file(open-simulation-interface/osi_version.proto.in osi_version.proto)
63+
64+
find_package(Protobuf REQUIRED)
65+
include_directories(${Protobuf_INCLUDE_DIRS})
66+
67+
file(GLOB OSI_PROTO_FILES open-simulation-interface/*.proto)
68+
list(INSERT OSI_PROTO_FILES 0 ${CMAKE_CURRENT_BINARY_DIR}/osi_version.proto)
69+
70+
protobuf_generate_cpp(PROTO_SRCS PROTO_HEADERS ${OSI_PROTO_FILES})
71+
72+
add_library(${PROJECT_NAME}_static STATIC ${PROTO_SRCS} ${PROTO_HEADERS})
73+
add_library(${PROJECT_NAME}::${PROJECT_NAME}_static ALIAS ${PROJECT_NAME}_static)
74+
target_include_directories(${PROJECT_NAME}_static
75+
PUBLIC
76+
${PROTOBUF_INCLUDE_DIR}
77+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
78+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
79+
)
80+
target_link_libraries(${PROJECT_NAME}_static PUBLIC protobuf::libprotobuf)
81+
install(TARGETS ${PROJECT_NAME}_static
82+
EXPORT ${PROJECT_NAME}_targets
83+
ARCHIVE DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)
84+
85+
86+
add_library(${PROJECT_NAME}_obj OBJECT ${PROTO_SRCS} ${PROTO_HEADERS})
87+
add_library(${PROJECT_NAME}::${PROJECT_NAME}_obj ALIAS ${PROJECT_NAME}_obj)
88+
target_include_directories(${PROJECT_NAME}_obj
89+
PUBLIC
90+
${PROTOBUF_INCLUDE_DIR}
91+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
92+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
93+
)
94+
set_property(TARGET ${PROJECT_NAME}_obj PROPERTY POSITION_INDEPENDENT_CODE ON)
95+
96+
97+
add_library(${PROJECT_NAME}_pic STATIC $<TARGET_OBJECTS:${PROJECT_NAME}_obj>)
98+
add_library(${PROJECT_NAME}::${PROJECT_NAME}_pic ALIAS ${PROJECT_NAME}_pic)
99+
target_include_directories(${PROJECT_NAME}_pic
100+
PUBLIC
101+
${PROTOBUF_INCLUDE_DIR}
102+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
103+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
104+
)
105+
target_link_libraries(${PROJECT_NAME}_pic PUBLIC protobuf::libprotobuf)
106+
107+
set_property(TARGET ${PROJECT_NAME}_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
108+
109+
install(TARGETS ${PROJECT_NAME}_pic
110+
EXPORT ${PROJECT_NAME}_targets
111+
ARCHIVE DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)
112+
113+
add_library(${PROJECT_NAME} SHARED $<TARGET_OBJECTS:${PROJECT_NAME}_obj>)
114+
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
115+
target_include_directories(${PROJECT_NAME}
116+
PUBLIC
117+
${PROTOBUF_INCLUDE_DIR}
118+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
119+
$<INSTALL_INTERFACE:${OSI_INSTALL_INCLUDE_DIR}>
120+
)
121+
122+
set_property(
123+
TARGET ${PROJECT_NAME}
124+
PROPERTY SOVERSION ${${PROJECT_NAME}_SOVERSION}
125+
)
126+
set_property(
127+
TARGET ${PROJECT_NAME}
128+
PROPERTY VERSION ${${PROJECT_NAME}_LIBVERSION}
129+
)
130+
131+
target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf)
132+
install(TARGETS ${PROJECT_NAME}
133+
EXPORT ${PROJECT_NAME}_targets
134+
DESTINATION "${OSI_INSTALL_LIB_DIR}" COMPONENT lib)
135+
136+
# Copy proto headers to where they are expected by the package config file
137+
add_custom_command(
138+
TARGET ${PROJECT_NAME} POST_BUILD
139+
COMMAND ${CMAKE_COMMAND} -E make_directory
140+
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR}
141+
COMMAND ${CMAKE_COMMAND} -E copy
142+
${PROTO_HEADERS}
143+
${CMAKE_CURRENT_BINARY_DIR}/${OSI_INSTALL_INCLUDE_DIR})
144+
145+
# Create the package config files
146+
include(CMakePackageConfigHelpers)
147+
write_basic_package_version_file(
148+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
149+
VERSION ${OPEN_SIMULATION_INTERFACE_VERSION}
150+
COMPATIBILITY SameMajorVersion
151+
)
152+
153+
export(EXPORT ${PROJECT_NAME}_targets
154+
FILE "${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-targets.cmake"
155+
NAMESPACE ${PROJECT_NAME}::
156+
)
157+
158+
configure_package_config_file(open_simulation_interface-config.cmake.in
159+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
160+
INSTALL_DESTINATION ${OSI_INSTALL_CMAKE_DIR}
161+
PATH_VARS OSI_INSTALL_INCLUDE_DIR
162+
NO_CHECK_REQUIRED_COMPONENTS_MACRO
163+
)
164+
165+
# Install the *cmake files
166+
install(FILES
167+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config.cmake"
168+
"${CMAKE_CURRENT_BINARY_DIR}/open_simulation_interface-config-version.cmake"
169+
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
170+
COMPONENT dev)
171+
172+
# Header files
173+
install(FILES ${PROTO_HEADERS}
174+
DESTINATION "${OSI_INSTALL_INCLUDE_DIR}")
175+
176+
# Install the export set for use with the install-tree
177+
install(EXPORT ${PROJECT_NAME}_targets
178+
FILE open_simulation_interface-targets.cmake
179+
NAMESPACE ${PROJECT_NAME}::
180+
DESTINATION "${OSI_INSTALL_CMAKE_DIR}"
181+
COMPONENT dev)

CMakePresets.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": 3,
3+
"configurePresets": [
4+
{
5+
"name": "vcpkg",
6+
"binaryDir": "${sourceDir}/build",
7+
"cacheVariables": {
8+
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
9+
}
10+
}
11+
]
12+
}

0 commit comments

Comments
 (0)