################################################################################ # # # This file is part of IfcOpenShell. # # # # IfcOpenShell is free software: you can redistribute it and/or modify # # it under the terms of the Lesser GNU General Public License as published by # # the Free Software Foundation, either version 3.0 of the License, or # # (at your option) any later version. # # # # IfcOpenShell is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # Lesser GNU General Public License for more details. # # # # You should have received a copy of the Lesser GNU General Public License # # along with this program. If not, see . # # # ################################################################################ cmake_minimum_required (VERSION 2.6) project (IfcOpenShell) OPTION(UNICODE_SUPPORT "Build with Unicode support enabled (requires ICU)." ON) OPTION(COLLADA_SUPPORT "Build with COLLADA support enabled (requires OpenCOLLADA)." ON) OPTION(ENABLE_BUILD_OPTIMIZATIONS "Enable certain compiler and linker optimizations on RelWithDebInfo and Release builds." OFF) #TODO OPTION(IFCCONVERT_DOUBLE_PRECISION "IfcConvert: Use double precision floating-point numbers." OFF) OPTION(USE_IFC4 "Use IFC 4 instead of IFC 2x3" OFF) OPTION(BUILD_IFCPYTHON "Build IfcPython." ON) OPTION(BUILD_EXAMPLES "Build example applications." ON) # Find Boost IF(MSVC) SET(Boost_USE_STATIC_LIBS ON) ENDIF() FIND_PACKAGE(Boost REQUIRED COMPONENTS system program_options regex thread date_time) MESSAGE(STATUS "Boost include files found in ${Boost_INCLUDE_DIRS}") MESSAGE(STATUS "Boost libraries found in ${Boost_LIBRARY_DIRS}") # Find Open CASCADE IF("$ENV{OCC_INCLUDE_DIR}" STREQUAL "") SET(OCC_INCLUDE_DIR "/usr/include/opencascade/" CACHE FILEPATH "Open CASCADE header files") MESSAGE(STATUS "Looking for opencascade include files in: ${OCC_INCLUDE_DIR}") MESSAGE(STATUS "Use OCC_INCLUDE_DIR to specify another directory") ELSE() SET(OCC_INCLUDE_DIR $ENV{OCC_INCLUDE_DIR} CACHE FILEPATH "Open CASCADE header files") MESSAGE(STATUS "Looking for opencascade include files in: ${OCC_INCLUDE_DIR}") ENDIF() FIND_FILE(gp_Pnt_hxx "gp_Pnt.hxx" ${OCC_INCLUDE_DIR} /usr/inc /usr/local/inc /usr/local/include/oce) IF(gp_Pnt_hxx) MESSAGE(STATUS "Header files found") ELSE() MESSAGE(FATAL_ERROR "Unable to find header files, aborting") ENDIF() IF("$ENV{OCC_LIBRARY_DIR}" STREQUAL "") SET(OCC_LIBRARY_DIR "/usr/lib/" CACHE FILEPATH "Open CASCADE library files") MESSAGE(STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR}") MESSAGE(STATUS "Use OCC_LIBRARY_DIR to specify another directory") ELSE() SET(OCC_LIBRARY_DIR $ENV{OCC_LIBRARY_DIR} CACHE FILEPATH "Open CASCADE library files") MESSAGE(STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR}") ENDIF() FIND_LIBRARY(libTKernel "TKernel" ${OCC_LIBRARY_DIR} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64) IF(libTKernel) MESSAGE(STATUS "Library files found") ELSE() MESSAGE(FATAL_ERROR "Unable to find library files, aborting") ENDIF() IF(UNICODE_SUPPORT) # Find ICU IF("$ENV{ICU_INCLUDE_DIR}" STREQUAL "") MESSAGE(STATUS "No ICU include directory specified") ElSE() SET(ICU_INCLUDE_DIR "$ENV{ICU_INCLUDE_DIR}" CACHE FILEPATH "ICU header files") ENDIF() IF("$ENV{ICU_LIBRARY_DIR}" STREQUAL "") MESSAGE(STATUS "No ICU library directory specified") ElSE() SET(ICU_LIBRARY_DIR "$ENV{ICU_LIBRARY_DIR}" CACHE FILEPATH "ICU library files") ENDIF() FIND_LIBRARY(icu "icuuc" /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${ICU_LIBRARY_DIR}) IF(icu) ADD_DEFINITIONS(-DHAVE_ICU) MESSAGE(STATUS "ICU libraries found") IF(MSVC) ADD_DEFINITIONS(-DU_STATIC_IMPLEMENTATION) # required for static ICU ENDIF() ELSE() MESSAGE(STATUS "Unable to find ICU library files, continuing") ENDIF() ENDIF() IF(COLLADA_SUPPORT) # Find OpenCOLLADA IF("$ENV{OPENCOLLADA_INCLUDE_DIR}" STREQUAL "") MESSAGE(STATUS "No OpenCOLLADA include directory specified") SET(OPENCOLLADA_INCLUDE_DIR "/usr/local/include/opencollada" CACHE FILEPATH "OpenCOLLADA header files") ElSE() SET(OPENCOLLADA_INCLUDE_DIR "$ENV{OPENCOLLADA_INCLUDE_DIR}" CACHE FILEPATH "OpenCOLLADA header files") ENDIF() IF("$ENV{OPENCOLLADA_LIBRARY_DIR}" STREQUAL "") MESSAGE(STATUS "No OpenCOLLADA library directory specified") SET(OPENCOLLADA_LIBRARY_DIR "/usr/local/lib/opencollada" CACHE FILEPATH "OpenCOLLADA library files") ElSE() SET(OPENCOLLADA_LIBRARY_DIR "$ENV{OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files") ENDIF() SET(OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter") FIND_FILE(COLLADASWStreamWriter_h "COLLADASWStreamWriter.h" ${OPENCOLLADA_INCLUDE_DIRS}) IF(COLLADASWStreamWriter_h) MESSAGE(STATUS "OpenCOLLADA header files found") ADD_DEFINITIONS(-DWITH_OPENCOLLADA) SET(OPENCOLLADA_LIBRARIES GeneratedSaxParser MathMLSolver OpenCOLLADABaseUtils OpenCOLLADAFramework OpenCOLLADASaxFrameworkLoader OpenCOLLADAStreamWriter UTF buffer ftoa pcre ) ELSE() MESSAGE(STATUS "OpenCOLLADA header files not found, continuing without COLLADA support") ENDIF() ENDIF() # TODO Are these needed on other platforms still or can these be removed for good? IF (NOT WIN32) INCLUDE(CheckIncludeFileCXX) MACRO(CHECK_ADD_OCE_OCC_DEF INCLUDE) STRING(REPLACE . _ STR ${INCLUDE}) STRING(TOUPPER ${STR} STR) CHECK_INCLUDE_FILE_CXX("${INCLUDE}" FOUND_${STR}) IF(FOUND_${STR}) ADD_DEFINITIONS(-DOCE_HAVE_${STR}) ADD_DEFINITIONS(-DHAVE_${STR}) ENDIF(FOUND_${STR}) ENDMACRO(CHECK_ADD_OCE_OCC_DEF) CHECK_ADD_OCE_OCC_DEF(limits) CHECK_ADD_OCE_OCC_DEF(climits) CHECK_ADD_OCE_OCC_DEF(limits.h) CHECK_ADD_OCE_OCC_DEF(fstream) CHECK_ADD_OCE_OCC_DEF(fstream.h) CHECK_ADD_OCE_OCC_DEF(iomanip) CHECK_ADD_OCE_OCC_DEF(iomanip.h) CHECK_ADD_OCE_OCC_DEF(iostream) CHECK_ADD_OCE_OCC_DEF(iostream.h) ENDIF() IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE "Release") ENDIF(NOT CMAKE_BUILD_TYPE) # NOTE: RelWithDebInfo and Release use O2 (= /Ox /Gl /Gy/ = Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy) by default, # with the exception with RelWithDebInfo has /Ob1 instead. /Ob2 has been observed to improve the performance # of IfcConvert significantly. if(ENABLE_BUILD_OPTIMIZATIONS) if(MSVC) # C++ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /GL") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} /Zi") # Linker # /OPT:REF enables also /OPT:ICF and disables INCREMENTAL set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG /OPT:REF") # /OPT:NOICF is recommended when /DEBUG is used (http://msdn.microsoft.com/en-us/library/xe4t6fc1.aspx) set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:NOICF") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG /OPT:REF") set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:NOICF") else() #TODO GCC (& Clang?) optimizations message(STATUS "ENABLE_BUILD_OPTIMIZATIONS not implemented for GCC/non-MSVC compilers.)") endif() endif() IF(MSVC) # Disable warnings about unsafe C functions; we could use the safe C99 & C11 versions if we have no need for supporting old compilers. ADD_DEFINITIONS(-D_UNICODE -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS) ADD_DEFINITIONS(-bigobj) # required for building the big ifcXXX.objs, https://msdn.microsoft.com/en-us/library/ms173499.aspx # Link against the static VC runtime FOREACH(flag CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) IF(${flag} MATCHES "/MD") STRING(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}") ENDIF() IF(${flag} MATCHES "/MDd") STRING(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}") ENDIF() ENDFOREACH() ElSE() ADD_DEFINITIONS(-fPIC -Wno-non-virtual-dtor) ENDIF() INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS} ${ICU_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ) if(NOT WIN32) INCLUDE_DIRECTORIES(${LINK_DIRECTORIES} /usr/inc /usr/local/inc /usr/local/include/oce) endif() IF(USE_IFC4) ADD_DEFINITIONS(-DUSE_IFC4) ELSE() ADD_DEFINITIONS(-DUSE_IFC2x3) ENDIF() # IfcParse file(GLOB CPP_FILES ../src/ifcparse/*.cpp) file(GLOB H_FILES ../src/ifcparse/*.h) set(SOURCE_FILES ${CPP_FILES} ${H_FILES}) ADD_LIBRARY(IfcParse STATIC ${SOURCE_FILES}) IF(icu) TARGET_LINK_LIBRARIES(IfcParse icuuc icudt) ENDIF() # IfcGeom file(GLOB CPP_FILES ../src/ifcgeom/*.cpp) file(GLOB H_FILES ../src/ifcgeom/*.h) set(SOURCE_FILES ${CPP_FILES} ${H_FILES}) ADD_LIBRARY(IfcGeom STATIC ${SOURCE_FILES}) TARGET_LINK_LIBRARIES(IfcGeom IfcParse) LINK_DIRECTORIES(${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OCC_LIBRARY_DIR} ${OPENCOLLADA_LIBRARY_DIR} ${ICU_LIBRARY_DIR} ${Boost_LIBRARY_DIRS} ) if(NOT WIN32) LINK_DIRECTORIES(${LINK_DIRECTORIES} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64) endif() # IfcConvert # TODO # if (IFCCONVERT_DOUBLE_PRECISION) # add_definitions(-DIFCCONVERT_DOUBLE_PRECISION) # endif() file(GLOB CPP_FILES ../src/ifcconvert/*.cpp) file(GLOB H_FILES ../src/ifcconvert/*.h) set(SOURCE_FILES ${CPP_FILES} ${H_FILES}) ADD_EXECUTABLE(IfcConvert ${SOURCE_FILES}) TARGET_LINK_LIBRARIES(IfcConvert IfcParse IfcGeom TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO TKFillet TKSTEP TKSTEPBase TKSTEPAttr TKXSBase TKSTEP209 TKIGES TKOffset ${Boost_LIBRARIES} ${OPENCOLLADA_LIBRARIES} ) # IfcGeomServer file(GLOB CPP_FILES ../src/ifcgeomserver/*.cpp) file(GLOB H_FILES ../src/ifcgeomserver/*.h) set(SOURCE_FILES ${CPP_FILES} ${H_FILES}) ADD_EXECUTABLE(IfcGeomServer ${SOURCE_FILES}) TARGET_LINK_LIBRARIES(IfcGeomServer IfcParse IfcGeom TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO TKFillet TKSTEP TKSTEPBase TKSTEPAttr TKXSBase TKSTEP209 TKIGES TKOffset ${Boost_LIBRARIES} ) IF(BUILD_IFCPYTHON) ADD_SUBDIRECTORY(../src/ifcwrap ifcwrap) ENDIF() IF(BUILD_EXAMPLES) ADD_SUBDIRECTORY(../src/examples examples) ENDIF() # ADD_SUBDIRECTORY(../src/qtviewer qtviewer) # CMake installation targets FILE(GLOB include_files_geom ../src/ifcgeom/*.h) FILE(GLOB include_files_parse ../src/ifcparse/*.h) INSTALL(FILES ${include_files_geom} DESTINATION include/ifcgeom) INSTALL(FILES ${include_files_parse} DESTINATION include/ifcparse) INSTALL(TARGETS IfcConvert IfcGeomServer DESTINATION bin) INSTALL(TARGETS IfcParse IfcGeom DESTINATION lib)