Skip to content

Commit 59035e7

Browse files
authored
Merge pull request IfcOpenShell#114 from aothms/cmake_improvements
Cmake improvements: LINK_DIRECTORIES and OCCT 7
2 parents 2c33219 + 1def5db commit 59035e7

File tree

1 file changed

+96
-31
lines changed

1 file changed

+96
-31
lines changed

cmake/CMakeLists.txt

Lines changed: 96 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -142,22 +142,18 @@ ELSE()
142142
MESSAGE(STATUS "Looking for opencascade include files in: ${OCC_INCLUDE_DIR}")
143143
ENDIF()
144144

145-
FIND_FILE(gp_Pnt_hxx "gp_Pnt.hxx" ${OCC_INCLUDE_DIR} /usr/inc /usr/local/inc /usr/local/include/oce)
145+
FIND_FILE(gp_Pnt_hxx "gp_Pnt.hxx" ${OCC_INCLUDE_DIR})
146146
IF(gp_Pnt_hxx)
147147
MESSAGE(STATUS "Header files found")
148148
ELSE()
149149
MESSAGE(FATAL_ERROR "Unable to find header files, aborting")
150150
ENDIF()
151151

152-
SET(OPENCASCADE_LIBRARIES
152+
SET(OPENCASCADE_LIBRARY_NAMES
153153
TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO
154154
TKFillet TKSTEP TKSTEPBase TKSTEPAttr TKXSBase TKSTEP209 TKIGES TKOffset
155155
)
156156

157-
IF(MSVC)
158-
ADD_DEBUG_VARIANTS(OPENCASCADE_LIBRARIES "${OPENCASCADE_LIBRARIES}" "d")
159-
ENDIF()
160-
161157
IF("${OCC_LIBRARY_DIR}" STREQUAL "")
162158
SET(OCC_LIBRARY_DIR "/usr/lib/" CACHE FILEPATH "Open CASCADE library files")
163159
MESSAGE(STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR}")
@@ -167,41 +163,53 @@ ELSE()
167163
MESSAGE(STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR}")
168164
ENDIF()
169165

170-
FIND_LIBRARY(libTKernel NAMES TKernel TKerneld PATHS ${OCC_LIBRARY_DIR} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64)
166+
FIND_LIBRARY(libTKernel NAMES TKernel TKerneld PATHS ${OCC_LIBRARY_DIR} NO_DEFAULT_PATH)
171167
IF(libTKernel)
172168
MESSAGE(STATUS "Library files found")
173169
ELSE()
174170
MESSAGE(FATAL_ERROR "Unable to find library files, aborting")
175171
ENDIF()
176172

173+
# Use the found libTKernel as a template for all other OCC libraries
174+
foreach(lib ${OPENCASCADE_LIBRARY_NAMES})
175+
string(REPLACE TKernel "${lib}" lib_path "${libTKernel}")
176+
list(APPEND OPENCASCADE_LIBRARIES "${lib_path}")
177+
endforeach()
178+
179+
IF(MSVC)
180+
ADD_DEBUG_VARIANTS(OPENCASCADE_LIBRARIES "${OPENCASCADE_LIBRARIES}" "d")
181+
ENDIF()
182+
177183
IF(UNICODE_SUPPORT)
178184
# Find ICU
179185
IF("${ICU_INCLUDE_DIR}" STREQUAL "")
180186
MESSAGE(STATUS "No ICU include directory specified")
181-
ElSE()
182-
SET(ICU_INCLUDE_DIR "${ICU_INCLUDE_DIR}" CACHE FILEPATH "ICU header files")
183187
ENDIF()
184188

185189
IF("${ICU_LIBRARY_DIR}" STREQUAL "")
186190
MESSAGE(STATUS "No ICU library directory specified")
187-
ElSE()
188-
SET(ICU_LIBRARY_DIR "${ICU_LIBRARY_DIR}" CACHE FILEPATH "ICU library files")
191+
FIND_LIBRARY(icu NAMES icuuc icuucd PATHS ${ICU_LIBRARY_DIR})
192+
ELSE()
193+
FIND_LIBRARY(icu NAMES icuuc icuucd PATHS ${ICU_LIBRARY_DIR} NO_DEFAULT_PATH)
189194
ENDIF()
190195

191-
FIND_LIBRARY(icu NAMES icuuc icuucd PATHS /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib ${ICU_LIBRARY_DIR})
192-
193196
IF(icu)
197+
GET_FILENAME_COMPONENT(ICU_LIBRARY_DIR ${icu} PATH)
198+
194199
ADD_DEFINITIONS(-DHAVE_ICU)
195200
MESSAGE(STATUS "ICU libraries found")
196201
# NOTE icudata appears to be icudt on Windows/MSVC and icudata on others
197202
# dl is included to resolve dlopen and friends symbols
198203
IF(WIN32)
199-
SET(ICU_LIBRARIES icuuc icudt)
204+
FIND_LIBRARY(icudt NAMES icudt PATHS ${ICU_LIBRARY_DIR} NO_DEFAULT_PATH)
205+
SET(ICU_LIBRARIES ${icu} ${icudt})
200206
ADD_DEBUG_VARIANTS(ICU_LIBRARIES "${ICU_LIBRARIES}" "d")
201-
# TODO MinGW build would appear to be using dynamic ICU regardless of this definition.
202-
ADD_DEFINITIONS(-DU_STATIC_IMPLEMENTATION) # required for static ICU
207+
# TODO MinGW build would appear to be using dynamic ICU regardless of this definition.
208+
ADD_DEFINITIONS(-DU_STATIC_IMPLEMENTATION) # required for static ICU
203209
ELSE()
204-
SET(ICU_LIBRARIES icuuc icudata dl)
210+
FIND_LIBRARY(icudt NAMES icudata PATHS ${ICU_LIBRARY_DIR} NO_DEFAULT_PATH)
211+
FIND_LIBRARY(dl NAMES dl)
212+
SET(ICU_LIBRARIES ${icu} ${icudt} ${dl})
205213
ENDIF()
206214
ELSE()
207215
MESSAGE(FATAL_ERROR "UNICODE_SUPPORT enabled, but unable to find ICU. Disable UNICODE_SUPPORT or fix ICU paths to proceed.")
@@ -219,9 +227,13 @@ IF(COLLADA_SUPPORT)
219227

220228
IF("${OPENCOLLADA_LIBRARY_DIR}" STREQUAL "")
221229
MESSAGE(STATUS "No OpenCOLLADA library directory specified")
222-
FIND_LIBRARY(OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib)
230+
FIND_LIBRARY(OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework
231+
PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib)
223232
GET_FILENAME_COMPONENT(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_FRAMEWORK_LIB} PATH)
224233
ENDIF()
234+
235+
FIND_LIBRARY(OpenCOLLADAFramework NAMES OpenCOLLADAFramework PATHS ${OPENCOLLADA_LIBRARY_DIR} NO_DEFAULT_PATH)
236+
225237
SET(OPENCOLLADA_LIBRARY_DIR "${OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files")
226238

227239
SET(OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter")
@@ -230,13 +242,29 @@ IF(COLLADA_SUPPORT)
230242
IF(COLLADASWStreamWriter_h)
231243
MESSAGE(STATUS "OpenCOLLADA header files found")
232244
ADD_DEFINITIONS(-DWITH_OPENCOLLADA)
233-
SET(OPENCOLLADA_LIBRARIES
245+
SET(OPENCOLLADA_LIBRARY_NAMES
234246
GeneratedSaxParser MathMLSolver OpenCOLLADABaseUtils OpenCOLLADAFramework OpenCOLLADASaxFrameworkLoader
235-
OpenCOLLADAStreamWriter UTF buffer ftoa pcre
247+
OpenCOLLADAStreamWriter UTF buffer ftoa
236248
)
237-
IF(NOT "${PCRE_LIBRARY_DIR}" STREQUAL "")
249+
250+
# Use the found libTKernel as a template for all other OCC libraries
251+
foreach(lib ${OPENCOLLADA_LIBRARY_NAMES})
252+
string(REPLACE OpenCOLLADAFramework "${lib}" lib_path "${OpenCOLLADAFramework}")
253+
list(APPEND OPENCOLLADA_LIBRARIES "${lib_path}")
254+
endforeach()
255+
256+
IF("${PCRE_LIBRARY_DIR}" STREQUAL "")
257+
find_library(pcre_library NAMES pcre PATHS ${OPENCOLLADA_LIBRARY_DIR})
258+
GET_FILENAME_COMPONENT(PCRE_LIBRARY_DIR ${pcre_library} PATH)
259+
else()
260+
find_library(pcre_library NAMES pcre PATHS ${PCRE_LIBRARY_DIR} NO_DEFAULT_PATH)
261+
endif()
262+
263+
if (${pcre_library})
238264
SET(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_LIBRARY_DIR} ${PCRE_LIBRARY_DIR})
239-
ENDIF()
265+
list(APPEND OPENCOLLADA_LIBRARIES "${pcre_library}")
266+
endif()
267+
240268
IF(MSVC)
241269
ADD_DEBUG_VARIANTS(OPENCOLLADA_LIBRARIES "${OPENCOLLADA_LIBRARIES}" "d")
242270
ENDIF()
@@ -322,7 +350,6 @@ IF(MSVC)
322350
ElSE()
323351
add_definitions(-Wno-non-virtual-dtor -Wall)
324352
# TODO Preferably use -Wextra too, but currently too much warning spam coming from the dependencies' headers.
325-
add_definitions(-std=c++03)
326353
# -fPIC is not relevant on Windows and creates pointless warnings
327354
if (UNIX)
328355
add_definitions(-fPIC)
@@ -332,9 +359,6 @@ ENDIF()
332359
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS}
333360
${ICU_INCLUDE_DIR} ${Boost_INCLUDE_DIRS}
334361
)
335-
if(NOT WIN32)
336-
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} /usr/inc /usr/local/inc /usr/local/include/oce)
337-
endif()
338362

339363
function(files_for_ifc_version IFC_VERSION RESULT_NAME)
340364
set(IFC_PARSE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcparse)
@@ -418,11 +442,52 @@ if(NOT Boost_VERSION LESS 105800)
418442
add_definitions(-DBOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE)
419443
endif()
420444

421-
LINK_DIRECTORIES(${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OCC_LIBRARY_DIR} ${OPENCOLLADA_LIBRARY_DIR}
422-
${ICU_LIBRARY_DIR} ${Boost_LIBRARY_DIRS}
423-
)
424-
if(NOT WIN32)
425-
LINK_DIRECTORIES(${LINK_DIRECTORIES} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64)
445+
# Detect OCC version on gcc/clang/mingw as
446+
# -std=c++11 is needed for OCCT >= 7.0.0
447+
if(NOT MSVC)
448+
FIND_FILE(Standard_Version "Standard_Version.hxx" ${OCC_INCLUDE_DIR})
449+
450+
set(CMAKE_CONFIGURABLE_FILE_CONTENT "
451+
#include <Standard_Version.hxx>
452+
#include <iostream>
453+
int main(int argc, char** argv) {
454+
std::cout << OCC_VERSION_COMPLETE;
455+
}")
456+
configure_file(
457+
"${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in"
458+
"${CMAKE_BINARY_DIR}/version.cxx" @ONLY)
459+
460+
try_compile(VERSION_CHECK
461+
${CMAKE_BINARY_DIR}
462+
"${CMAKE_BINARY_DIR}/version.cxx"
463+
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${OCC_INCLUDE_DIR}"
464+
COPY_FILE "${CMAKE_BINARY_DIR}/version"
465+
OUTPUT_VARIABLE OUT
466+
COPY_FILE_ERROR ERR
467+
)
468+
469+
if(${VERSION_CHECK})
470+
EXECUTE_PROCESS(COMMAND ${CMAKE_BINARY_DIR}/version OUTPUT_VARIABLE OCC_VERSION)
471+
else()
472+
message(FATAL_ERROR "Failed to compile OCC version test:
473+
${OUT}
474+
------
475+
${ERR}")
476+
endif()
477+
478+
MESSAGE(STATUS "OCC version is ${OCC_VERSION}. Detected from: ${Standard_Version}")
479+
480+
if(NOT ("${OCC_VERSION}" LESS "7.0.0"))
481+
include(CheckCXXCompilerFlag)
482+
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
483+
if(COMPILER_SUPPORTS_CXX11)
484+
add_definitions(-std=c++11)
485+
else()
486+
message(FATAL_ERROR "OCCT7 requires a compiler with C++11 support")
487+
endif()
488+
else()
489+
add_definitions(-std=c++03)
490+
endif()
426491
endif()
427492

428493
set(IFCOPENSHELL_LIBRARIES IfcParse IfcGeom)

0 commit comments

Comments
 (0)