diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..96fb1b5394 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# Dependency and build folders created by the build scripts +/deps*/ +/build*/ +/install*/ +/win/BuildDepsCache*.txt diff --git a/README.md b/README.md index b64227f291..75783392dc 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,16 @@ IfcOpenShell ============ -open source (LGPL) software library for working with the IFC file format +Open source (LGPL) software library for working with the IFC file format. [http://ifcopenshell.org](http://ifcopenshell.org) [http://academy.ifcopenshell.org](http://academy.ifcopenshell.org) +Prerequisites +============= +* Git, CMake (2.6 or newer), Visual Studio 2008 or newer (Windows), or GCC (*nix, Clang untested). + + Dependencies ============ * [Boost](http://www.boost.org/) @@ -18,32 +23,33 @@ Dependencies For IfcConvert to be able to write tessellated Collada (.dae) files * [SWIG](http://www.swig.org/), [Python](https://www.python.org/) libraries *optional* For building the IfcOpenShell Python interface and the Blender add-on -* 3ds max SDK *optional* - For building the 3ds max plug-in +* 3ds Max SDK *optional* + For building the 3ds Max plug-in Compiling on Windows ==================== -Users are advised to use the Visual Studio .sln file in the win/ folder. -For Windows users a prebuilt Open CASCADE version is available from the -http://opencascade.org website. Download and install this version and -provide the paths to the Open CASCADE header and library files to MS -Visual Studio C++. +Users are advised to build IfcOpenShell using the CMake file provided in +the cmake/ folder. -For building the Autodesk 3ds Max plugin, the 3ds Max SDK needs to be -installed as well as 3ds Max itself. Please provide the include and -library paths to Visual Studio. +The preferred way to fetch and build this project's dependencies is to use the build scripts +in win/ folder. See [win/readme.md] for more information. Instructions in a nutshell +(assuming Visual Studio x64 environment variables set): + > git clone https://github.com/IfcOpenShell/IfcOpenShell.git + > cd oce\win + > build-deps.cmd (defaults to using VS 2015 x64 RelWithDebInfo build) + > run-cmake.bat (defaults to using VS 2015 x64) + > ..\build-vs2015-x64\IfcOpenShell.sln +You can now build the solution using the RelWithDebInfo configuration (freshly created solution by CMake defaults to Debug). +Build the INSTALL project to deploy the headers and binaries into a single location if wanted/needed. -For building the IfcPython wrapper, SWIG needs to be installed. Please -download the latest swigwin version from http://www.swig.org/download.html. -After extracting the .zip file, please add the extracted folder to the PATH -environment variable. Python needs to be installed, please provide the -include and library paths to Visual Studio. +Alternatively, the old Visual Studio solution and project files requiring manual work can +be found from the win/sln folder. Compiling on *nix ================= -Users are advised to build IfcOpenShell using the cmake file provided in +Users are advised to build IfcOpenShell using the CMake file provided in the cmake/ folder. There might be an Open CASCADE package in your operating system's software repository. If not, you will need to compile Open CASCADE yourself. See http://opencascade.org. @@ -146,3 +152,5 @@ Or: >>> >>> # Writing IFC-SPF files to disk: >>> f.write("out.ifc") + +[win/readme.md]: https://github.com/IfcOpenShell/IfcOpenShell/tree/master/win/readme.md "win/readme.md" \ No newline at end of file diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 7431c8d566..568fcc71ed 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1,12 +1,64 @@ +################################################################################ +# # +# 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) -FIND_PACKAGE(Boost REQUIRED COMPONENTS program_options) +OPTION(UNICODE_SUPPORT "Build IfcOpenShell with Unicode support (requires ICU)." ON) +OPTION(COLLADA_SUPPORT "Build IfcConvert with COLLADA support (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) +# 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) + +# Find Boost +IF(MSVC) + SET(Boost_USE_STATIC_LIBS ON) + SET(Boost_USE_STATIC_RUNTIME ON) + SET(Boost_USE_MULTITHREADED 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 header files -IF("$ENV{OCC_INCLUDE_DIR}" STREQUAL "") +# Usage: +# SET(SOME_LIRARIES foo bar) +# ADD_DEBUG_VARIANTS(SOME_LIRARIES "${SOME_LIRARIES}" "d") +# "foo bar" -> "optimized foo debug food optimized bar debug bard" +FUNCTION(ADD_DEBUG_VARIANTS NAME LIBRARIES POSTFIX) + SET(LIBRARIES_STR "${LIBRARIES}") + SET(LIBRARIES "") + FOREACH(lib ${LIBRARIES_STR}) + SET(LIBRARIES "${LIBRARIES} optimized ${lib}") + SET(LIBRARIES "${LIBRARIES} debug ${lib}${POSTFIX}") + ENDFOREACH() + STRING(STRIP ${LIBRARIES} LIBRARIES) # leading and trailing whitespace cause confusion + SEPARATE_ARGUMENTS(LIBRARIES) # "optimized debug " needs to be a list instead of a string + SET(${NAME} ${LIBRARIES} PARENT_SCOPE) +ENDFUNCTION() + +# 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") @@ -22,8 +74,16 @@ ELSE() MESSAGE(FATAL_ERROR "Unable to find header files, aborting") ENDIF() -# Find Open CASCADE library files -IF("$ENV{OCC_LIBRARY_DIR}" STREQUAL "") +SET(OPENCASCADE_LIBRARIES + TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO + TKFillet TKSTEP TKSTEPBase TKSTEPAttr TKXSBase TKSTEP209 TKIGES TKOffset +) + +IF(MSVC) + ADD_DEBUG_VARIANTS(OPENCASCADE_LIBRARIES "${OPENCASCADE_LIBRARIES}" "d") +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") @@ -32,210 +92,224 @@ ELSE() 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) +FIND_LIBRARY(libTKernel NAMES TKernel TKerneld PATHS ${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("$ENV{ICU_INCLUDE_DIR}" STREQUAL "") - MESSAGE(STATUS "No ICU include directory specified") -ElSE() - SET(ICU_INCLUDE_DIR CACHE FILEPATH "ICU header files") +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 NAMES icuuc icuucd PATHS /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${ICU_LIBRARY_DIR}) + + IF(icu) + ADD_DEFINITIONS(-DHAVE_ICU) + MESSAGE(STATUS "ICU libraries found") + # NOTE icudata appears to be icudt on Windows/MSVC on icudata on others + IF(MSVC) + SET(ICU_LIBRARIES icuuc icudt) + ADD_DEBUG_VARIANTS(ICU_LIBRARIES "${ICU_LIBRARIES}" "d") + ADD_DEFINITIONS(-DU_STATIC_IMPLEMENTATION) # required for static ICU + ELSE() + SET(ICU_LIBRARIES icuuc icudata) + ENDIF() + ELSE() + MESSAGE(FATAL_ERROR "UNICODE_SUPPORT enabled, but unable to find ICU. Disable UNICODE_SUPPORT or fix ICU paths to proceed.") + ENDIF() ENDIF() -IF("$ENV{ICU_LIBRARY_DIR}" STREQUAL "") - MESSAGE(STATUS "No ICU library directory specified") -ElSE() - SET(ICU_LIBRARY_DIR CACHE FILEPATH "ICU library files") +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 + ) + IF(MSVC) + ADD_DEBUG_VARIANTS(OPENCOLLADA_LIBRARIES "${OPENCOLLADA_LIBRARIES}" "d") + ENDIF() + ELSE() + MESSAGE(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA. Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed.") + ENDIF() ENDIF() -FIND_LIBRARY(icu "icuuc" /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${ICU_LIBRARY_DIR}) + # TODO Are these needed on other platforms still or can these be removed for good? +IF (NOT WIN32) + INCLUDE(CheckIncludeFileCXX) -IF(icu) - MESSAGE(STATUS "ICU libraries found") - ADD_DEFINITIONS(-DHAVE_ICU) - SET(ICU_LIBRARIES icuuc icudata) -ELSE() - MESSAGE(STATUS "Unable to find ICU library files, continuing") + 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(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("$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() - -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) - IF(NOT CMAKE_BUILD_TYPE) - SET(CMAKE_BUILD_TYPE "Release") -ENDIF(NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE "Release") +ENDIF() + +# 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. +# TODO Setting of /GL and /LTCG don't seem to apply for static libraries (IfcGeom, IfcParse) +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) - ADD_DEFINITIONS(-D_UNICODE) -ElSE(MSVC) - ADD_DEFINITIONS(-fPIC -Wno-non-virtual-dtor) -ENDIF(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 -INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS} /usr/inc /usr/local/inc /usr/local/include/oce ${ICU_INCLUDE_DIR} ${Boost_INCLUDE_DIRS}) - -ADD_LIBRARY(IfcParse STATIC - ../src/ifcparse/Ifc2x3-latebound.cpp - ../src/ifcparse/Ifc2x3.cpp - ../src/ifcparse/Ifc4-latebound.cpp - ../src/ifcparse/Ifc4.cpp - ../src/ifcparse/IfcCharacterDecoder.cpp - ../src/ifcparse/IfcGlobalId.cpp - ../src/ifcparse/IfcHierarchyHelper.cpp - ../src/ifcparse/IfcLateBoundEntity.cpp - ../src/ifcparse/IfcParse.cpp - ../src/ifcparse/IfcSIPrefix.cpp - ../src/ifcparse/IfcSpfHeader.cpp - ../src/ifcparse/IfcUtil.cpp - ../src/ifcparse/IfcWrite.cpp -) - -ADD_LIBRARY(IfcGeom STATIC - ../src/ifcgeom/IfcGeomCurves.cpp - ../src/ifcgeom/IfcGeomFaces.cpp - ../src/ifcgeom/IfcGeomFunctions.cpp - ../src/ifcgeom/IfcGeomHelpers.cpp - ../src/ifcgeom/IfcGeomMaterial.cpp - ../src/ifcgeom/IfcGeomRenderStyles.cpp - ../src/ifcgeom/IfcGeomRepresentation.cpp - ../src/ifcgeom/IfcGeomShapes.cpp - ../src/ifcgeom/IfcGeomWires.cpp - ../src/ifcgeom/IfcRegister.cpp -) - -IF(icu) - TARGET_LINK_LIBRARIES(IfcParse icuuc) + # 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(${INCLUDE_DIRECTORIES} /usr/inc /usr/local/inc /usr/local/include/oce) +endif() + +IF(USE_IFC4) + ADD_DEFINITIONS(-DUSE_IFC4) +ELSE() + ADD_DEFINITIONS(-DUSE_IFC2x3) # TODO Make all caps? i.e. USE_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(UNICODE_SUPPORT) + TARGET_LINK_LIBRARIES(IfcParse ${ICU_LIBRARIES}) +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} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${ICU_LIBRARY_DIR} ${Boost_LIBRARY_DIRS}) - -ADD_EXECUTABLE(IfcConvert - ../src/ifcconvert/ColladaSerializer.cpp - ../src/ifcconvert/IfcConvert.cpp - ../src/ifcconvert/OpenCascadeBasedSerializer.cpp - ../src/ifcconvert/WavefrontObjSerializer.cpp - ../src/ifcconvert/XmlSerializer.cpp - ../src/ifcconvert/SvgSerializer.cpp - ../src/ifcconvert/util.cpp +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() -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} ${ICU_LIBRARIES}) +# 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}) -ADD_EXECUTABLE(IfcGeomServer - ../src/ifcgeomserver/IfcGeomServer.cpp -) +TARGET_LINK_LIBRARIES(IfcConvert IfcParse IfcGeom ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${OPENCOLLADA_LIBRARIES} ${ICU_LIBRARIES}) -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 ${ICU_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}) -# Build python wrapper using separate CMakeLists.txt -ADD_SUBDIRECTORY(../src/ifcwrap ifcwrap) +TARGET_LINK_LIBRARIES(IfcGeomServer IfcParse IfcGeom ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${ICU_LIBRARIES}) -# Build IfcParseExamples using separate CMakeLists.txt -ADD_SUBDIRECTORY(../src/examples examples) +IF(BUILD_IFCPYTHON) + ADD_SUBDIRECTORY(../src/ifcwrap ifcwrap) +ENDIF() -# ADD_SUBDIRECTORY(../src/qtviewer qtviewer) +IF(BUILD_EXAMPLES) + ADD_SUBDIRECTORY(../src/examples examples) +ENDIF() + +# TODO QtViewer is deprecated ATM as it uses the 0.4 API +# IF(BUILD_QTVIEWER) + # ADD_SUBDIRECTORY(../src/qtviewer qtviewer) +# ENDIF() # CMake installation targets -SET(include_files_geom - ../src/ifcgeom/IfcGeom.h - ../src/ifcgeom/IfcGeomElement.h - ../src/ifcgeom/IfcGeomIterator.h - ../src/ifcgeom/IfcGeomIteratorSettings.h - ../src/ifcgeom/IfcGeomMaterial.h - ../src/ifcgeom/IfcGeomRenderStyles.h - ../src/ifcgeom/IfcGeomRepresentation.h - ../src/ifcgeom/IfcGeomShapeType.h - ../src/ifcgeom/IfcRegister.h - ../src/ifcgeom/IfcRegisterConvertCurve.h - ../src/ifcgeom/IfcRegisterConvertFace.h - ../src/ifcgeom/IfcRegisterConvertShape.h - ../src/ifcgeom/IfcRegisterConvertShapes.h - ../src/ifcgeom/IfcRegisterConvertWire.h - ../src/ifcgeom/IfcRegisterCreateCache.h - ../src/ifcgeom/IfcRegisterDef.h - ../src/ifcgeom/IfcRegisterGeomHeader.h - ../src/ifcgeom/IfcRegisterPurgeCache.h - ../src/ifcgeom/IfcRegisterShapeType.h - ../src/ifcgeom/IfcRegisterUndef.h - ../src/ifcgeom/IfcRepresentationShapeItem.h -) - -SET(include_files_parse - ../src/ifcparse/Ifc2x3-latebound.h - ../src/ifcparse/Ifc2x3.h - ../src/ifcparse/Ifc2x3enum.h - ../src/ifcparse/Ifc4-latebound.h - ../src/ifcparse/Ifc4.h - ../src/ifcparse/Ifc4enum.h - ../src/ifcparse/IfcCharacterDecoder.h - ../src/ifcparse/IfcEntityDescriptor.h - ../src/ifcparse/IfcException.h - ../src/ifcparse/IfcFile.h - ../src/ifcparse/IfcGlobalId.h - ../src/ifcparse/IfcHierarchyHelper.h - ../src/ifcparse/IfcLateBoundEntity.h - ../src/ifcparse/IfcParse.h - ../src/ifcparse/IfcSIPrefix.h - ../src/ifcparse/IfcSpfHeader.h - ../src/ifcparse/IfcSpfStream.h - ../src/ifcparse/IfcUtil.h - ../src/ifcparse/IfcWritableEntity.h - ../src/ifcparse/IfcWrite.h - ../src/ifcparse/SharedPointer.h -) +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 DESTINATION bin) +INSTALL(TARGETS IfcConvert IfcGeomServer DESTINATION bin) INSTALL(TARGETS IfcParse IfcGeom DESTINATION lib) diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index e572379ec1..0f0da6a525 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -1,5 +1,24 @@ +################################################################################ +# # +# 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 . # +# # +################################################################################ + ADD_EXECUTABLE(IfcParseExamples IfcParseExamples.cpp) -TARGET_LINK_LIBRARIES (IfcParseExamples IfcParse) +TARGET_LINK_LIBRARIES(IfcParseExamples IfcParse) ADD_EXECUTABLE(IfcOpenHouse IfcOpenHouse.cpp) -TARGET_LINK_LIBRARIES (IfcOpenHouse IfcParse IfcGeom TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO TKFillet TKOffset) +TARGET_LINK_LIBRARIES(IfcOpenHouse IfcParse IfcGeom ${OPENCASCADE_LIBRARIES}) diff --git a/src/ifcconvert/ColladaSerializer.cpp b/src/ifcconvert/ColladaSerializer.cpp index 2f9b54fbf1..8315a8e433 100644 --- a/src/ifcconvert/ColladaSerializer.cpp +++ b/src/ifcconvert/ColladaSerializer.cpp @@ -39,8 +39,8 @@ void ColladaSerializer::ColladaExporter::ColladaGeometries::addFloatSource(const COLLADASW::FloatSource source(mSW); source.setId(mesh_id + suffix); source.setArrayId(mesh_id + suffix + COLLADASW::LibraryGeometries::ARRAY_ID_SUFFIX); - source.setAccessorStride(strlen(coords)); - source.setAccessorCount(floats.size() / 3); + source.setAccessorStride((unsigned long)strlen(coords)); + source.setAccessorCount((unsigned long)floats.size() / 3); for (unsigned int i = 0; i < source.getAccessorStride(); ++i) { source.getParameterNameList().push_back(std::string(1, coords[i])); } @@ -73,7 +73,7 @@ void ColladaSerializer::ColladaExporter::ColladaGeometries::write(const std::str int previous_material_id = -1; for (std::vector::const_iterator it = faces.begin(); !faces.empty(); it += 3) { const int current_material_id = *(material_it++); - const int num_triangles = std::distance(index_range_start, it) / 3; + const unsigned long num_triangles = (unsigned long)std::distance(index_range_start, it) / 3; if ((previous_material_id != current_material_id && num_triangles > 0) || (it == faces.end())) { COLLADASW::Triangles triangles(mSW); triangles.setMaterial(materials[previous_material_id].name()); @@ -126,7 +126,7 @@ void ColladaSerializer::ColladaExporter::ColladaGeometries::write(const std::str for (linelist_t::const_iterator it = linelist.begin(); it != linelist.end(); ++it) { COLLADASW::Lines lines(mSW); lines.setMaterial(materials[it->first].name()); - lines.setCount(it->second.size()); + lines.setCount((unsigned long)it->second.size()); int offset = 0; lines.getInputList().push_back(COLLADASW::Input(COLLADASW::InputSemantic::VERTEX, "#" + mesh_id + COLLADASW::LibraryGeometries::VERTICES_ID_SUFFIX, 0)); lines.prepareToAppendValues(); diff --git a/src/ifcconvert/SvgSerializer.cpp b/src/ifcconvert/SvgSerializer.cpp index 8319393ff8..382873ee69 100644 --- a/src/ifcconvert/SvgSerializer.cpp +++ b/src/ifcconvert/SvgSerializer.cpp @@ -43,7 +43,7 @@ #include #include #include - +#include #include "../ifcparse/IfcGlobalId.h" #include "SvgSerializer.h" diff --git a/src/ifcconvert/WavefrontObjSerializer.cpp b/src/ifcconvert/WavefrontObjSerializer.cpp index 19643be430..a71b47b7ee 100644 --- a/src/ifcconvert/WavefrontObjSerializer.cpp +++ b/src/ifcconvert/WavefrontObjSerializer.cpp @@ -72,7 +72,7 @@ void WaveFrontOBJSerializer::write(const IfcGeom::TriangulationElement* const IfcGeom::Representation::Triangulation& mesh = o->geometry(); - const int vcount = mesh.verts().size() / 3; + const int vcount = (int)mesh.verts().size() / 3; for ( std::vector::const_iterator it = mesh.verts().begin(); it != mesh.verts().end(); ) { const double x = *(it++); const double y = *(it++); diff --git a/src/ifcgeom/IfcGeomCurves.cpp b/src/ifcgeom/IfcGeomCurves.cpp index 3d42984299..117df42f53 100644 --- a/src/ifcgeom/IfcGeomCurves.cpp +++ b/src/ifcgeom/IfcGeomCurves.cpp @@ -149,8 +149,8 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcBSplineCurveWithKnots* l, Hand const std::vector knots = l->Knots(); TColgp_Array1OfPnt Poles(0, cps->size() - 1); - TColStd_Array1OfReal Knots(0, knots.size() - 1); - TColStd_Array1OfInteger Mults(0, mults.size() - 1); + TColStd_Array1OfReal Knots(0, (int)knots.size() - 1); + TColStd_Array1OfInteger Mults(0, (int)mults.size() - 1); Standard_Integer Degree = l->Degree(); Standard_Boolean Periodic = l->ClosedCurve(); diff --git a/src/ifcgeom/IfcGeomFaces.cpp b/src/ifcgeom/IfcGeomFaces.cpp index fe0b36681f..da3f95c105 100644 --- a/src/ifcgeom/IfcGeomFaces.cpp +++ b/src/ifcgeom/IfcGeomFaces.cpp @@ -899,11 +899,11 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcBSplineSurfaceWithKnots* l, To std::vector umults = l->UMultiplicities(); std::vector vmults = l->VMultiplicities(); - TColgp_Array2OfPnt Poles (0, cps->size() - 1, 0, (*cps->begin()).size() - 1); - TColStd_Array1OfReal UKnots(0, uknots.size() - 1); - TColStd_Array1OfReal VKnots(0, vknots.size() - 1); - TColStd_Array1OfInteger UMults(0, umults.size() - 1); - TColStd_Array1OfInteger VMults(0, vmults.size() - 1); + TColgp_Array2OfPnt Poles (0, (int)cps->size() - 1, 0, (int)(*cps->begin()).size() - 1); + TColStd_Array1OfReal UKnots(0, (int)uknots.size() - 1); + TColStd_Array1OfReal VKnots(0, (int)vknots.size() - 1); + TColStd_Array1OfInteger UMults(0, (int)umults.size() - 1); + TColStd_Array1OfInteger VMults(0, (int)vmults.size() - 1); Standard_Integer UDegree = l->UDegree(); Standard_Integer VDegree = l->VDegree(); diff --git a/src/ifcgeom/IfcGeomRepresentation.h b/src/ifcgeom/IfcGeomRepresentation.h index bd7abee278..f94f8ab211 100644 --- a/src/ifcgeom/IfcGeomRepresentation.h +++ b/src/ifcgeom/IfcGeomRepresentation.h @@ -123,10 +123,10 @@ namespace IfcGeom { Material adapter(&it->Style()); std::vector::const_iterator jt = std::find(_materials.begin(), _materials.end(), adapter); if (jt == _materials.end()) { - surface_style_id = _materials.size(); + surface_style_id = (int)_materials.size(); _materials.push_back(adapter); } else { - surface_style_id = jt - _materials.begin(); + surface_style_id = (int)(jt - _materials.begin()); } } @@ -134,10 +134,10 @@ namespace IfcGeom { Material material(IfcGeom::get_default_style(settings().element_type())); std::vector::const_iterator it = std::find(_materials.begin(), _materials.end(), material); if (it == _materials.end()) { - surface_style_id = _materials.size(); + surface_style_id = (int)_materials.size(); _materials.push_back(material); } else { - surface_style_id = it - _materials.begin(); + surface_style_id = (int)(it - _materials.begin()); } } @@ -251,7 +251,7 @@ namespace IfcGeom { BRepAdaptor_Curve crv(TopoDS::Edge(exp.Current())); GCPnts_QuasiUniformDeflection tessellater(crv, settings().deflection_tolerance()); int n = tessellater.NbPoints(); - int start = _verts.size() / 3; + int start = (int)_verts.size() / 3; for (int i = 1; i <= n; ++i) { gp_XYZ p = tessellater.Value(i).XYZ(); trsf.Transforms(p); diff --git a/src/ifcgeom/IfcGeomShapes.cpp b/src/ifcgeom/IfcGeomShapes.cpp index 896863805d..861de7de6c 100644 --- a/src/ifcgeom/IfcGeomShapes.cpp +++ b/src/ifcgeom/IfcGeomShapes.cpp @@ -399,7 +399,7 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcBooleanResult* l, TopoDS_Shape bool IfcGeom::Kernel::convert(const IfcSchema::IfcConnectedFaceSet* l, TopoDS_Shape& shape) { IfcSchema::IfcFace::list::ptr faces = l->CfsFaces(); bool facesAdded = false; - const unsigned int num_faces = faces->size(); + const unsigned int num_faces = (unsigned)faces->size(); bool valid_shell = false; if ( num_faces < getValue(GV_MAX_FACES_TO_SEW) ) { BRepOffsetAPI_Sewing builder; @@ -882,7 +882,7 @@ bool IfcGeom::Kernel::convert(const IfcSchema::IfcTriangulatedFaceSet* l, TopoDS if (faces.empty()) return false; - const unsigned int num_faces = indices.size(); + const unsigned int num_faces = (unsigned)indices.size(); bool valid_shell = false; if (faces.size() < getValue(GV_MAX_FACES_TO_SEW)) { diff --git a/src/ifcgeomserver/IfcGeomServer.cpp b/src/ifcgeomserver/IfcGeomServer.cpp index 22eaca9844..9398bde3b7 100644 --- a/src/ifcgeomserver/IfcGeomServer.cpp +++ b/src/ifcgeomserver/IfcGeomServer.cpp @@ -69,7 +69,7 @@ void swrite(std::ostream& s, T t) { template <> void swrite(std::ostream& s, std::string t) { - int32_t len = t.size(); + int32_t len = (int32_t)t.size(); swrite(s, len); s.write(t.c_str(), len); while (len++ % 4) s.put(0); @@ -323,7 +323,7 @@ int main (int argc, char** argv) { settings.convert_back_units() = true; settings.include_curves() = true; - iterator = new IfcGeom::Iterator(settings, data, len); + iterator = new IfcGeom::Iterator(settings, data, (int)len); has_more = iterator->initialize(); More(has_more).write(std::cout); diff --git a/src/ifcparse/IfcCharacterDecoder.cpp b/src/ifcparse/IfcCharacterDecoder.cpp index a3aad64c1e..3b1b2a654e 100644 --- a/src/ifcparse/IfcCharacterDecoder.cpp +++ b/src/ifcparse/IfcCharacterDecoder.cpp @@ -135,7 +135,7 @@ IfcCharacterDecoder::operator std::string() { #ifdef HAVE_ICU if ( previous_codepage != codepage ) { if ( converter ) ucnv_close(converter); - char encoder[11] = {'i','s','o','-','8','8','5','9','-',codepage + 0x30}; + char encoder[11] = {'i','s','o','-','8','8','5','9','-', (char)codepage + 0x30}; converter = ucnv_open(encoder, &status); } const char characters[2] = { current_char + 0x80 }; @@ -188,7 +188,7 @@ IfcCharacterDecoder::operator std::string() { if (old_hex == 0) { old_hex = hex; } else { - char characters[3] = { old_hex, hex }; + char characters[3] = { (char)old_hex, (char)hex }; const char* char_array = &characters[0]; UChar32 ch = ucnv_getNextUChar(compatibility_converter,&char_array,char_array+2,&status); addChar(s,ch); diff --git a/src/ifcparse/IfcEntityDescriptor.h b/src/ifcparse/IfcEntityDescriptor.h index 588a90337e..f65fb6d54e 100644 --- a/src/ifcparse/IfcEntityDescriptor.h +++ b/src/ifcparse/IfcEntityDescriptor.h @@ -48,7 +48,7 @@ namespace IfcUtil { std::pair getIndex(const std::string& value) const { std::vector::const_iterator it = std::find(values.begin(), values.end(), value); if (it != values.end()) { - return std::make_pair(it->c_str(), std::distance(it, values.begin())); + return std::make_pair(it->c_str(), (int)std::distance(it, values.begin())); } else { throw IfcParse::IfcException("Invalid enumeration value"); } @@ -91,7 +91,7 @@ namespace IfcUtil { arguments.push_back(IfcArgumentDescriptor(name, optional, argument_type, data_type)); } unsigned getArgumentCount() const { - return (parent ? parent->getArgumentCount() : 0) + arguments.size(); + return (parent ? parent->getArgumentCount() : 0) + (unsigned)arguments.size(); } const std::string& getArgumentName(unsigned i) const { const unsigned a = argument_start(); diff --git a/src/ifcparse/IfcGlobalId.cpp b/src/ifcparse/IfcGlobalId.cpp index 85cdc1ad1c..d1692b6bbd 100644 --- a/src/ifcparse/IfcGlobalId.cpp +++ b/src/ifcparse/IfcGlobalId.cpp @@ -52,7 +52,7 @@ unsigned from_base64(const std::string& s) { r *= 64; const char* c = strchr(chars,*i); if ( !c ) throw IfcParse::IfcException("Failed to decode GlobalId"); - r += (c-chars); + r += (unsigned)(c-chars); } return r; } diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index ac3e0cc99c..9b5f33a26b 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -467,7 +467,7 @@ boost::dynamic_bitset<> TokenFunc::asBinary(const Token& t) { } ++it; - unsigned i = (str.size()-1) * 4 - n; + unsigned i = ((unsigned)str.size()-1) * 4 - n; boost::dynamic_bitset<> bitset(i); for(; it != str.end(); ++it) { diff --git a/src/ifcparse/IfcUtil.h b/src/ifcparse/IfcUtil.h index e57f5da279..cbf18333e0 100644 --- a/src/ifcparse/IfcUtil.h +++ b/src/ifcparse/IfcUtil.h @@ -187,11 +187,11 @@ public: } outer_it begin() const { return ls.begin(); } outer_it end() const { return ls.end(); } - int size() const { return ls.size(); } + int size() const { return (int)ls.size(); } int totalSize() const { int accum = 0; for (outer_it it = begin(); it != end(); ++it) { - accum += it->size(); + accum += (int)it->size(); } return accum; } @@ -230,7 +230,7 @@ public: void push(const std::vector& t) {ls.push_back(t);} outer_it begin() { return ls.begin(); } outer_it end() { return ls.end(); } - int size() const { return ls.size(); } + int size() const { return (int)ls.size(); } int totalSize() const { int accum = 0; for (outer_it it = begin(); it != end(); ++it) { diff --git a/src/ifcparse/IfcWrite.cpp b/src/ifcparse/IfcWrite.cpp index 86486ed992..99579f1d83 100644 --- a/src/ifcparse/IfcWrite.cpp +++ b/src/ifcparse/IfcWrite.cpp @@ -84,7 +84,7 @@ Argument* IfcWritableEntity::getArgument (unsigned int i) { } return args[i]; } -unsigned int IfcWritableEntity::getArgumentCount() const {return args.size(); } +unsigned int IfcWritableEntity::getArgumentCount() const { return (unsigned)args.size(); } IfcSchema::Type::Enum IfcWritableEntity::type() const { return _type; } bool IfcWritableEntity::is(IfcSchema::Type::Enum v) const { return _type == v; } std::string IfcWritableEntity::toString(bool upper) const { @@ -298,12 +298,12 @@ public: int operator()(const double& i) const { return -1; } int operator()(const std::string& i) const { return -1; } int operator()(const boost::dynamic_bitset<>& i) const { return -1; } - int operator()(const std::vector& i) const { return i.size(); } - int operator()(const std::vector& i) const { return i.size(); } - int operator()(const std::vector< std::vector >& i) const { return i.size(); } - int operator()(const std::vector< std::vector >& i) const { return i.size(); } - int operator()(const std::vector& i) const { return i.size(); } - int operator()(const std::vector< boost::dynamic_bitset<> >& i) const { return i.size(); } + int operator()(const std::vector& i) const { return (int)i.size(); } + int operator()(const std::vector& i) const { return (int)i.size(); } + int operator()(const std::vector< std::vector >& i) const { return (int)i.size(); } + int operator()(const std::vector< std::vector >& i) const { return (int)i.size(); } + int operator()(const std::vector& i) const { return (int)i.size(); } + int operator()(const std::vector< boost::dynamic_bitset<> >& i) const { return (int)i.size(); } int operator()(const IfcWriteArgument::EnumerationReference& i) const { return -1; } int operator()(const IfcUtil::IfcBaseClass* const& i) const { return -1; } int operator()(const IfcEntityList::ptr& i) const { return i->size(); } @@ -351,7 +351,7 @@ private: oss.imbue(std::locale::classic()); oss.put('"'); oss << std::hex << std::setw(1); - unsigned c = b.size(); + unsigned c = (unsigned)b.size(); unsigned n = (4 - (c % 4)) & 3; oss << n; for (unsigned i = 0; i < c + n;) { diff --git a/src/ifcwrap/CMakeLists.txt b/src/ifcwrap/CMakeLists.txt index a5a2f36e22..a431cb0c00 100644 --- a/src/ifcwrap/CMakeLists.txt +++ b/src/ifcwrap/CMakeLists.txt @@ -1,37 +1,74 @@ +################################################################################ +# # +# 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 . # +# # +################################################################################ + FIND_PACKAGE(SWIG) +IF(NOT SWIG_FOUND) + MESSAGE(FATAL_ERROR "BUILD_IFCPYTHON enabled, but unable to find SWIG. Disable BUILD_IFCPYTHON or fix SWIG paths to proceed.") +ENDIF() -IF(SWIG_FOUND) +INCLUDE(${SWIG_USE_FILE}) -INCLUDE(${SWIG_USE_FILE}) +IF(NOT "$ENV{PYTHON_INCLUDE_DIR}" STREQUAL "") + SET(PYTHON_INCLUDE_DIR $ENV{PYTHON_INCLUDE_DIR} CACHE FILEPATH "Python header files") + MESSAGE(STATUS "Looking for Python header files in: ${PYTHON_INCLUDE_DIR}") +ENDIF() +IF(NOT "$ENV{PYTHON_LIBRARY}" STREQUAL "") + SET(PYTHON_LIBRARY $ENV{PYTHON_LIBRARY} CACHE FILEPATH "Python library file") + MESSAGE(STATUS "Looking for Python library file in: ${PYTHON_LIBRARY}") +ENDIF() FIND_PACKAGE(PythonLibs) - -IF(PYTHONLIBS_FOUND) +IF(NOT PYTHONLIBS_FOUND) + MESSAGE(FATAL_ERROR "BUILD_IFCPYTHON enabled, but unable to find Python. Disable BUILD_IFCPYTHON or fix Python paths to proceed.") +ENDIF() INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(CMAKE_SWIG_FLAGS "") +# NOTE Workaround for most likely missing debug Python libraries on Windows (requires Python built from the source). +# Python 3.5 intaller and onwards will have an option to install the debug libraries too. +IF (WIN32 AND NOT PYTHON_DEBUG_LIBRARIES) + MESSAGE(STATUS "PYTHON_DEBUG_LIBRARIES not found, defining SWIG_PYTHON_INTERPRETER_NO_DEBUG workaround for IfcWrap.") + ADD_DEFINITIONS(-DSWIG_PYTHON_INTERPRETER_NO_DEBUG) +ENDIF() SET_SOURCE_FILES_PROPERTIES(IfcPython.i PROPERTIES CPLUSPLUS ON) SWIG_ADD_MODULE(ifcopenshell_wrapper python IfcPython.i) -SWIG_LINK_LIBRARIES(ifcopenshell_wrapper ${PYTHON_LIBRARIES} IfcParse IfcGeom TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO TKFillet TKOffset ${ICU_LIBRARIES}) +SWIG_LINK_LIBRARIES(ifcopenshell_wrapper IfcParse IfcGeom ${PYTHON_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${ICU_LIBRARIES}) # To install IfcPython let's get the site-packages dir from python -EXECUTE_PROCESS(COMMAND python -c "import sys; from distutils.sysconfig import get_python_lib; sys.stdout.write(get_python_lib())" +EXECUTE_PROCESS(COMMAND + python -c "import sys; from distutils.sysconfig import get_python_lib; sys.stdout.write(get_python_lib())" OUTPUT_VARIABLE python_package_dir) +IF("${python_package_dir}" STREQUAL "") + MESSAGE(FATAL_ERROR "Python executable not in PATH, aborting") +ENDIF() + INSTALL(FILES "${CMAKE_BINARY_DIR}/ifcwrap/ifcopenshell_wrapper.py" - "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/__init__.py" - "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/guid.py" + "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/__init__.py" + "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/guid.py" DESTINATION "${python_package_dir}/ifcopenshell") INSTALL(FILES - "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/geom/__init__.py" - DESTINATION "${python_package_dir}/ifcopenshell/geom") + "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/geom/__init__.py" + DESTINATION "${python_package_dir}/ifcopenshell/geom") INSTALL(TARGETS _ifcopenshell_wrapper DESTINATION "${python_package_dir}/ifcopenshell") - -ENDIF(PYTHONLIBS_FOUND) - -ENDIF(SWIG_FOUND) \ No newline at end of file diff --git a/src/ifcwrap/IfcPython.i b/src/ifcwrap/IfcPython.i index 4fb584a088..3aca18456c 100644 --- a/src/ifcwrap/IfcPython.i +++ b/src/ifcwrap/IfcPython.i @@ -17,6 +17,27 @@ * * ********************************************************************************/ +%begin %{ +#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) +/* https://github.com/swig/swig/issues/325 */ +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif +%} + %include "std_string.i" %include "exception.i" diff --git a/src/ifcwrap/utils/type_conversion.i b/src/ifcwrap/utils/type_conversion.i index 6c739033d7..9ea0644457 100644 --- a/src/ifcwrap/utils/type_conversion.i +++ b/src/ifcwrap/utils/type_conversion.i @@ -132,9 +132,9 @@ template PyObject* pythonize_vector(const std::vector& v) { - const unsigned size = v.size(); + const size_t size = v.size(); PyObject* pyobj = PyTuple_New(size); - for (unsigned int i = 0; i < size; ++i) { + for (size_t i = 0; i < size; ++i) { PyTuple_SetItem(pyobj, i, pythonize(v[i])); } return pyobj; @@ -142,9 +142,9 @@ template PyObject* pythonize_vector2(const std::vector< std::vector >& v) { - const unsigned size = v.size(); + const size_t size = v.size(); PyObject* pyobj = PyTuple_New(size); - for (unsigned int i = 0; i < size; ++i) { + for (size_t i = 0; i < size; ++i) { PyTuple_SetItem(pyobj, i, pythonize_vector(v[i])); } return pyobj; diff --git a/src/qtviewer/CMakeLists.txt b/src/qtviewer/CMakeLists.txt index f6442fcfa8..81f97eba20 100644 --- a/src/qtviewer/CMakeLists.txt +++ b/src/qtviewer/CMakeLists.txt @@ -1,9 +1,21 @@ - -OPTION( QT_USE_QTVIEWER "IfcOpenShell QT GUI Viewer, QT environment required" OFF ) - - -IF (QT_USE_QTVIEWER) - +################################################################################ +# # +# 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 . # +# # +################################################################################ # Find QT header files SET(QT_MIN_VERSION "4.5.0") @@ -40,7 +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} TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO TKFillet) - - -ENDIF (QT_USE_QTVIEWER) +TARGET_LINK_libRARIES (QTviewer IfcParse IfcGeom ${QT_LIBRARIES} ${OPENCASCADE_LIBRARIES}) diff --git a/win/build-deps.cmd b/win/build-deps.cmd new file mode 100644 index 0000000000..5d48eec686 --- /dev/null +++ b/win/build-deps.cmd @@ -0,0 +1,438 @@ +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: :: +:: 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 . :: +:: :: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:: This batch file expects CMake generator as %1 and build configuration type as %2. If not provided, +:: the GENERATOR_DEFAULT will be used for %1 and BUILD_CFG_DEFAULT for %2 (both set in vs-cfg.cmd) +:: Optionally a build type (Build/Rebuild/Clean) can be passed as %3. + +@echo off +echo. + +set PROJECT_NAME=IfcOpenShell +call utils\cecho.cmd 15 0 "This script fetches and builds all %PROJECT_NAME% dependencies" +echo. + +:: Enable the delayed environment variable expansion needed in vs-cfg.cmd. +setlocal EnableDelayedExpansion + +:: Make sure vcvarsall.bat is called and dev env set is up. +IF "%VSINSTALLDIR%"=="" ( + call utils\cecho.cmd 0 12 "Visual Studio environment variables not set - cannot proceed!" + GOTO :ErrorAndPrintUsage +) + +:: Set up variables depending on the used Visual Studio version +call vs-cfg.cmd %1 %2 +IF NOT %ERRORLEVEL%==0 GOTO :Error + +set BUILD_TYPE=%3 + +IF %GENERATOR%=="" ( + call cecho.cmd 0 12 "GENERATOR not specified - cannot proceed!" + GOTO :Error +) + +IF "%BUILD_TYPE%"=="" set BUILD_TYPE=Build + +IF NOT "!BUILD_TYPE!"=="Build" IF NOT "!BUILD_TYPE!"=="Rebuild" IF NOT "!BUILD_TYPE!"=="Clean" ( + call utils\cecho.cmd 0 12 "Invalid build type passed: !BUILD_TYPE!. Cannot proceed, aborting!" + GOTO :Error +) + +:: Make sure deps and install folders exists. +IF NOT EXIST %DEPS_DIR%. mkdir %DEPS_DIR% +IF NOT EXIST %INSTALL_DIR%. mkdir %INSTALL_DIR% + +:: If we use VS2008, framework path (for MSBuild) may not be correctly set. Manually attempt to add in that case +IF %VS_VER%==2008 set PATH=C:\Windows\Microsoft.NET\Framework\v3.5;%PATH% + +:: User-configurable build options +IF "%IFCOS_INSTALL_PYTHON%"=="" set IFCOS_INSTALL_PYTHON=TRUE +IF "%IFCOS_USE_PYTHON2%"=="" set IFCOS_USE_PYTHON2=FALSE +IF "%IFCOS_NUM_BUILD_PROCS%"=="" set IFCOS_NUM_BUILD_PROCS=%NUMBER_OF_PROCESSORS% + +:: For subroutines +set MSBUILD_CMD=MSBuild.exe /nologo /m:%IFCOS_NUM_BUILD_PROCS% /t:%BUILD_TYPE% +REM /clp:ErrorsOnly;WarningsOnly +:: Note BUILD_TYPE not passed, Clean e.g. wouldn't delete the installed files. +set INSTALL_CMD=MSBuild.exe /nologo /m:%IFCOS_NUM_BUILD_PROCS% +set BUILD_DIR=build-vs%VS_VER%-%TARGET_ARCH% + +echo. + +:: Check that required tools are in PATH +FOR %%i IN (powershell git cmake) DO ( + where.exe %%i 1> NUL 2> NUL || call cecho.cmd 0 12 "Required tool `'%%i`' not installed or not added to PATH" && goto :ErrorAndPrintUsage +) + +:: Print build configuration information + +call cecho.cmd 0 10 "Script configuration:" +call cecho.cmd 0 13 "* CMake Generator`t= '`"%GENERATOR%`'`t +echo - Passed to CMake -G option. +call cecho.cmd 0 13 "* Target Architecture`t= %TARGET_ARCH%" +echo - Whether were doing 32-bit (x86) or 64-bit (x64) build. +call cecho.cmd 0 13 "* Dependency Directory`t= %DEPS_DIR%" +echo - The directory where %PROJECT_NAME% dependencies are fetched and built. +call cecho.cmd 0 13 "* Installation Directory = %INSTALL_DIR%" +echo - The directory where %PROJECT_NAME% dependencies are installed. +call cecho.cmd 0 13 "* Build Config Type`t= %BUILD_CFG%" +echo - The used build configuration type for the dependencies. +echo Defaults to RelWithDebInfo if not specified. +IF %BUILD_CFG%==MinSizeRel call cecho.cmd 0 14 " WARNING: MinSizeRel build can suffer from a significant performance loss." +call cecho.cmd 0 13 "* Build Type`t`t= %BUILD_TYPE%" +echo - The used build type for the dependencies (Build, Rebuild, Clean). +echo Defaults to Build if not specified. Rebuild/Clean also uninstalls Python (if it was installed by this script). +call cecho.cmd 0 13 "* IFCOS_INSTALL_PYTHON`t= %IFCOS_INSTALL_PYTHON%" +echo - Download and install Python. +echo Set to something other than TRUE if you wish to use an already installed version of Python. +call cecho.cmd 0 13 "* IFCOS_USE_PYTHON2`t= %IFCOS_USE_PYTHON2%" +echo - Use Python 2 instead of 3. +echo Set to TRUE if you wish to use Python 2 instead of 3. Has no effect if IFCOS_INSTALL_PYTHON is not TRUE. +call cecho.cmd 0 13 "* IFCOS_NUM_BUILD_PROCS`t= %IFCOS_NUM_BUILD_PROCS%" +echo - How many MSBuild.exe processes may be run in parallel. +echo Defaults to NUMBER_OF_PROCESSORS. +echo. + +call :PrintUsage + +call cecho.cmd 0 14 "Warning: You will need roughly 8 GB of disk space to proceed `(VS 2015 x64 RelWithDebInfo`)." +echo. + +call cecho.cmd black cyan "If you are not ready with the above, press Ctrl-C to abort!" +pause +echo. + +cd %DEPS_DIR% + +:: Note all of the depedencies have approriate label so that user can easily skip something if wanted +:: by modifying this file and using goto. +:Boost +set BOOST_VERSION=1.59.0 +:: DEPENDENCY_NAME is used for logging and DEPENDENCY_DIR for saving from some redundant typing +set DEPENDENCY_NAME=Boost %BOOST_VERSION% +set DEPENDENCY_DIR="%DEPS_DIR%\boost" +:: Version string with underscores instead of dots. +set BOOST_VER=%BOOST_VERSION:.=_% +set BOOST_ROOT=%DEPS_DIR%\boost +REM set BOOST_INCLUDEDIR=%DEPS_DIR%\boost +set BOOST_LIBRARYDIR=%DEPS_DIR%\boost\stage\%VS_PLATFORM%\lib +:: NOTE Also zip download exists, if encountering problems with 7z for some reason. +set ZIP_EXT=7z +set BOOST_ZIP=boost_%BOOST_VER%.%ZIP_EXT% + +call :DownloadFile http://downloads.sourceforge.net/project/boost/boost/%BOOST_VERSION%/%BOOST_ZIP% "%DEPS_DIR%" %BOOST_ZIP% + +IF NOT %ERRORLEVEL%==0 GOTO :Error +call :ExtractArchive %BOOST_ZIP% "%DEPS_DIR%" "%DEPS_DIR%\boost" +IF NOT %ERRORLEVEL%==0 GOTO :Error + +:: Build Boost build script +IF EXIST "%DEPS_DIR%\boost_%BOOST_VER%". ( + cd "%DEPS_DIR%" + ren boost_%BOOST_VER% boost + IF NOT EXIST "%DEPS_DIR%\boost\boost.css" GOTO :Error + cd "%DEPS_DIR%\boost" + call cecho.cmd 0 13 "Building Boost build script." + call bootstrap vc%VC_VER% + IF NOT %ERRORLEVEL%==0 GOTO :Error +) + +set BOOST_LIBS=--with-system --with-regex --with-thread --with-program_options --with-date_time +:: NOTE Boost is fast to build with limited set of libraries so build it always. +cd "%DEPS_DIR%\boost" +call cecho.cmd 0 13 "Building %DEPENDENCY_NAME% %BOOST_LIBS% Please be patient, this will take a while." +IF EXIST "%DEPS_DIR%\boost\bin.v2\project-cache.jam" del "%DEPS_DIR%\boost\bin.v2\project-cache.jam" +call .\b2 toolset=msvc-%VC_VER%.0 runtime-link=static address-model=%ARCH_BITS% -j%IFCOS_NUM_BUILD_PROCS% ^ + variant=%DEBUG_OR_RELEASE_LOWERCASE% %BOOST_LIBS% stage --stagedir=stage/vs%VS_VER%-%VS_PLATFORM% +IF NOT %ERRORLEVEL%==0 GOTO :Error + +:ICU +set DEPENDENCY_NAME=ICU +set DEPENDENCY_DIR=N/A +set ICU_ZIP=icu-55.1-vs%VS_VER%.7z +cd "%DEPS_DIR%" +call :DownloadFile http://www.npcglib.org/~stathis/downloads/%ICU_ZIP% "%DEPS_DIR%" %ICU_ZIP% +IF NOT %ERRORLEVEL%==0 GOTO :Error +call :ExtractArchive %ICU_ZIP% "%DEPS_DIR%" "%INSTALL_DIR%\icu" +IF NOT %ERRORLEVEL%==0 GOTO :Error +:: Rename lib and bin directories to predictable form +IF EXIST "%DEPS_DIR%\icu-55.1-vs%VS_VER%". ( + pushd "%DEPS_DIR%\icu-55.1-vs%VS_VER%" + IF EXIST bin. ren bin bin%ARCH_BITS%" + IF EXIST lib. ren lib lib%ARCH_BITS%" + popd +) + +IF EXIST "%DEPS_DIR%\icu-55.1-vs%VS_VER%\". ( + robocopy "%DEPS_DIR%\icu-55.1-vs%VS_VER%\include" "%INSTALL_DIR%\icu\include" /E /IS /njh /njs + IF NOT EXIST "%INSTALL_DIR%\icu\lib". mkdir "%INSTALL_DIR%\icu\lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\sicutest%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\icutest%POSTFIX_D%.lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\sicutu%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\icutu%POSTFIX_D%.lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\sicuuc%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\icuuc%POSTFIX_D%.lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\sicudt%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\icudt%POSTFIX_D%.lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\sicuin%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\icuin%POSTFIX_D%.lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\sicuio%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\icuio%POSTFIX_D%.lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\sicule%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\icule%POSTFIX_D%.lib" + copy /y "%DEPS_DIR%\icu-55.1-vs%VS_VER%\lib%ARCH_BITS%\siculx%POSTFIX_D%.lib" "%INSTALL_DIR%\icu\lib\iculx%POSTFIX_D%.lib" +) + +:OpenCOLLADA +:: Note OpenCOLLADA has only Release and Debug builds. +set DEPENDENCY_NAME=OpenCOLLADA +set DEPENDENCY_DIR=%DEPS_DIR%\OpenCOLLADA +call :GitCloneOrPullRepository https://github.com/KhronosGroup/OpenCOLLADA.git "%DEPENDENCY_DIR%" +IF NOT %ERRORLEVEL%==0 GOTO :Error +cd "%DEPENDENCY_DIR%" +:: NOTE OpenCOLLADA has been observed to have problems with switching between debug and release builds so +:: uncomment to following line in order to delete the CMakeCache.txt always if experiencing problems. +REM IF EXIST "%DEPENDENCY_DIR%\%BUILD_DIR%\CMakeCache.txt". del "%DEPENDENCY_DIR%\%BUILD_DIR%\CMakeCache.txt" +:: NOTE Enforce that the embedded LibXml2 and PCRE are used as there might be problems with arbitrary versions of the libraries. +call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\OpenCOLLADA" -DUSE_STATIC_MSVC_RUNTIME=1 -DCMAKE_DEBUG_POSTFIX=d ^ + -DLIBXML2_LIBRARIES="" -DLIBXML2_INCLUDE_DIR="" -DPCRE_INCLUDE_DIR="" -DPCRE_LIBRARIES="" +IF NOT %ERRORLEVEL%==0 GOTO :Error +REM TODO OpenCOLLADA takes a long time to build; build only if needed +REM IF NOT EXIST "%DEPS_DIR%\OpenCOLLADA\%BUILD_DIR%\lib\%DEBUG_OR_RELEASE%\OpenCOLLADASaxFrameworkLoader.lib". +call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\OPENCOLLADA.sln" %DEBUG_OR_RELEASE% +IF NOT %ERRORLEVEL%==0 GOTO :Error +call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %DEBUG_OR_RELEASE% +IF NOT %ERRORLEVEL%==0 GOTO :Error + +:oce-win-bundle +set DEPENDENCY_NAME=oce-win-bundle +set DEPENDENCY_DIR=%DEPS_DIR%\oce-win-bundle +:: TODO Temporarily use our own repo until the upstream is fixed +REM call :GitCloneOrPullRepository https://github.com/QbProg/oce-win-bundle.git "%DEPENDENCY_DIR%" +call :GitCloneOrPullRepository https://github.com/Tridify/oce-win-bundle.git "%DEPENDENCY_DIR%" +IF NOT %ERRORLEVEL%==0 GOTO :Error +IF NOT EXIST "%DEPENDENCY_DIR%\%BUILD_DIR%". ( + cd "%DEPENDENCY_DIR%" + call git branch msvc-enhancements origin/msvc-enhancements + IF NOT %ERRORLEVEL%==0 GOTO :Error + call git checkout msvc-enhancements + IF NOT %ERRORLEVEL%==0 GOTO :Error +) +cd "%DEPENDENCY_DIR%" +call :RunCMake -DOCE_WIN_BUNDLE_INSTALL_DIR="%INSTALL_DIR%\oce-win-bundle" -DBUNDLE_USE_STATIC_MSVC_RUNTIME=1 +IF NOT %ERRORLEVEL%==0 GOTO :Error +REM IF NOT EXIST "%DEPENDENCY_DIR%\%BUILD_DIR%\FreeImage.cmake\%BUILD_CFG%\FreeImage.dll" +call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\oce-win-bundle.sln" %BUILD_CFG% +IF NOT %ERRORLEVEL%==0 GOTO :Error +call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG% +IF NOT %ERRORLEVEL%==0 GOTO :Error + +:OCE +set DEPENDENCY_NAME=Open CASCADE Community Edition +set DEPENDENCY_DIR=%DEPS_DIR%\oce +:: TODO Temporarily use our own repo until the upstream has static VC runtime option +REM call :GitCloneOrPullRepository https://github.com/tpaviot/oce.git "%DEPENDENCY_DIR%" +call :GitCloneOrPullRepository https://github.com/Tridify/oce.git "%DEPENDENCY_DIR%" +IF NOT %ERRORLEVEL%==0 GOTO :Error +IF NOT EXIST "%DEPENDENCY_DIR%\%BUILD_DIR%". ( + cd "%DEPENDENCY_DIR%" + call git branch temp-vs-static-lib-build-fixes origin/temp-vs-static-lib-build-fixes + IF NOT %ERRORLEVEL%==0 GOTO :Error + call git checkout temp-vs-static-lib-build-fixes + IF NOT %ERRORLEVEL%==0 GOTO :Error +) +cd "%DEPENDENCY_DIR%" +set OCE_BUNDLE_ROOT_PATH="%INSTALL_DIR%\oce-win-bundle" +REM -DOCE_USE_BUNDLE_SOURCE=1 REM set OCE_BUNDLE_ROOT_PATH=%DEPS_DIR%\oce-win-bundle +:: NOTE Specify OCE_NO_LIBRARY_VERSION as rc.exe can fail due to long filenames and huge command-line parameter +:: input (more than 32,000 characters). Could maybe try using subst for the build dir to overcome this. +call :RunCMake -DOCE_BUILD_SHARED_LIB=0 -DOCE_USE_BUNDLE=1 -DOCE_BUNDLE_ROOT_PATH="%OCE_BUNDLE_ROOT_PATH%" ^ + -DOCE_INSTALL_PREFIX="%INSTALL_DIR%\oce" -DOCE_TESTING=0 -DOCE_NO_LIBRARY_VERSION=1 ^ + -DOCE_USE_STATIC_MSVC_RUNTIME=1 +IF NOT %ERRORLEVEL%==0 GOTO :Error +REM TODO OCE takes a long time to build; build only if needed +call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\OCE.sln" %BUILD_CFG% +IF NOT %ERRORLEVEL%==0 GOTO :Error +call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG% +IF NOT %ERRORLEVEL%==0 GOTO :Error + +:Python +:: TODO Update to 3.5 when it's released as it will have an option to install debug libraries. +:: NOTE If updating the default Python version, change PY_VER_MAJOR_MINOR accordingly in run-cmake.bat +set PYTHON_VERSION=3.4.3 +IF "%IFCOS_USE_PYTHON2%"=="TRUE" set PYTHON_VERSION=2.7.10 +set PY_VER_MAJOR_MINOR=%PYTHON_VERSION:~0,3% +set PY_VER_MAJOR_MINOR=%PY_VER_MAJOR_MINOR:.=% +set PYTHONPATH=%INSTALL_DIR%\Python%PY_VER_MAJOR_MINOR% + +set DEPENDENCY_NAME=Python %PYTHON_VERSION% +set DEPENDENCY_DIR=N/A +set PYTHON_AMD64_POSTFIX=.amd64 +:: NOTE/TODO Beginning from 3.5.0: set PYTHON_AMD64_POSTFIX=-amd64 +IF NOT %TARGET_ARCH%==x64 set PYTHON_AMD64_POSTFIX= +set PYTHON_INSTALLER=python-%PYTHON_VERSION%%PYTHON_AMD64_POSTFIX%.msi +:: NOTE/TODO 3.5.0 doesn't use MSI any longer, but exe: set PYTHON_INSTALLER=python-%PYTHON_VERSION%%PYTHON_AMD64_POSTFIX%.exe +IF "%IFCOS_INSTALL_PYTHON%"=="TRUE" ( + REM Store Python versions to BuildDepsCache.txt for run-cmake.bat + echo PY_VER_MAJOR_MINOR=%PY_VER_MAJOR_MINOR%>"%~dp0\BuildDepsCache-%TARGET_ARCH%.txt" + echo PYTHONPATH=%PYTHONPATH%>>"%~dp0\BuildDepsCache-%TARGET_ARCH%.txt" + + cd "%DEPS_DIR%" + call :DownloadFile https://www.python.org/ftp/python/%PYTHON_VERSION%/%PYTHON_INSTALLER% "%DEPS_DIR%" %PYTHON_INSTALLER% + IF NOT %ERRORLEVEL%==0 GOTO :Error + REM Uninstall if build Rebuild/Clean used + IF NOT %BUILD_TYPE%==Build ( + call cecho.cmd 0 13 "Uninstalling %DEPENDENCY_NAME%. Please be patient, this will take a while." + msiexec /x %PYTHON_INSTALLER% /qn + ) + + IF NOT EXIST "%PYTHONPATH%". ( + call cecho.cmd 0 13 "Installing %DEPENDENCY_NAME%. Please be patient, this will take a while." + msiexec /qn /i %PYTHON_INSTALLER% TARGETDIR="%PYTHONPATH%" + ) ELSE ( + call cecho.cmd 0 13 "%DEPENDENCY_NAME% already installed. Skipping." + ) +) ELSE ( + call cecho.cmd 0 13 "IFCOS_INSTALL_PYTHON not true, skipping installation of Python." +) + +:SWIG +set SWIG_VERSION=3.0.7 +set DEPENDENCY_NAME=SWIG %SWIG_VERSION% +set DEPENDENCY_DIR=N/A +set SWIG_ZIP=swigwin-%SWIG_VERSION%.zip +cd "%DEPS_DIR%" +call :DownloadFile http://sourceforge.net/projects/swig/files/swigwin/swigwin-%SWIG_VERSION%/%SWIG_ZIP% "%DEPS_DIR%" %SWIG_ZIP% +IF NOT %ERRORLEVEL%==0 GOTO :Error +call :ExtractArchive %SWIG_ZIP% "%DEPS_DIR%" "%DEPS_DIR%\swigwin" +IF NOT %ERRORLEVEL%==0 GOTO :Error +IF EXIST "%DEPS_DIR%\swigwin-%SWIG_VERSION%". ( + pushd %DEPS% + ren swigwin-%SWIG_VERSION% swigwin + popd +) +IF EXIST "%DEPS_DIR%\swigwin\". robocopy "%DEPS_DIR%\swigwin" "%INSTALL_DIR%\swigwin" /E /IS /MOVE /njh /njs + +:Successful +echo. +call %~dp0\utils\cecho.cmd 0 10 "%PROJECT_NAME% dependencies built." +goto :Finish + +:ErrorAndPrintUsage +echo. +call :PrintUsage +:Error +echo. +call %~dp0\utils\cecho.cmd 0 12 "An error occurred! Aborting!" +goto :Finish + +:Finish +set PATH=%ORIGINAL_PATH% +cd %~dp0 +endlocal +goto :EOF + +::::::::::::::::::::::::::::::::::::: Subroutines ::::::::::::::::::::::::::::::::::::: + +:: DownloadFile - Downloads a file using wget +:: Params: %1 url, %2 destinationDir, %3 filename +:DownloadFile +pushd %2 +IF NOT EXIST "%3". ( + call cecho.cmd 0 13 "Downloading %DEPENDENCY_NAME% into %2." + powershell -Command "$webClient = new-object System.Net.WebClient; $webClient.DownloadFile('%1', '%3')" + REM Old wget version in case someone has problem with PowerShell: wget --no-check-certificate %1 +) ELSE ( + call cecho.cmd 0 13 "%DEPENDENCY_NAME% already downloaded. Skipping." +) +set RET=%ERRORLEVEL% +popd +exit /b %RET% + +:: ExtractArchive - Extracts an archive file using 7-zip +:: Params: %1 filename, %2 destinationDir, %3 dirAfterExtraction +:ExtractArchive +IF NOT EXIST "%3". ( + call cecho.cmd 0 13 "Extracting %DEPENDENCY_NAME% into %2." + 7za x %1 -y -o%2 +) ELSE ( + call cecho.cmd 0 13 "%DEPENDENCY_NAME% already extracted into %3. Skipping." +) +exit /b %ERRORLEVEL% + +:: GitCloneOrPullRepository - Clones or pulls (if repository already cloned) a Git repository +:: Params: %1 gitUrl, %2 destDir +:: F.ex. call :GitCloneRepository https://github.com/KhronosGroup/OpenCOLLADA.git "%DEPS_DIR%\OpenCOLLADA\" +:GitCloneOrPullRepository +IF NOT EXIST %2. ( + call cecho.cmd 0 13 "Cloning %DEPENDENCY_NAME% into %2." + pushd "%DEPS_DIR%" + call git clone %1 %2 +) ELSE ( + call cecho.cmd 0 13 "%DEPENDENCY_NAME% already cloned. Pulling latest changes." + pushd %2 + call git pull +) +set RET=%ERRORLEVEL% +popd +exit /b %RET% + +:: RunCMake - Runs CMake for a CMake-based project +:: Params: %* cmakeOptions +:: NOTE cd to root CMakeLists.txt folder before calling this if the CMakeLists.txt is not in the repo root. +:RunCMake +call cecho.cmd 0 13 "Running CMake for %DEPENDENCY_NAME%." +IF NOT EXIST %BUILD_DIR%. mkdir %BUILD_DIR% +IF NOT %ERRORLEVEL%==0 GOTO :Error +pushd %BUILD_DIR% +:: TODO make deleting cache a parameter for this subroutine? We probably want to delete the +:: cache always e.g. when we've had new changes in the repository. +IF %BUILD_TYPE%==Rebuild IF EXIST CMakeCache.txt. del CMakeCache.txt +cmake .. -G %GENERATOR% %* +set RET=%ERRORLEVEL% +popd +exit /b %RET% + +:: BuildSolution - Builds/Rebuilds/Cleans a solution using MSBuild +:: Params: %1 solutioName, %2 configuration +:BuildSolution +call cecho.cmd 0 13 "%BUILD_TYPE%ing %2 %DEPENDENCY_NAME%. Please be patient, this will take a while." +%MSBUILD_CMD% %1 /p:configuration=%2;platform=%VS_PLATFORM% +exit /b %ERRORLEVEL% + +:: InstallCMakeProject - Builds the INSTALL project of CMake-based project +:: Params: %1 buildDir, %2 == configuration +:: NOTE the actual install dir is set during cmake run. +:InstallCMakeProject +pushd %1 +call cecho.cmd 0 13 "Installing %2 %DEPENDENCY_NAME%. Please be patient, this will take a while." +%INSTALL_CMD% INSTALL.%VCPROJ_FILE_EXT% /p:configuration=%2;platform=%VS_PLATFORM% +set RET=%ERRORLEVEL% +popd +exit /b %RET% + +:: PrintUsage - Prints usage information +:PrintUsage +call %~dp0\utils\cecho.cmd 0 10 "Requirements for a successful execution:" +echo 1. Install PowerShell (preinstalled in Windows ^>= 7) and make sure 'powershell' is accessible from PATH. +echo - https://support.microsoft.com/en-us/kb/968929 +echo 2. Install Git and make sure 'git' is accessible from PATH. +echo - http://code.google.com/p/tortoisegit/ +echo 3. Install CMake and make sure 'cmake' is accessible from PATH. +echo - http://www.cmake.org/ +echo 4. Visual Studio 2008 or newer (2013 or newer recommended). +echo - https://www.visualstudio.com/ +echo 5. Run this batch script with Visual Studio environment variables set. +echo - https://msdn.microsoft.com/en-us/library/ms229859(v=vs.110).aspx +echo. +REM TODO 3ds Max SDK instructions? diff --git a/win/readme.md b/win/readme.md new file mode 100644 index 0000000000..ee4c3c4989 --- /dev/null +++ b/win/readme.md @@ -0,0 +1,58 @@ +Windows Build Tools and Scripts +=============================== +This folder contains build tools and script for automatic building and deployment of IfcOpenShell (IFCOS) +and its dependencies. + +As a general guideline, `.cmd` files are non-standalone batch files that need to be run from command +prompt or from another batch file, and/or while the Visual Studio environment variables set, and `.bat` files are +standalone batch files that can be run also e.g. from the File Explorer. + +Usage Instructions +------------------ +Execute `build-deps.cmd` to fetch, build and install the dependencies. The batch file will print +the requirements for a successful execution. The script allows a few user-configurable build options +which are listed in the usage instructions. Either edit the script file or set these values before +running the script. + +`build-deps.cmd` expects a CMake generator as `%1` and a build configuration type as `%2`. If the parameters +are not provided, the default values are used (`"Visual Studio 14 2015 Win64"` and `RelWithDebInfo` respectively). +A build type (`Build/Rebuild/Clean`) can be provided as `%3`, if wanted (defaults to `Build`). See `vs-cfg.cmd` +if you want to change the defaults. The batch file will create `deps\` and `deps-vs--installed\` +directories to the project root. Debug and release builds of the depedencies can co-exist by simply running +`build-deps.cmd Debug` and `build-deps.cmd `. + +After the dependencies are build, execute `run-cmake.bat`. The batch file expects a CMake generator as +`%1` (if not provided, the same default value as above is used), or alternatively, if more parameters are provided, `%*` is passed for the CMake invokation, i.e., if one +wants to pass custom build options, the generator must be passed also using CMake's syntax: + +`run-cmake.bat -G "Visual Studio 14 2015 Win64" -DBUILD_IFCPYTHON=0`. + +The batch script will create a folder of form `build-vs-\` which will contain the solution and project files for Visual Studio. +**If you wish to use any library from a custom location, modify the paths in run-cmake.bat +accordingly**. + +After this, one can build the project using the `IfcOpenShell.sln` file in the build folder. Build the `INSTALL` project +if wanted. The project will be installed to `installed-vs-\` folder in the project's root +folder and the required IfcOpenShell-Python parts are deployed to the `\Lib\site-packages\` folder. + +**Note:** All of the dependencies are build as static libraries against the static run-time allowing the developer +to effortlessly deploy standalone IFCOS binaries. + + +Directory Structure +------------------ +``` +.. ++---build-vs- - Created by run-cmake.bat, for a certain VS version and target architecture ++---deps - Created by build-deps.cmd, common for all VS versions and target architectures ++---deps-installed-vs- - Created by build-deps.cmd, for a certain VS version and target architecture ++---installed-vs- - Created by building the IFCOS's INSTALL project +\---win +| build-deps.cmd - Fetches and builds all needed dependencies for IFCOS +| BuildDepsCache-.txt - Cache file created by build-deps.cmd +| readme.md - This file +| run-cmake.bat - Sets environment variables for the dependencies and runs CMake for IFCOS +| vs-cfg.cmd - Utility file used by the build scripts ++---sln - Contains the old Visual Studio solution and project files +\---utils - Contains various utilities for the build scripts +``` diff --git a/win/run-cmake.bat b/win/run-cmake.bat new file mode 100644 index 0000000000..3ee00e731a --- /dev/null +++ b/win/run-cmake.bat @@ -0,0 +1,112 @@ +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: :: +:: 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 . :: +:: :: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@echo off +echo. + +set PROJECT_NAME=IfcOpenShell + +:: Enable the delayed environment variable expansion needed in vs-cfg.cmd. +setlocal EnableDelayedExpansion +:: TODO Getting warning print in vs-cfg.cmd for missing build type although this script doesn't need it specified +call vs-cfg.cmd %1 + +:: Read Python related variables from BuildDepsCache.txt +for /f "delims== tokens=1,2" %%G in (BuildDepsCache-%TARGET_ARCH%.txt) do set %%G=%%H + +pushd .. +set CMAKE_INSTALL_PREFIX=%CD%\installed-vs%VS_VER%-%TARGET_ARCH% +popd + +set BUILD_DIR=build-vs%VS_VER%-%TARGET_ARCH% +IF NOT EXIST ..\%BUILD_DIR%. mkdir ..\%BUILD_DIR% +pushd ..\%BUILD_DIR% + +set BOOST_ROOT=%DEPS_DIR%\boost +REM set BOOST_INCLUDEDIR=%DEPS_DIR%\boost +set BOOST_LIBRARYDIR=%DEPS_DIR%\boost\stage\vs%VS_VER%-%VS_PLATFORM%\lib +set ICU_INCLUDE_DIR=%INSTALL_DIR%\icu\include +set ICU_LIBRARY_DIR=%INSTALL_DIR%\icu\lib +set OCC_INCLUDE_DIR=%INSTALL_DIR%\oce\include\oce +set OCC_LIBRARY_DIR=%INSTALL_DIR%\oce\Win%ARCH_BITS%\lib +set OPENCOLLADA_INCLUDE_DIR=%INSTALL_DIR%\OpenCOLLADA\include\opencollada +set OPENCOLLADA_LIBRARY_DIR=%INSTALL_DIR%\OpenCOLLADA\lib\opencollada +if "%PY_VER_MAJOR_MINOR%"=="" set PY_VER_MAJOR_MINOR=34 +if "%PYTHONPATH%"=="" set PYTHONPATH=%INSTALL_DIR%\Python%PY_VER_MAJOR_MINOR% +set PYTHON_INCLUDE_DIR=%PYTHONPATH%\include +set PYTHON_LIBRARY=%PYTHONPATH%\libs\python%PY_VER_MAJOR_MINOR%.lib +set SWIG_DIR=%INSTALL_DIR%\swigwin +set PATH=%PATH%;%SWIG_DIR%;%PYTHONPATH% +:: TODO 3ds Max SDK? + +echo. +call cecho.cmd 0 10 "Script configuration:" +echo CMake Generator = %GENERATOR% +echo All arguments = %* +echo. +call cecho.cmd 0 10 "Dependency Environment Variables for %PROJECT_NAME%:" +echo BOOST_ROOT = %BOOST_ROOT% +REM echo BOOST_INCLUDEDIR = %BOOST_INCLUDEDIR% +echo BOOST_LIBRARYDIR = %BOOST_LIBRARYDIR% +echo ICU_INCLUDE_DIR = %ICU_INCLUDE_DIR% +echo ICU_LIBRARY_DIR = %ICU_LIBRARY_DIR% +echo OCC_INCLUDE_DIR = %OCC_INCLUDE_DIR% +echo OCC_LIBRARY_DIR = %OCC_LIBRARY_DIR% +echo OPENCOLLADA_INCLUDE_DIR = %OPENCOLLADA_INCLUDE_DIR% +echo OPENCOLLADA_LIBRARY_DIR = %OPENCOLLADA_LIBRARY_DIR% +echo PYTHONPATH = %PYTHONPATH% +echo PYTHON_INCLUDE_DIR = %PYTHON_INCLUDE_DIR% +echo PYTHON_LIBRARY = %PYTHON_LIBRARY% +echo SWIG_DIR = %SWIG_DIR% +echo. +echo CMAKE_INSTALL_PREFIX = %CMAKE_INSTALL_PREFIX% +echo. + +set CMAKELISTS_DIR=..\cmake +REM IF NOT EXIST %PROJECT_NAME%.sln. ( + IF EXIST CMakeCache.txt. del /Q CMakeCache.txt + call cecho.cmd 0 13 "Running CMake for %PROJECT_NAME%." + IF "%2"=="" ( + REM No extra arguments provided, trust that GENERATOR is set properly. + cmake.exe %CMAKELISTS_DIR% -G %GENERATOR% -DCMAKE_INSTALL_PREFIX="%CMAKE_INSTALL_PREFIX%" + ) ELSE ( + REM Extra arguments has been provided. As CMake options are typically of format -DSOMETHING:BOOL=ON, + REM i.e. they contain an equal sign, they will mess up the batch file argument parsing if the arguments are passed on + REM by splitting them %2 %3 %4 %5 %6 %7 %8 %9. In the extra argument case trust that user has provided the generator + REM as the first argument as pass all arguments as is by using %*. + cmake.exe %CMAKELISTS_DIR% -G %* + ) + IF NOT %ERRORLEVEL%==0 GOTO :Error +REM ) ELSE ( + REM call cecho.cmd 0 10 "%PROJECT_NAME%.sln exists. Skipping CMake call for %PROJECT_NAME%." + REM call cecho.cmd 0 10 "Delete %BUILD_DIR%\%PROJECT_NAME%.sln to trigger a CMake rerun." +REM ) +echo. + +goto :Finish + +:Error +echo. +cecho {0C}An error occurred! Aborting!" +goto :Finish + +:Finish +popd +set PATH=%ORIGINAL_PATH% +endlocal diff --git a/win/IfcConvert.vcproj b/win/sln/IfcConvert.vcproj similarity index 78% rename from win/IfcConvert.vcproj rename to win/sln/IfcConvert.vcproj index b7e27a2ca2..edc1b07ac1 100644 --- a/win/IfcConvert.vcproj +++ b/win/sln/IfcConvert.vcproj @@ -17,8 +17,8 @@ @@ -88,8 +88,8 @@ @@ -202,43 +202,43 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > diff --git a/win/IfcGeom.vcproj b/win/sln/IfcGeom.vcproj similarity index 69% rename from win/IfcGeom.vcproj rename to win/sln/IfcGeom.vcproj index 561649b717..4d13716f3d 100644 --- a/win/IfcGeom.vcproj +++ b/win/sln/IfcGeom.vcproj @@ -151,43 +151,43 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > @@ -197,87 +197,87 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > diff --git a/win/IfcMax.vcproj b/win/sln/IfcMax.vcproj similarity index 90% rename from win/IfcMax.vcproj rename to win/sln/IfcMax.vcproj index e8e107280f..8778979fb9 100644 --- a/win/IfcMax.vcproj +++ b/win/sln/IfcMax.vcproj @@ -17,8 +17,8 @@ @@ -91,8 +91,8 @@ @@ -186,16 +186,16 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > diff --git a/win/IfcOpenHouse.vcproj b/win/sln/IfcOpenHouse.vcproj similarity index 93% rename from win/IfcOpenHouse.vcproj rename to win/sln/IfcOpenHouse.vcproj index dd884cc213..4f0ce2b955 100644 --- a/win/IfcOpenHouse.vcproj +++ b/win/sln/IfcOpenHouse.vcproj @@ -17,8 +17,8 @@ @@ -88,8 +88,8 @@ diff --git a/win/IfcOpenShell.sln b/win/sln/IfcOpenShell.sln similarity index 100% rename from win/IfcOpenShell.sln rename to win/sln/IfcOpenShell.sln diff --git a/win/IfcParse.vcproj b/win/sln/IfcParse.vcproj similarity index 68% rename from win/IfcParse.vcproj rename to win/sln/IfcParse.vcproj index 0723f5743a..fa96845a7a 100644 --- a/win/IfcParse.vcproj +++ b/win/sln/IfcParse.vcproj @@ -17,8 +17,8 @@ @@ -240,87 +240,87 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > diff --git a/win/IfcParseExamples.vcproj b/win/sln/IfcParseExamples.vcproj similarity index 93% rename from win/IfcParseExamples.vcproj rename to win/sln/IfcParseExamples.vcproj index c53313c791..94027eb617 100644 --- a/win/IfcParseExamples.vcproj +++ b/win/sln/IfcParseExamples.vcproj @@ -18,8 +18,8 @@ @@ -90,8 +90,8 @@ diff --git a/win/IfcWrap.vcproj b/win/sln/IfcWrap.vcproj similarity index 94% rename from win/IfcWrap.vcproj rename to win/sln/IfcWrap.vcproj index 99a3820186..51ffcc7320 100644 --- a/win/IfcWrap.vcproj +++ b/win/sln/IfcWrap.vcproj @@ -14,12 +14,12 @@ - - + <..\.. Name="Debug|Win32" OutputDirectory="..\build\debug" IntermediateDirectory="..\temp\wrap\debug" - ConfigurationType="2" + ..\..Type="2" CharacterSet="2" BuildLogFile="$(IntDir)\BuildLog.htm" > @@ -87,12 +87,12 @@ - - + <..\.. Name="Release|Win32" OutputDirectory="..\build\release" IntermediateDirectory="..\temp\wrap\release" - ConfigurationType="2" + ..\..Type="2" CharacterSet="2" WholeProgramOptimization="1" > @@ -160,8 +160,8 @@ - - + + @@ -184,7 +184,7 @@ - - - + - + . :: +:: :: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:: This script initializes various Visual Studio -related environment variables needed for building +:: This batch file expects CMake generator as %1 and build configuration type as %2. +:: NOTE: The delayed environment variable expansion needs to be enabled before calling this. + +@echo off + +set GENERATOR=%1 + +:: TODO IDEA: Take more user-friendly VS generators and convert them to the CMake ones? +:: F.ex. "vs2013-32" and/or "vc14-64" + +:: TODO Print CMake and VS versions. Maybe in build-deps.cmd would be better than here. + +:: Supported Visual Studio versions: +set GENERATORS[0]="Visual Studio 14 2015" +set GENERATORS[1]="Visual Studio 14 2015 Win64" +:: TODO Check CMake version and convert possible new format (>= 3.0) generator names +:: to the old versions if using older CMake for VS <= 2013, +:: see http://www.cmake.org/cmake/help/v3.0/release/3.0.0.html#other-changes +set GENERATORS[2]="Visual Studio 12" +set GENERATORS[3]="Visual Studio 12 Win64" +set GENERATORS[4]="Visual Studio 11" +set GENERATORS[5]="Visual Studio 11 Win64" +set GENERATORS[6]="Visual Studio 10" +set GENERATORS[7]="Visual Studio 10 Win64" +set GENERATORS[8]="Visual Studio 9 2008" +set GENERATORS[9]="Visual Studio 9 2008 Win64" +set GENERATOR_DEFAULT=%GENERATORS[1]% + +IF "!GENERATOR!"=="" ( + set GENERATOR=%GENERATOR_DEFAULT% + call utils\cecho.cmd 0 14 "%~nx0: Warning: Generator not passed - using the default '`"%GENERATOR_DEFAULT%`'`t +) + +FOR /l %%i in (0,1,9) DO ( + IF !GENERATOR!==!GENERATORS[%%i]! GOTO :GeneratorValid +) +call utils\cecho.cmd 0 12 "%~nx0: Invalid or unsupported CMake generator string passed: '`"!GENERATOR!`'". Cannot proceed, aborting!" +exit /b 1 + +:GeneratorValid +:: Figure out the build configuration from the CMake generator string. +:: Are we building 32-bit or 64-bit version. +set ARCH_BITS=32 +set TARGET_ARCH=x86 +:: Visual Studio platform name, Win32 (i.e. x86) or x64. +set VS_PLATFORM=Win32 + +:: Find out VS version, VC versions and are we doing 64-bit or not. +:: VS_VER and VC_VER are convenience variables used f.ex. for filenames. +set GENERATOR_NO_DOUBLEQUOTES=%GENERATOR:"=% +set GENERATOR_SPLIT=%GENERATOR_NO_DOUBLEQUOTES: =,% +FOR %%i IN (%GENERATOR_SPLIT%) DO ( + call :StrLength LEN %%i + IF !LEN!==1 set VC_VER=%%i + IF !LEN!==2 set VC_VER=%%i + IF !LEN!==4 set VS_VER=%%i + REM Are going to perform a 64-bit build? + IF %%i==Win64 ( + set ARCH_BITS=64 + set TARGET_ARCH=x64 + set VS_PLATFORM=x64 + ) +) + +:: VS project file extension is different on older VS versions +set VCPROJ_FILE_EXT=vcxproj +IF %VS_VER%==2008 set VCPROJ_FILE_EXT=vcproj + +:: Set up variables depending on the used build configuration type. +set BUILD_CFG=%2 + +:: The default build types provided by CMake +set BUILD_CFG_MINSIZEREL=MinSizeRel +set BUILD_CFG_RELEASE=Release +set BUILD_CFG_RELWITHDEBINFO=RelWithDebInfo +set BUILD_CFG_DEBUG=Debug +set BUILD_CFG_DEFAULT=%BUILD_CFG_RELWITHDEBINFO% + +IF "!BUILD_CFG!"=="" ( + set BUILD_CFG=%BUILD_CFG_DEFAULT% + call utils\cecho.cmd 0 14 "%~nx0: Warning: BUILD_CFG not specified - using the default %BUILD_CFG_DEFAULT%" +) +IF NOT !BUILD_CFG!==%BUILD_CFG_MINSIZEREL% IF NOT !BUILD_CFG!==%BUILD_CFG_RELEASE% ( +IF NOT !BUILD_CFG!==%BUILD_CFG_RELWITHDEBINFO% IF NOT !BUILD_CFG!==%BUILD_CFG_DEBUG% ( + call utils\cecho.cmd 0 12 "%~nx0: Invalid or unsupported CMake build configuration type passed: !BUILD_CFG!. Cannot proceed, aborting!" + exit /b 1 +)) + +:: DEBUG_OR_RELEASE and DEBUG_OR_RELEASE_LOWERCASE are "Debug" and "debug" for Debug build and "Release" and +:: "release" for all of the Release variants. +:: POSTFIX_D, POSTFIX_UNDERSCORE_D and POSTFIX_UNDERSCORE_DEBUG are helpers for performing file copies and +:: checking for existence of files. In release build these variables are empty. +set DEBUG_OR_RELEASE=Release +set DEBUG_OR_RELEASE_LOWERCASE=release +set POSTFIX_D= +set POSTFIX_UNDERSCORE_D= +set POSTFIX_UNDERSCORE_DEBUG= +IF %BUILD_CFG%==Debug ( + set DEBUG_OR_RELEASE=Debug + set DEBUG_OR_RELEASE_LOWERCASE=debug + set POSTFIX_D=d + set POSTFIX_UNDERSCORE_D=_d + set POSTFIX_UNDERSCORE_DEBUG=_debug +) + +:: Add utils to PATH +set ORIGINAL_PATH=%PATH% +set PATH=%PATH%;%~dp0\utils + +:: Fetch and build the dependencies to a dedicated directory depending on the used VS version and target architecture. +:: NOTE For IfcOpenShell we can build all of our deps both x86 and x64 using different VS versions in the same directories +:: so no need for -%VS_VER%-%TARGET_ARCH% postfix. +:: set DEPS_DIR=%CD%\deps-%VS_VER%-%TARGET_ARCH% +pushd .. +set DEPS_DIR=%CD%\deps +set INSTALL_DIR=%CD%\deps-vs%VS_VER%-%TARGET_ARCH%-installed +REM set INSTALL_DIR=%CD%\deps-vs%VS_VER%-%TARGET_ARCH%-%DEBUG_OR_RELEASE_LOWERCASE%-installed +popd + +GOTO :EOF +:: http://geekswithblogs.net/SoftwareDoneRight/archive/2010/01/30/useful-dos-batch-functions-substring-and-length.aspx +:StrLength +set #=%2% +set length=0 +:stringLengthLoop +if defined # (set #=%#:~1%&set /A length += 1&goto stringLengthLoop) +::echo the string is %length% characters long! +set "%~1=%length%" +GOTO :EOF \ No newline at end of file