Skip to content

Commit bdb953b

Browse files
committed
Modernize the use of cmake and create packages with exported targets
1 parent aa7e0cb commit bdb953b

File tree

5 files changed

+127
-80
lines changed

5 files changed

+127
-80
lines changed

CMakeLists.txt

+16-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
1313
endif()
1414
MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
1515

16-
PROJECT (IFCPP)
16+
project(IFCPP)
1717
MESSAGE(STATUS "------------------------------------------------------------------------")
1818

1919
OPTION(BUILD_VIEWER_APPLICATION "Build the viewer example application" ON)
@@ -33,9 +33,24 @@ ENDIF(NOT WIN32)
3333

3434
SET(CARVE_SOURCE_DIR ${IFCPP_SOURCE_DIR}/external/Carve)
3535
SET(CARVE_BINARY_DIR ${IFCPP_BINARY_DIR})
36+
SET(IFCPP_CONFIG_DIR "share/IFCPP/cmake")
3637
ADD_SUBDIRECTORY (external/Carve)
3738
ADD_SUBDIRECTORY (IfcPlusPlus)
3839

40+
# Install configuration file
41+
INCLUDE(CMakePackageConfigHelpers)
42+
SET(config_file_input "${CMAKE_SOURCE_DIR}/cmake/IFCPPConfig.cmake.in")
43+
SET(config_file_output "${CMAKE_BINARY_DIR}/cmake/IFCPPConfig.cmake")
44+
45+
CONFIGURE_PACKAGE_CONFIG_FILE(
46+
${config_file_input}
47+
${config_file_output}
48+
INSTALL_DESTINATION ${IFCPP_CONFIG_DIR})
49+
50+
INSTALL(
51+
FILES ${config_file_output}
52+
DESTINATION ${IFCPP_CONFIG_DIR})
53+
3954
IF(BUILD_VIEWER_APPLICATION)
4055
ADD_SUBDIRECTORY (examples/SimpleViewerExampleQt)
4156
ENDIF()

IfcPlusPlus/CMakeLists.txt

+36-19
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,7 @@ SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYP
1414
ENDIF(NOT WIN32)
1515

1616
FIND_PACKAGE(Boost REQUIRED)
17-
IF(Boost_FOUND)
18-
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
19-
ADD_DEFINITIONS( -DCARVE_SYSTEM_BOOST )
20-
ENDIF()
2117

22-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} src/)
23-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR})
24-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/include)
25-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/src)
26-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/common)
27-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/src/common)
28-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/src/include)
29-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSG_INCLUDE_DIR} )
30-
31-
LINK_DIRECTORIES (${LINK_DIRECTORIES} ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE})
3218
FILE (GLOB ifc4_source "src/ifcpp/IFC4/lib/*.cpp")
3319

3420
SET(IFCPP_SOURCE_FILES
@@ -46,11 +32,6 @@ SET(IFCPP_SOURCE_FILES
4632
${ifc4_source}
4733
)
4834

49-
IF(CMAKE_COMPILER_IS_GNUCXX)
50-
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
51-
ELSE(CMAKE_COMPILER_IS_GNUCXX)
52-
ENDIF()
53-
5435
if (MSVC)
5536
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj ")
5637

@@ -64,6 +45,27 @@ ELSE(BUILD_STATIC_LIBRARY)
6445
ADD_LIBRARY(IfcPlusPlus SHARED ${IFCPP_SOURCE_FILES})
6546
ENDIF(BUILD_STATIC_LIBRARY)
6647

48+
TARGET_LINK_LIBRARIES(IfcPlusPlus
49+
PUBLIC
50+
carve)
51+
52+
TARGET_INCLUDE_DIRECTORIES(IfcPlusPlus
53+
PUBLIC
54+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
55+
"$<INSTALL_INTERFACE:include>")
56+
57+
IF(Boost_FOUND)
58+
59+
TARGET_INCLUDE_DIRECTORIES(IfcPlusPlus
60+
PUBLIC
61+
${Boost_INCLUDE_DIRS})
62+
63+
TARGET_COMPILE_DEFINITIONS(IfcPlusPlus
64+
PUBLIC
65+
CARVE_SYSTEM_BOOST)
66+
67+
ENDIF()
68+
6769
set_target_properties(IfcPlusPlus PROPERTIES DEBUG_POSTFIX "d")
6870
set_target_properties(IfcPlusPlus PROPERTIES LINK_FLAGS_DEBUG "/debug /INCREMENTAL:NO")
6971

@@ -74,7 +76,22 @@ INSTALL(
7476
)
7577
INSTALL(
7678
TARGETS IfcPlusPlus
79+
EXPORT IfcPlusPlus
7780
RUNTIME DESTINATION bin
7881
LIBRARY DESTINATION lib
7982
ARCHIVE DESTINATION lib
8083
)
84+
85+
SET(target_output_filename IfcPlusPlus-targets.cmake)
86+
SET(target_output "${CMAKE_BINARY_DIR}/cmake/${target_output_filename}")
87+
88+
export(
89+
EXPORT IfcPlusPlus
90+
FILE ${target_output}
91+
NAMESPACE IFCPP::)
92+
93+
install(
94+
EXPORT IfcPlusPlus
95+
DESTINATION ${IFCPP_CONFIG_DIR}
96+
FILE ${target_output_filename}
97+
NAMESPACE IFCPP::)

cmake/IFCPPConfig.cmake.in

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
# Import the target for ifcquery::carve
3+
if(NOT TARGET ifcquery::carve)
4+
include("${CMAKE_CURRENT_LIST_DIR}/carve-targets.cmake")
5+
endif()
6+
7+
# Import the target for ifcquery::IfcPlusPlus
8+
if(NOT TARGET ifcquery::IfcPlusPlus)
9+
include("${CMAKE_CURRENT_LIST_DIR}/IfcPlusPlus-targets.cmake")
10+
endif()
11+
12+
# For people who use old-fashioned cmake
13+
set(IFCPP_LIBRARIES IFCPP::IfcPlusPlus)
14+
15+
# IFCPP_INCLUDE_DIRS is not needed, because users who link to
16+
# IFCPP_LIBRARIES will automatically get the necessary include directories.

examples/SimpleViewerExampleQt/CMakeLists.txt

+23-48
Original file line numberDiff line numberDiff line change
@@ -19,36 +19,9 @@ FIND_PACKAGE(Qt5Core REQUIRED)
1919
FIND_PACKAGE(Qt5Widgets REQUIRED)
2020
FIND_PACKAGE(Qt5OpenGL REQUIRED)
2121
ADD_DEFINITIONS(${Qt5Widgets_DEFINITIONS})
22-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES}
23-
${QT_INCLUDES}
24-
${QT_INCLUDE_DIR}
25-
${QT_QT_INCLUDE_DIR}
26-
${QT_QTCORE_INCLUDE_DIR}
27-
${QT_QTGUI_INCLUDE_DIR}
28-
${QT_QTOPENGL_INCLUDE_DIR}
29-
${Qt5Widgets_INCLUDE_DIRS}
30-
)
3122

3223
FIND_PACKAGE(OpenSceneGraph REQUIRED osgDB osgUtil osgGA osgFX osgSim osgText osgViewer)
3324

34-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR})
35-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/include)
36-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/src)
37-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/common)
38-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/src/common)
39-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/src/include)
40-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_BINARY_DIR}/include)
41-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${IFCPP_SOURCE_DIR}/IfcPlusPlus/src/)
42-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${IFCPP_SOURCE_DIR}/examples/SimpleViewerExampleQt/src/)
43-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OPENTHREADS_INCLUDE_DIR} )
44-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSG_INCLUDE_DIR} )
45-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSGGA_INCLUDE_DIR} )
46-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSGDB_INCLUDE_DIR} )
47-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSGUTIL_INCLUDE_DIR} )
48-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSGANIMATION_INCLUDE_DIR} )
49-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSGTEXT_INCLUDE_DIR} )
50-
INCLUDE_DIRECTORIES( ${INCLUDE_DIRECTORIES} ${OSG_BINARY_DIR}/include )
51-
5225
SET(IFCPPVIEWER_SOURCE_FILES
5326
src/IfcPlusPlusSystem.cpp
5427
src/main.cpp
@@ -84,12 +57,6 @@ ENDIF()
8457

8558
QT5_WRAP_CPP( IFCPPVIEWER_MOC_GENERATED_FILES ${IFCPPVIEWER_MOC_FILES})
8659

87-
LINK_DIRECTORIES (${LINK_DIRECTORIES} ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE})
88-
LINK_DIRECTORIES (${LINK_DIRECTORIES} ${CARVE_BINARY_DIR}/lib)
89-
LINK_DIRECTORIES (${LINK_DIRECTORIES} ${CARVE_BINARY_DIR}/common)
90-
LINK_DIRECTORIES (${LINK_DIRECTORIES} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG})
91-
LINK_DIRECTORIES (${LINK_DIRECTORIES} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE})
92-
9360
ADD_EXECUTABLE(SimpleViewerExample
9461
${IFCPPVIEWER_MOC_GENERATED_FILES}
9562
${IFCPPVIEWER_SOURCE_FILES}
@@ -106,26 +73,34 @@ If(UNIX)
10673
else(UNIX)
10774
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OPENTHREADS_LIBRARY} debug ${OPENTHREADS_LIBRARY_DEBUG})
10875
ENDIF()
109-
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OSG_LIBRARY} debug ${OSG_LIBRARY_DEBUG})
110-
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OSGDB_LIBRARY} debug ${OSGDB_LIBRARY_DEBUG})
111-
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OSGGA_LIBRARY} debug ${OSGGA_LIBRARY_DEBUG})
112-
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OSGUTIL_LIBRARY} debug ${OSGUTIL_LIBRARY_DEBUG})
113-
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OSGFX_LIBRARY} debug ${OSGFX_LIBRARY_DEBUG})
114-
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OSGVIEWER_LIBRARY} debug ${OSGVIEWER_LIBRARY_DEBUG})
115-
TARGET_LINK_LIBRARIES(SimpleViewerExample optimized ${OSGTEXT_LIBRARY} debug ${OSGTEXT_LIBRARY_DEBUG})
116-
TARGET_LINK_LIBRARIES(SimpleViewerExample ${QT_LIBRARIES})
117-
TARGET_LINK_LIBRARIES(SimpleViewerExample carve)
118-
TARGET_LINK_LIBRARIES(SimpleViewerExample IfcPlusPlus)
11976

120-
IF(CMAKE_COMPILER_IS_GNUCXX)
121-
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
122-
ENDIF()
77+
TARGET_LINK_LIBRARIES(SimpleViewerExample
78+
IfcPlusPlus
79+
Qt5::Widgets
80+
Qt5::OpenGL
81+
optimized ${OSG_LIBRARY} debug ${OSG_LIBRARY_DEBUG}
82+
optimized ${OSGDB_LIBRARY} debug ${OSGDB_LIBRARY_DEBUG}
83+
optimized ${OSGDB_LIBRARY} debug ${OSGDB_LIBRARY_DEBUG}
84+
optimized ${OSGGA_LIBRARY} debug ${OSGGA_LIBRARY_DEBUG}
85+
optimized ${OSGUTIL_LIBRARY} debug ${OSGUTIL_LIBRARY_DEBUG}
86+
optimized ${OSGFX_LIBRARY} debug ${OSGFX_LIBRARY_DEBUG}
87+
optimized ${OSGVIEWER_LIBRARY} debug ${OSGVIEWER_LIBRARY_DEBUG}
88+
optimized ${OSGTEXT_LIBRARY} debug ${OSGTEXT_LIBRARY_DEBUG})
89+
90+
TARGET_INCLUDE_DIRECTORIES(SimpleViewerExample
91+
PRIVATE
92+
${CMAKE_CURRENT_SOURCE_DIR}/src
93+
${OPENTHREADS_INCLUDE_DIR}
94+
${OSG_INCLUDE_DIR}
95+
${OSGGA_INCLUDE_DIR}
96+
${OSGDB_INCLUDE_DIR}
97+
${OSGUTIL_INCLUDE_DIR}
98+
${OSGANIMATION_INCLUDE_DIR}
99+
${OSGTEXT_INCLUDE_DIR})
123100

124101
INSTALL(
125102
TARGETS SimpleViewerExample
126103
RUNTIME DESTINATION bin
127104
LIBRARY DESTINATION bin
128105
ARCHIVE DESTINATION lib
129106
)
130-
131-

external/Carve/CMakeLists.txt

+36-12
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ CONFIGURE_FILE (
2828
"${CARVE_SOURCE_DIR}/src/include/carve/cmake-config.h.in"
2929
"${CARVE_BINARY_DIR}/include/carve/config.h"
3030
)
31-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_SOURCE_DIR}/src/include)
32-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${CARVE_BINARY_DIR}/include) # For the generated Config file
3331

3432
SET(CARVE_SOURCE_FILES
3533
src/lib/aabb.cpp
@@ -69,21 +67,47 @@ ELSE(CMAKE_COMPILER_IS_GNUCXX)
6967
ADD_LIBRARY(carve STATIC ${CARVE_SOURCE_FILES})
7068
ENDIF()
7169

70+
# Use this to request C++11 features. Dependent targets will transitively get
71+
# this requirement as well.
72+
TARGET_COMPILE_FEATURES(carve PUBLIC cxx_auto_type)
73+
7274
set_target_properties(carve PROPERTIES DEBUG_POSTFIX "d")
7375

76+
TARGET_INCLUDE_DIRECTORIES(carve
77+
PUBLIC
78+
"$<BUILD_INTERFACE:${CARVE_SOURCE_DIR}/src/include>"
79+
"$<BUILD_INTERFACE:${CARVE_BINARY_DIR}/include>" # For the generated Config file
80+
"$<INSTALL_INTERFACE:include>"
81+
)
7482

7583
INSTALL(
7684
DIRECTORY src/include/carve
7785
DESTINATION include
86+
PATTERN "*.in" EXCLUDE
7887
)
7988
INSTALL(
80-
TARGETS carve
81-
RUNTIME DESTINATION bin
82-
LIBRARY DESTINATION lib
83-
ARCHIVE DESTINATION lib
84-
)
85-
86-
IF(CMAKE_COMPILER_IS_GNUCXX)
87-
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
88-
ENDIF()
89-
89+
FILES "${CARVE_BINARY_DIR}/include/carve/config.h"
90+
DESTINATION include/carve
91+
)
92+
INSTALL(
93+
TARGETS carve
94+
EXPORT carve
95+
RUNTIME DESTINATION bin
96+
LIBRARY DESTINATION lib
97+
ARCHIVE DESTINATION lib
98+
)
99+
100+
# Export the targets so they can be consumed by other cmake projects
101+
SET(target_output_filename carve-targets.cmake)
102+
SET(target_output "${CMAKE_BINARY_DIR}/cmake/${target_output_filename}")
103+
104+
export(
105+
EXPORT carve
106+
FILE ${target_output}
107+
NAMESPACE IFCPP::)
108+
109+
install(
110+
EXPORT carve
111+
DESTINATION ${IFCPP_CONFIG_DIR}
112+
FILE ${target_output_filename}
113+
NAMESPACE IFCPP::)

0 commit comments

Comments
 (0)