1+ cmake_minimum_required(VERSION 3.1)
2+ project(xthreejs)
3+
4+ message(STATUS "Forcing tests build type to Release")
5+ set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
6+
7+ set(XTHREEJS_INCLUDE_DIR ${ CMAKE_CURRENT_SOURCE_DIR} /include)
8+ set(XTHREEJS_SOURCE_DIR ${ CMAKE_CURRENT_SOURCE_DIR} /src)
9+
10+ # Configuration
11+ # =============
12+
13+ include(GNUInstallDirs)
14+ include(CMakePackageConfigHelpers)
15+
16+ set(XTHREEJS_INSTALL_LIBRARY_DIR "\"${ CMAKE_INSTALL_PREFIX} /${ CMAKE_INSTALL_LIBDIR} \"")
17+
18+ configure_file (
19+ "${ XTHREEJS_INCLUDE_DIR} /xthreejs/xthreejs_config.hpp.in"
20+ "${ XTHREEJS_INCLUDE_DIR} /xthreejs/xthreejs_config.hpp"
21+ )
22+
23+ # Versionning
24+ # ===========
25+
26+ file(STRINGS "${ XTHREEJS_INCLUDE_DIR} /xthreejs/xthreejs_config.hpp" xthreejs_version_defines
27+ REGEX "#define XTHREEJS_VERSION_(MAJOR|MINOR|PATCH)")
28+ foreach(ver ${ xthreejs_version_defines} )
29+ if(ver MATCHES "#define XTHREEJS_VERSION_(MAJOR|MINOR|PATCH) +([^ ]+)$")
30+ set(XTHREEJS_VERSION_${ CMAKE_MATCH_1} "${ CMAKE_MATCH_2} " CACHE INTERNAL "")
31+ endif()
32+ endforeach()
33+ set(XTHREEJS_VERSION
34+ ${ XTHREEJS_VERSION_MAJOR} .${ XTHREEJS_VERSION_MINOR} .${ XTHREEJS_VERSION_PATCH} )
35+ message(STATUS "xthreejs version: v${ XTHREEJS_VERSION} ")
36+
37+ # Binary version
38+ # See the following URL for explanations about the binary versionning
39+ # https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
40+ file(STRINGS "${ XTHREEJS_INCLUDE_DIR} /xthreejs/xthreejs_config.hpp" xthreejs_version_defines
41+ REGEX "#define XTHREEJS_BINARY_(CURRENT|REVISION|AGE)")
42+ foreach(ver ${ xthreejs_version_defines} )
43+ if(ver MATCHES "#define XTHREEJS_BINARY_(CURRENT|REVISION|AGE) +([^ ]+)$")
44+ set(XTHREEJS_BINARY_${ CMAKE_MATCH_1} "${ CMAKE_MATCH_2} " CACHE INTERNAL "")
45+ endif()
46+ endforeach()
47+ set(XTHREEJS_BINARY_VERSION
48+ ${ XTHREEJS_BINARY_CURRENT} .${ XTHREEJS_BINARY_REVISION} .${ XTHREEJS_BINARY_AGE} )
49+ message(STATUS "xthreejs binary version: v${ XTHREEJS_BINARY_VERSION} ")
50+
51+ # Dependencies
52+ # ============
53+
54+ find_package(cppzmq 4.2.3 REQUIRED)
55+ find_package(xtl 0.4 REQUIRED)
56+ find_package(xeus 0.10.1 REQUIRED)
57+ find_package(xwidgets 0.7 REQUIRED)
58+ find_package(xproperty 0.7 REQUIRED)
59+
60+ # Source files
61+ # ============
62+
63+ set(XTHREEJS_HEADERS
64+ { {#each hppfiles as |file|} }
65+ ${ XTHREEJS_INCLUDE_DIR} /xthreejs/{ {{ file } }}
66+ { {/each} }
67+ ${ XTHREEJS_INCLUDE_DIR} /xthreejs/xthreejs_config.hpp
68+ )
69+
70+ set(XTHREEJS_SOURCES
71+ { {#each cppfiles as |file|} }
72+ ${ XTHREEJS_SOURCE_DIR} /{ {{ file } }}
73+ { {/each} }
74+ )
75+
76+ # Output
77+ # ======
78+
79+ OPTION(XTHREEJS_PRECOMPILED "precompile xthreejs instances" ON)
80+ if(XTHREEJS_PRECOMPILED)
81+ add_definitions(-DXTHREEJS_PRECOMPILED)
82+ endif()
83+
84+ add_library(xthreejs SHARED ${ XTHREEJS_SOURCES} ${ XTHREEJS_HEADERS} )
85+
86+ target_include_directories(xthreejs PUBLIC $<BUILD _INTERFACE:${XTHREEJS_INCLUDE_DIR} >
87+ $<INSTALL _INTERFACE:include >)
88+
89+ target_link_libraries(xthreejs
90+ PUBLIC xtl
91+ PUBLIC xwidgets
92+ PRIVATE xeus)
93+
94+ set_target_properties(xthreejs PROPERTIES
95+ PUBLIC_HEADER "${ XTHREEJS_HEADERS} "
96+ COMPILE_DEFINITIONS "XTHREEJS_EXPORTS"
97+ PREFIX ""
98+ VERSION ${ XTHREEJS_BINARY_VERSION}
99+ SOVERSION ${ XTHREEJS_BINARY_CURRENT}
100+ OUTPUT_NAME "libxthreejs")
101+
102+ # Compilation flags
103+ # =================
104+
105+ include(CheckCXXCompilerFlag)
106+ string(TOUPPER "${ CMAKE_BUILD_TYPE} " U_CMAKE_BUILD_TYPE)
107+ OPTION(DISABLE_ARCH_NATIVE "disable -march=native flag" OFF)
108+
109+ set_target_properties(xthreejs PROPERTIES
110+ CXX_EXTENSIONS OFF
111+ CXX_STANDARD_REQUIRED 14)
112+
113+ target_compile_features(xthreejs PRIVATE cxx_std_14)
114+
115+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
116+ target_compile_options(xthreejs PUBLIC -Wunused-parameter -Wextra -Wreorder)
117+ if (DISABLE_ARCH_NATIVE)
118+ target_compile_options(xthreejs PUBLIC -mtune=generic)
119+ else()
120+ target_compile_options(xthreejs PUBLIC -march=native)
121+ endif()
122+
123+ # Enable link time optimization and set the default symbol
124+ # visibility to hidden (very important to obtain small binaries)
125+ if (NOT ${ U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
126+ # Check for Link Time Optimization support
127+ # (GCC/Clang)
128+ CHECK_CXX_COMPILER_FLAG("-flto" HAS_LTO_FLAG)
129+ if (HAS_LTO_FLAG)
130+ target_compile_options(xthreejs PUBLIC -flto)
131+ endif()
132+
133+ # Intel equivalent to LTO is called IPO
134+ if (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
135+ CHECK_CXX_COMPILER_FLAG("-ipo" HAS_IPO_FLAG)
136+ if (HAS_IPO_FLAG)
137+ target_compile_options(xthreejs PUBLIC -ipo)
138+ endif()
139+ endif()
140+ endif()
141+ message(STATUS "CMAKE_CXX_FLAGS: ${ CMAKE_CXX_FLAGS} ")
142+ endif()
143+
144+ # Installation
145+ # ============
146+
147+ set(XTHREEJS_CMAKECONFIG_INSTALL_DIR "${ CMAKE_INSTALL_LIBDIR} /cmake/${ PROJECT_NAME} " CACHE STRING "install path for xthreejsConfig.cmake")
148+
149+ install(DIRECTORY ${ XTHREEJS_INCLUDE_DIR} /xthreejs DESTINATION ${ CMAKE_INSTALL_INCLUDEDIR} )
150+
151+ install(TARGETS xthreejs
152+ EXPORT ${ PROJECT_NAME} -targets
153+ #PUBLIC_HEADER DESTINATION ${ CMAKE_INSTALL_INCLUDEDIR} /xthreejs
154+ ARCHIVE DESTINATION ${ CMAKE_INSTALL_LIBDIR}
155+ LIBRARY DESTINATION ${ CMAKE_INSTALL_LIBDIR}
156+ RUNTIME DESTINATION ${ CMAKE_INSTALL_BINDIR} )
157+
158+ # Makes the project importable from the build directory
159+ export(EXPORT ${ PROJECT_NAME} -targets
160+ FILE "${ CMAKE_CURRENT_BINARY_DIR} /${ PROJECT_NAME} Targets.cmake")
161+
162+ configure_package_config_file(${ PROJECT_NAME} Config.cmake.in
163+ "${ CMAKE_CURRENT_BINARY_DIR} /${ PROJECT_NAME} Config.cmake"
164+ INSTALL_DESTINATION ${ XTHREEJS_CMAKECONFIG_INSTALL_DIR} )
165+ write_basic_package_version_file(${ CMAKE_CURRENT_BINARY_DIR} /${ PROJECT_NAME} ConfigVersion.cmake
166+ VERSION ${ XTHREEJS_VERSION}
167+ COMPATIBILITY AnyNewerVersion)
168+ install(FILES ${ CMAKE_CURRENT_BINARY_DIR} /${ PROJECT_NAME} Config.cmake
169+ ${ CMAKE_CURRENT_BINARY_DIR} /${ PROJECT_NAME} ConfigVersion.cmake
170+ DESTINATION ${ XTHREEJS_CMAKECONFIG_INSTALL_DIR} )
171+ install(EXPORT ${ PROJECT_NAME} -targets
172+ FILE ${ PROJECT_NAME} Targets.cmake
173+ DESTINATION ${ XTHREEJS_CMAKECONFIG_INSTALL_DIR} )
0 commit comments