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