diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 6ddb3c1645..39966a5fda 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -30,10 +30,38 @@ OPTION(BUILD_IFCPYTHON "Build IfcPython." ON) OPTION(BUILD_EXAMPLES "Build example applications." ON) OPTION(USE_VLD "Use Visual Leak Detector for debugging memory leaks, MSVC-only." OFF) OPTION(BUILD_IFCMAX "Build IfcMax, a 3ds Max plug-in, Windows-only." OFF) +OPTION(BUILD_SHARED_LIBS "Build ifcparse and ifcgeom libs shared." OFF) # TODO QtViewer is deprecated ATM as it uses the 0.4 API # OPTION(BUILD_QTVIEWER "Build IfcOpenShell Qt GUI Viewer (requires Qt 4 framework)." OFF) +# Specify where to install files +IF(NOT BINDIR) + set(BINDIR bin) +ENDIF() +IF(NOT IS_ABSOLUTE ${BINDIR}) + set(BINDIR ${CMAKE_INSTALL_PREFIX}/${BINDIR}) +ENDIF() +MESSAGE(STATUS "BINDIR: ${BINDIR}") + +IF(NOT INCLUDEDIR) + set(INCLUDEDIR include) +ENDIF() +IF(NOT IS_ABSOLUTE ${INCLUDEDIR}) + set(INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/${INCLUDEDIR}) +ENDIF() +MESSAGE(STATUS "INCLUDEDIR: ${INCLUDEDIR}") + +IF(NOT LIBDIR) + set(LIBDIR lib) +ENDIF() +IF(NOT IS_ABSOLUTE ${LIBDIR}) + set(LIBDIR ${CMAKE_INSTALL_PREFIX}/${LIBDIR}) +ENDIF() +MESSAGE(STATUS "LIBDIR: ${LIBDIR}") + + + # Create cache entries if absent for environment variables MACRO(UNIFY_ENVVARS_AND_CACHE VAR) IF ((NOT DEFINED ${VAR}) AND (NOT "$ENV{${VAR}}" STREQUAL "")) @@ -53,6 +81,20 @@ IF(WIN32) UNIFY_ENVVARS_AND_CACHE(THREEDS_MAX_SDK_HOME) ENDIF() + +# Set INSTALL_RPATH for target +MACRO(SET_INSTALL_RPATHS _target _paths) + SET(${_target}_rpaths "") + FOREACH(_path ${_paths}) + LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${_path}" isSystemDir) + IF("${isSystemDir}" STREQUAL "-1") + LIST(APPEND ${_target}_rpaths ${_path}) + ENDIF() + ENDFOREACH() + MESSAGE(STATUS "Set INSTALL_RPATH for ${_target}: ${${_target}_rpaths}") + SET_TARGET_PROPERTIES(${_target} PROPERTIES INSTALL_RPATH "${${_target}_rpaths}") +ENDMACRO() + # Find Boost IF(MSVC) SET(Boost_USE_STATIC_LIBS ON) @@ -135,7 +177,7 @@ IF(UNICODE_SUPPORT) SET(ICU_LIBRARY_DIR "${ICU_LIBRARY_DIR}" CACHE FILEPATH "ICU library files") ENDIF() - FIND_LIBRARY(icu NAMES icuuc icuucd PATHS /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${ICU_LIBRARY_DIR}) + FIND_LIBRARY(icu NAMES icuuc icuucd PATHS /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib ${ICU_LIBRARY_DIR}) IF(icu) ADD_DEFINITIONS(-DHAVE_ICU) @@ -165,10 +207,10 @@ IF(COLLADA_SUPPORT) IF("${OPENCOLLADA_LIBRARY_DIR}" STREQUAL "") MESSAGE(STATUS "No OpenCOLLADA library directory specified") - SET(OPENCOLLADA_LIBRARY_DIR "/usr/lib/opencollada" CACHE FILEPATH "OpenCOLLADA library files") - ElSE() - SET(OPENCOLLADA_LIBRARY_DIR "${OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files") + FIND_LIBRARY(OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib) + GET_FILENAME_COMPONENT(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_FRAMEWORK_LIB} PATH) ENDIF() + SET(OPENCOLLADA_LIBRARY_DIR "${OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files") SET(OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter") @@ -361,6 +403,11 @@ else() endif() endif() +# Boost >= 1.58 requires BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE to build +if(NOT Boost_VERSION LESS 105800) + add_definitions(-DBOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE) +endif() + # IfcParse file(GLOB IFCPARSE_H_FILES ../src/ifcparse/*.h) file(GLOB IFCPARSE_CPP_FILES ../src/ifcparse/*.cpp) @@ -386,7 +433,15 @@ file(GLOB IFCGEOM_H_FILES ../src/ifcgeom/*.h) file(GLOB IFCGEOM_CPP_FILES ../src/ifcgeom/*.cpp) set(IFCGEOM_FILES ${IFCGEOM_CPP_FILES} ${IFCGEOM_H_FILES}) -ADD_LIBRARY(IfcGeom STATIC ${IFCGEOM_FILES}) +IF(BUILD_SHARED_LIBS) + ADD_LIBRARY(IfcGeom SHARED ${IFCGEOM_FILES}) + SET(IFCLIBS "IfcGeom") + SET(IFCDIRS "${LIBDIR}") +ELSE() + ADD_LIBRARY(IfcGeom STATIC ${IFCGEOM_FILES}) + SET(IFCLIBS "IfcParse;IfcGeom") + SET(IFCDIRS "") +ENDIF() TARGET_LINK_LIBRARIES(IfcGeom IfcParse) @@ -414,10 +469,12 @@ if("${libTKernelExt}" STREQUAL ".a") if (NOT APPLE) set(LIB_RT "rt") endif() - set(OPENCASCADE_LIBRARIES ${OPENCASCADE_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${LIB_RT} dl) + set(OPENCASCADE_LIBRARIES ${OPENCASCADE_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${LIB_RT} dl) endif() -TARGET_LINK_LIBRARIES(IfcConvert IfcParse IfcGeom ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${OPENCOLLADA_LIBRARIES} ${ICU_LIBRARIES}) +TARGET_LINK_LIBRARIES(IfcConvert ${IFCLIBS} ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${OPENCOLLADA_LIBRARIES} ${ICU_LIBRARIES}) +SET_INSTALL_RPATHS(IfcConvert "${IFCDIRS};${OCC_LIBRARY_DIR};${Boost_LIBRARY_DIRS};${OPENCOLLADA_LIBRARY_DIR};${ICU_LIBRARY_DIR}") + # IfcGeomServer file(GLOB CPP_FILES ../src/ifcgeomserver/*.cpp) @@ -425,7 +482,8 @@ 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 ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${ICU_LIBRARIES}) +TARGET_LINK_LIBRARIES(IfcGeomServer ${IFCLIBS} ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${ICU_LIBRARIES}) +SET_INSTALL_RPATHS(IfcGeomServer "${IFCDIRS};${OCC_LIBRARY_DIR};${Boost_LIBRARY_DIRS};${ICU_LIBRARY_DIR}") IF(BUILD_IFCPYTHON) ADD_SUBDIRECTORY(../src/ifcwrap ifcwrap) @@ -440,7 +498,7 @@ IF(BUILD_IFCMAX) ENDIF() # CMake installation targets -INSTALL(FILES ${IFCPARSE_H_FILES} DESTINATION include/ifcparse) -INSTALL(FILES ${IFCGEOM_H_FILES} DESTINATION include/ifcgeom) -INSTALL(TARGETS IfcConvert IfcGeomServer DESTINATION bin) -INSTALL(TARGETS IfcParse IfcGeom DESTINATION lib) +INSTALL(FILES ${IFCPARSE_H_FILES} DESTINATION ${INCLUDEDIR}/ifcparse) +INSTALL(FILES ${IFCGEOM_H_FILES} DESTINATION ${INCLUDEDIR}/ifcgeom) +INSTALL(TARGETS IfcConvert IfcGeomServer DESTINATION ${BINDIR}) +INSTALL(TARGETS ${IFCLIBS} DESTINATION ${LIBDIR}) diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index 8805d40e8c..b7f96c2df9 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -18,9 +18,13 @@ ################################################################################ ADD_EXECUTABLE(IfcParseExamples IfcParseExamples.cpp) -TARGET_LINK_LIBRARIES(IfcParseExamples IfcParse) +IF(BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(IfcParseExamples ${IFCLIBS}) +ELSE() + TARGET_LINK_LIBRARIES(IfcParseExamples IfcParse) +ENDIF() set_target_properties(IfcParseExamples PROPERTIES FOLDER Examples) ADD_EXECUTABLE(IfcOpenHouse IfcOpenHouse.cpp) -TARGET_LINK_LIBRARIES(IfcOpenHouse IfcParse IfcGeom ${OPENCASCADE_LIBRARIES}) +TARGET_LINK_LIBRARIES(IfcOpenHouse ${IFCLIBS} ${OPENCASCADE_LIBRARIES}) set_target_properties(IfcOpenHouse PROPERTIES FOLDER Examples) diff --git a/src/ifcconvert/ColladaSerializer.h b/src/ifcconvert/ColladaSerializer.h index 11f06381a1..53e8f6ea36 100644 --- a/src/ifcconvert/ColladaSerializer.h +++ b/src/ifcconvert/ColladaSerializer.h @@ -106,8 +106,8 @@ private: public: explicit ColladaMaterials(COLLADASW::StreamWriter& stream, ColladaSerializer *_serializer) : COLLADASW::LibraryMaterials(&stream) - , effects(stream) - , serializer(_serializer) + , serializer(_serializer) + , effects(stream) {} void add(const IfcGeom::Material& material); bool contains(const IfcGeom::Material& material); @@ -152,10 +152,10 @@ private: ColladaExporter(const std::string& scene_name, const std::string& fn, ColladaSerializer *_serializer) : filename(fn) , stream(filename, sizeof(real_t) == sizeof(double)) // utilise Collada stream's double precision feature - , geometries(stream, _serializer) , scene(scene_name, stream, _serializer) , materials(stream, _serializer) - , serializer(_serializer) + , geometries(stream, _serializer) + , serializer(_serializer) { } ColladaMaterials materials; diff --git a/src/ifcconvert/SvgSerializer.h b/src/ifcconvert/SvgSerializer.h index ea4acb3aff..96099ba1e5 100644 --- a/src/ifcconvert/SvgSerializer.h +++ b/src/ifcconvert/SvgSerializer.h @@ -47,8 +47,8 @@ public: : GeometrySerializer(settings) , svg_file(out_filename.c_str()) , xmin(+std::numeric_limits::infinity()) - , xmax(-std::numeric_limits::infinity()) , ymin(+std::numeric_limits::infinity()) + , xmax(-std::numeric_limits::infinity()) , ymax(-std::numeric_limits::infinity()) , rescale(false) , file(0) diff --git a/src/ifcconvert/WavefrontObjSerializer.h b/src/ifcconvert/WavefrontObjSerializer.h index 52117c62a3..bdbc642ad0 100644 --- a/src/ifcconvert/WavefrontObjSerializer.h +++ b/src/ifcconvert/WavefrontObjSerializer.h @@ -37,8 +37,8 @@ private: public: WaveFrontOBJSerializer(const std::string& obj_filename, const std::string& mtl_filename, const IfcGeom::IteratorSettings &settings) : GeometrySerializer(settings) - , obj_stream(obj_filename.c_str()) , mtl_filename(mtl_filename) + , obj_stream(obj_filename.c_str()) , mtl_stream(mtl_filename.c_str()) , vcount_total(1) {} diff --git a/src/ifcgeom/IfcGeomRenderStyles.h b/src/ifcgeom/IfcGeomRenderStyles.h index 4c97b06406..ca655f0971 100644 --- a/src/ifcgeom/IfcGeomRenderStyles.h +++ b/src/ifcgeom/IfcGeomRenderStyles.h @@ -58,7 +58,7 @@ namespace IfcGeom { this->name = sstr.str(); } SurfaceStyle(const std::string& name) : name(name), original_name_(name) {} - SurfaceStyle(int id, const std::string& name) : id(id), original_name_(name) + SurfaceStyle(int id, const std::string& name) : original_name_(name), id(id) { std::stringstream sstr; std::string sanitized = name; diff --git a/src/ifcgeomserver/IfcGeomServer.cpp b/src/ifcgeomserver/IfcGeomServer.cpp index 0b37b739aa..8a81efbb36 100644 --- a/src/ifcgeomserver/IfcGeomServer.cpp +++ b/src/ifcgeomserver/IfcGeomServer.cpp @@ -58,7 +58,7 @@ std::string sread(std::istream& s) { buf[len] = 0; while (len++ % 4) s.get(); std::string str(buf); - delete buf; + delete[] buf; return str; } diff --git a/src/ifcmax/CMakeLists.txt b/src/ifcmax/CMakeLists.txt index 923532b073..6dbff071a5 100644 --- a/src/ifcmax/CMakeLists.txt +++ b/src/ifcmax/CMakeLists.txt @@ -28,7 +28,7 @@ LINK_DIRECTORIES(${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OCC_LIBRARY_DI ADD_LIBRARY(IfcMax SHARED IfcMax.h IfcMax.cpp) -TARGET_LINK_LIBRARIES(IfcMax IfcParse IfcGeom Comctl32.lib zlibdll.lib bmm.lib core.lib CustDlg.lib edmodel.lib expr.lib +TARGET_LINK_LIBRARIES(IfcMax ${IFCLIBS} Comctl32.lib zlibdll.lib bmm.lib core.lib CustDlg.lib edmodel.lib expr.lib flt.lib geom.lib gfx.lib gup.lib imageViewers.lib ManipSys.lib maxnet.lib Maxscrpt.lib maxutil.lib MenuMan.lib menus.lib mesh.lib MNMath.lib Paramblk2.lib particle.lib Poly.lib RenderUtil.lib tessint.lib viewfile.lib ${OPENCASCADE_LIBRARIES} @@ -36,4 +36,4 @@ TARGET_LINK_LIBRARIES(IfcMax IfcParse IfcGeom Comctl32.lib zlibdll.lib bmm.lib c SET_TARGET_PROPERTIES(IfcMax PROPERTIES SUFFIX ".dli") -INSTALL(TARGETS IfcMax RUNTIME DESTINATION bin) +INSTALL(TARGETS IfcMax RUNTIME DESTINATION ${BINDIR}) diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index 9b23760c75..bffdfcb10a 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -320,7 +320,6 @@ Token IfcSpfLexer::Next() { int len = 0; - char p = 0; while ( ! stream->eof ) { // Read character and increment pointer if not starting a new token @@ -331,8 +330,6 @@ Token IfcSpfLexer::Next() { // If a string is encountered defer processing to the IfcCharacterDecoder if ( c == '\'' ) decoder->dryRun(); - - p = c; } if ( len ) return TokenPtr(this,pos); else return TokenPtr(); @@ -348,7 +345,6 @@ std::string IfcSpfLexer::TokenString(unsigned int offset) { stream->Seek(offset); std::string buffer; buffer.reserve(128); - char p = 0; while ( ! stream->eof ) { char c = stream->Peek(); if ( buffer.size() && (c == '(' || c == ')' || c == '=' || c == ',' || c == ';' || c == '/') ) break; @@ -356,7 +352,6 @@ std::string IfcSpfLexer::TokenString(unsigned int offset) { if ( c == ' ' || c == '\r' || c == '\n' || c == '\t' ) continue; else if ( c == '\'' ) return *decoder; else buffer.push_back(c); - p = c; } if ( was_eof ) stream->eof = true; else stream->Seek(old_offset); @@ -790,7 +785,7 @@ EntityArgument::~EntityArgument() { delete entity; } // // Reads an Entity from the list of Tokens // -Entity::Entity(unsigned int i, IfcFile* f) : _id(i), args(0) { +Entity::Entity(unsigned int i, IfcFile* f) : args(0), _id(i) { file = f; Token datatype = f->tokens->Next(); if ( ! TokenFunc::isKeyword(datatype)) throw IfcException("Unexpected token while parsing entity"); @@ -904,10 +899,10 @@ IfcWrite::IfcWritableEntity* Entity::isWritable() { IfcFile::IfcFile(bool create_latebound_entities) : _create_latebound_entities(create_latebound_entities) - , stream(0) , lastId(0) - , tokens(0) , MaxId(0) + , tokens(0) + , stream(0) { setDefaultHeaderValues(); } @@ -1542,4 +1537,4 @@ std::pair IfcFile::getUnit(IfcSchema::IfcUnitE } } return return_value; -} \ No newline at end of file +} diff --git a/src/ifcparse/IfcSpfHeader.h b/src/ifcparse/IfcSpfHeader.h index 44eb719932..0c0e7f9142 100644 --- a/src/ifcparse/IfcSpfHeader.h +++ b/src/ifcparse/IfcSpfHeader.h @@ -34,7 +34,7 @@ private: HeaderEntity& operator =(const HeaderEntity&); //N/A protected: HeaderEntity(const char * const datatype, IfcSpfLexer* lexer) - : _datatype(datatype), _list(0) + : _list(0), _datatype(datatype) { std::vector ids; _list = new ArgumentList(); @@ -193,4 +193,4 @@ public: } -#endif \ No newline at end of file +#endif diff --git a/src/ifcwrap/CMakeLists.txt b/src/ifcwrap/CMakeLists.txt index eb6af21f3a..704e7b2b2e 100644 --- a/src/ifcwrap/CMakeLists.txt +++ b/src/ifcwrap/CMakeLists.txt @@ -52,14 +52,15 @@ ENDIF() SET_SOURCE_FILES_PROPERTIES(IfcPython.i PROPERTIES CPLUSPLUS ON) SWIG_ADD_MODULE(ifcopenshell_wrapper python IfcPython.i) -SWIG_LINK_LIBRARIES(ifcopenshell_wrapper IfcParse IfcGeom ${PYTHON_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${ICU_LIBRARIES}) +SWIG_LINK_LIBRARIES(ifcopenshell_wrapper ${IFCLIBS} ${PYTHON_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${ICU_LIBRARIES}) +SET_INSTALL_RPATHS(${SWIG_MODULE_ifcopenshell_wrapper_REAL_NAME} "${IFCDIRS};${OCC_LIBRARY_DIR};${ICU_LIBRARY_DIR}") # Try to find the Python interpreter to get the site-packages # directory in which the wrapper can be installed. FIND_PACKAGE(PythonInterp) IF(PYTHONINTERP_FOUND) EXECUTE_PROCESS( - COMMAND ${PYTHON_EXECUTABLE} -c "import sys; from distutils.sysconfig import get_python_lib; sys.stdout.write(get_python_lib())" + COMMAND ${PYTHON_EXECUTABLE} -c "import sys; from distutils.sysconfig import get_python_lib; sys.stdout.write(get_python_lib(1))" OUTPUT_VARIABLE python_package_dir ) diff --git a/src/ifcwrap/IfcGeomWrapper.i b/src/ifcwrap/IfcGeomWrapper.i index f1869efe4a..07222a743a 100644 --- a/src/ifcwrap/IfcGeomWrapper.i +++ b/src/ifcwrap/IfcGeomWrapper.i @@ -387,6 +387,7 @@ struct ShapeRTTI : public boost::static_visitor throw IfcParse::IfcException("Invalid additional representation specified"); } } + return boost::variant*, IfcGeom::Representation::Representation*>(); } %} diff --git a/src/qtviewer/CMakeLists.txt b/src/qtviewer/CMakeLists.txt index 81f97eba20..a1649011aa 100644 --- a/src/qtviewer/CMakeLists.txt +++ b/src/qtviewer/CMakeLists.txt @@ -52,4 +52,4 @@ QT_WRAP_CPP(QTviewer QTviewer_SRCS ${QTviewer_MOC_SRCS}) ADD_EXECUTABLE( QTviewer ${QTviewer_SRCS} ${QTviewer_MOC_SRCS}) #http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake -TARGET_LINK_libRARIES (QTviewer IfcParse IfcGeom ${QT_LIBRARIES} ${OPENCASCADE_LIBRARIES}) +TARGET_LINK_LIBRARIES (QTviewer ${IFCLIBS} ${QT_LIBRARIES} ${OPENCASCADE_LIBRARIES})