diff --git a/.travis.yml b/.travis.yml
index 4436726915..a873eb1a1d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -33,6 +33,11 @@ install:
- sudo apt-get install -y libpcre3-dev
script:
+# test nix/build-all.py script (before the build following build instructions in order to no mess up installations into /usr/local)
+ - cd nix
+ - python build-all.py
+ - cd ..
+# test build according to build instructions
- pwd
- cd ..
- git clone https://github.com/KhronosGroup/OpenCOLLADA.git
@@ -53,3 +58,9 @@ script:
- cd build
- cmake -DCOLLADA_SUPPORT=True -DOPENCOLLADA_INCLUDE_DIR=/usr/local/include/opencollada -DOPENCOLLADA_LIBRARY_DIR=/usr/local/lib/opencollada -DPCRE_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu -DUSE_IFC4=False -DBUILD_IFCPYTHON=True -DUNICODE_SUPPORT=True -DOCC_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu ..
- make -j2
+ - pwd
+ - cd ..
+ - cd ..
+
+after_failure:
+ - cat build/Linux/x86_64/logs/*.log
diff --git a/nix/build-all.py b/nix/build-all.py
new file mode 100644
index 0000000000..afb4252f49
--- /dev/null
+++ b/nix/build-all.py
@@ -0,0 +1,508 @@
+#!/usr/bin/python
+###############################################################################
+# #
+# 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 script builds IfcOpenShell and its dependencies #
+# #
+# Prerequisites for this script to function correctly: #
+# * git * bzip2 * tar * c(++) compilers * yacc * autoconf #
+# on debian 7.8 these can be obtained with: #
+# $ apt-get install git gcc g++ autoconf bison bzip2 #
+# on ubuntu 14.04: #
+# $ apt-get install git gcc g++ autoconf bison make #
+# on OS X El Capitan with homebrew: #
+# $ brew install git bison autoconf automake #
+# #
+###############################################################################
+
+import logging
+import os
+import sys
+import subprocess as sp
+import shutil
+import time
+import tarfile
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.INFO)
+ch = logging.StreamHandler()
+ch.setLevel(logging.INFO)
+logger.addHandler(ch)
+
+PROJECT_NAME="IfcOpenShell"
+OCE_VERSION="0.16"
+PYTHON_VERSIONS=["2.7.10", "3.2.6", "3.3.6", "3.4.4", "3.5.1"]
+BOOST_VERSION="1.59.0"
+PCRE_VERSION="8.38"
+LIBXML_VERSION="2.9.3"
+CMAKE_VERSION="3.4.1"
+ICU_VERSION="56.1"
+
+# binaries
+bash = "bash"
+uname="uname"
+git="git"
+bunzip2="bunzip2"
+tar="tar"
+cc="cc"
+cplusplus="c++"
+autoconf="autoconf"
+automake="automake"
+yacc="yacc"
+make="make"
+date = "date"
+curl="curl"
+wget="wget"
+strip="strip"
+
+# Helper function for coloured printing
+
+NO_COLOR="\033[0m" # [http://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux]
+BLACK_ON_WHITE="\033[0;30;107m"
+RED="\033[31m"
+GREEN="\033[32m"
+YELLOW="\033[33m"
+MAGENTA="\033[35m"
+
+def cecho(message, color=NO_COLOR):
+ """Logs message `message` in color `color`."""
+ logger.info("%s%s\033[0m\n" % (color, message))
+
+def fullpath(arg):
+ return os.path.realpath(os.path.dirname(sys.argv[1]))
+
+def which(cmd):
+ for path in os.environ["PATH"].split(":"):
+ if os.path.exists(path) and cmd in os.listdir(path):
+ return cmd
+ return None
+
+def get_os():
+ ret_value = sp.check_output([uname, "-s"]).strip()
+ return ret_value
+
+# Set defaults for missing empty environment variables
+
+try:
+ IFCOS_NUM_BUILD_PROCS = os.environ["IFCOS_NUM_BUILD_PROCS"]
+except KeyError:
+ IFCOS_NUM_BUILD_PROCS=int(sp.check_output([bash, "-c", "sysctl -n hw.ncpu 2> /dev/null || cat /proc/cpuinfo | grep processor | wc -l"]))+1
+ os.environ["IFCOS_NUM_BUILD_PROCS"]=str(IFCOS_NUM_BUILD_PROCS)
+
+try:
+ TARGET_ARCH= os.environ["TARGET_ARCH"]
+except KeyError:
+ TARGET_ARCH = sp.check_output([uname, "-m"]).strip()
+ os.environ["TARGET_ARCH"]=TARGET_ARCH
+
+CMAKE_DIR=os.path.realpath(os.path.join("..", "cmake"))
+
+try:
+ DEPS_DIR = os.environ["DEPS_DIR"]
+except KeyError:
+ DEPS_DIR = os.path.realpath(os.path.join("..", "build", sp.check_output(uname).strip(), TARGET_ARCH))
+ os.environ["DEPS_DIR"] = DEPS_DIR
+ if not os.path.exists(DEPS_DIR):
+ os.makedirs(DEPS_DIR)
+
+try:
+ BUILD_CFG=os.environ["BUID_CFG"]
+except KeyError:
+ BUILD_CFG="RelWithDebInfo"
+ os.environ["BUILD_CFG"]=BUILD_CFG
+
+try:
+ BUILD_TYPE=os.environ["BUILD_TYPE"]
+except KeyError:
+ BUILD_TYPE="Build"
+ os.environ["BUILD_TYPE"] = BUILD_TYPE
+
+# Print build configuration information
+
+cecho ("""This script fetches and builds %s and its dependencies
+""" % (PROJECT_NAME,), BLACK_ON_WHITE)
+cecho("""Script configuration:
+
+""", GREEN)
+cecho("""* Target Architecture = %s""" % (TARGET_ARCH,), MAGENTA)
+cecho(" - Whether 32-bit (i686) or 64-bit (x86_64) will be built.")
+cecho("* Dependency Directory = %s" % (DEPS_DIR,), MAGENTA)
+cecho(" - The directory where %s dependencies are installed." % (PROJECT_NAME,))
+cecho("* Build Config Type = %s" % (BUILD_CFG,), MAGENTA)
+cecho(""" - The used build configuration type for the dependencies.
+ Defaults to RelWithDebInfo if not specified.""")
+
+if BUILD_CFG == "MinSizeRel":
+ cecho(" WARNING: MinSizeRel build can suffer from a significant performance loss.", RED)
+
+cecho("* IFCOS_NUM_BUILD_PROCS = %s" % (IFCOS_NUM_BUILD_PROCS,), MAGENTA)
+cecho(""" - How many compiler processes may be run in parallel.
+""")
+
+# Check that required tools are in PATH
+
+for cmd in [git, bunzip2, tar, cc, cplusplus, autoconf, automake, yacc, make]:
+ if which(cmd) is None:
+ raise ValueError("Required tool '%s' not installed or not added to PATH" % (cmd,))
+
+# identifiers for the download tool (could be less memory consuming as ints, but are more verbose as strings)
+download_tool_curl="curl"
+download_tool_wget="wget"
+download_tool_git = "git"
+# curl randomly has trouble and fails with return code 6 without further feedback -> prefer wget
+if which(wget) != None:
+ download_tool_default = download_tool_wget
+elif which(curl) != None:
+ download_tool_default = download_tool_curl
+else:
+ raise ValueError("No download application found, tried: curl, wget")
+CURL = ["curl", "-sLO"]
+WGET= ["wget", "-q", "--no-check-certificate"]
+
+# Create log directory and file
+
+log_dir = os.path.join(DEPS_DIR, "logs")
+if not os.path.exists(log_dir):
+ os.makedirs(log_dir)
+LOG_FILE="%s.log" % (os.path.join(log_dir, sp.check_output([date, "+%Y%m%d"]).strip()),)
+if not os.path.exists(LOG_FILE):
+ open(LOG_FILE, "w").close()
+logger.info("using command log file '%s'" % (LOG_FILE,))
+
+def __check_call__(cmds, cwd=None):
+ logger.info("running command '%s' in directory '%s'" % (cmds, cwd))
+ log_file_handle = open(LOG_FILE, "a")
+ sp.check_call(cmds, cwd=cwd, stdout=log_file_handle, stderr=log_file_handle)
+ log_file_handle.close()
+
+def __check_output__(cmds, cwd=None):
+ """Wraps `subprocess.check_output` and logs the command being executed,
+ sets up logging `stderr` to `LOG_FILE` (in append mode) and strips the
+ return value because it's unlikely that the newline at the end of output is
+ useful and it often causes errors"""
+ logger.info("running command '%s' in directory '%s'" % (cmds, cwd))
+ log_file_handle = open(LOG_FILE, "a")
+ ret_value = sp.check_output(cmds, cwd=cwd, stderr=log_file_handle).strip()
+ log_file_handle.close()
+ return ret_value
+
+BOOST_VERSION_UNDERSCORE=BOOST_VERSION.replace(".", "_")
+ICU_VERSION_UNDERSCORE=ICU_VERSION.replace(".", "_")
+CMAKE_VERSION_2=CMAKE_VERSION[0:3]
+
+OCE_LOCATION="https://github.com/tpaviot/oce/archive/OCE-%s.tar.gz" % (OCE_VERSION,)
+BOOST_LOCATION="http://downloads.sourceforge.net/project/boost/boost/%s/boost_%s.tar.bz2" % (BOOST_VERSION, BOOST_VERSION_UNDERSCORE)
+OPENCOLLADA_LOCATION="https://github.com/KhronosGroup/OpenCOLLADA.git"
+OPENCOLLADA_COMMIT="f99d59e73e565a41715eaebc00c7664e1ee5e628"
+
+# Helper functions
+
+def run_autoconf(arg1, configure_args, cwd):
+ configure_path = os.path.realpath(os.path.join(cwd, "..", "configure"))
+ if not os.path.exists(configure_path):
+ __check_call__([bash, "./autogen.sh"], cwd=os.path.realpath(os.path.join(cwd, ".."))) # only run autogen.sh in the directory it is located and use cwd to achieve that in order to not mess up things
+ __check_call__([bash, configure_path
+ #"../configure"
+ ]+configure_args+["--prefix=%s" % (os.path.realpath("%s/install/%s" % (DEPS_DIR, arg1)),)], cwd=cwd)
+
+def run_cmake(arg1, cmake_args, cmake_dir=None, cwd=None):
+ if cmake_dir is None:
+ P=".."
+ else:
+ P=cmake_dir
+ cmake_path= os.path.join(DEPS_DIR, "install", "cmake-%s" % (CMAKE_VERSION,), "bin", "cmake")
+ __check_call__([cmake_path, P]+cmake_args+["-DCMAKE_BUILD_TYPE=%s" % (BUILD_TYPE,)], cwd=cwd)
+
+def run_icu(arg1, icu_args, cwd):
+ PLATFORM=get_os()
+ if PLATFORM == "Darwin":
+ PLATFORM="MacOSX"
+ __check_call__([bash, "../source/runConfigureICU", PLATFORM]+icu_args+["--prefix=%s/install/%s" % (DEPS_DIR, arg1)], cwd=cwd)
+
+def git_clone(clone_url, target_dir, revision=None):
+ """Lazily clones the `git` repository denoted by `clone_url` into
+ `target_dir`, i.e. skips cloning if `target_dir` exists (naively assumes
+ that a working clone exists there) and optionally checks out a revision
+ `revision` after cloning or in the existing clone if `revision` is not
+ `None`."""
+ if not os.path.exists(target_dir):
+ logger.info("cloning '%s' into '%s'" % (clone_url, target_dir))
+ __check_call__([git, "clone", clone_url, target_dir])
+ else:
+ logger.info("directory '%s' exists, skipping cloning" % (target_dir,))
+ if revision != None:
+ __check_call__([git, "checkout", revision], cwd=target_dir)
+
+def build_dependency(name, mode, build_tool_args, download_url, download_name, download_tool=download_tool_default, revision=None):
+ """Handles building of dependencies with different tools (which are
+ distinguished with the `mode` argument. `build_tool_args` is expected to be
+ a list which is necessary in order to not mess up quoting of compiler and
+ linker flags."""
+ check_dir = os.path.join(DEPS_DIR, "install", name)
+ if os.path.exists(check_dir):
+ logger.info( "Found existing %s, skipping" % (name,))
+ return
+ build_dir = os.path.join(DEPS_DIR, "build")
+ if not os.path.exists(build_dir):
+ os.makedirs(build_dir)
+
+ logger.info("\rFetching %s... " % (name,))
+ if download_tool == download_tool_curl:
+ download_path = os.path.join(build_dir, download_name)
+ if not os.path.exists(download_path):
+ __check_call__(CURL+[download_url, download_name], cwd=build_dir)
+ else:
+ logger.info("Download '%s' already exists, assuming it's an undamaged download and that it has been extracted if possible, skipping" % (download_path,))
+ elif download_tool == download_tool_wget:
+ download_path = os.path.join(build_dir, download_name)
+ if not os.path.exists(download_path):
+ __check_call__(WGET+[os.path.join(download_url, download_name)], cwd=build_dir)
+ else:
+ logger.info("Download '%s' already exists, assuming it's an undamaged download and that it has been extracted if possible, skipping" % (download_path,))
+ elif download_tool == download_tool_git:
+ git_clone(download_url, target_dir=os.path.join(build_dir, download_name), revision=revision)
+ else:
+ raise ValueError("download tool '%s' is not supported" % (download_tool,))
+ download_dir = os.path.join(build_dir, download_name)
+ if os.path.isdir(download_dir):
+ extract_dir_name=download_name
+ extract_dir = os.path.join(build_dir, extract_dir_name)
+ else:
+ download_tarfile_path = os.path.join(build_dir, download_name)
+ if download_name.endswith(".tar.gz") or download_name.endswith(".tgz"):
+ compr = "gz"
+ elif download_name.endswith(".tar.bz2"):
+ compr = "bz2"
+ else:
+ raise RuntimeError("fix source for new download type")
+ download_tarfile = tarfile.open(name=download_tarfile_path, mode="r:%s" % (compr,))
+ extract_dir_name= os.path.commonprefix(download_tarfile.getnames()) # tarfile seriously doesn't have a function to retrieve the root directory more easily
+ #__check_output__([tar, "--exclude=\"*/*\"", "-tf", download_name], cwd=build_dir).strip() no longer works
+ if extract_dir_name is None:
+ extract_dir_name= __check_output__([bash, "-c", "tar -tf %s 2> /dev/null | head -n 1 | cut -f1 -d /" % (download_name,)], cwd=build_dir)
+ extract_dir = os.path.join(build_dir, extract_dir_name)
+ if not os.path.exists(extract_dir):
+ __check_call__([tar, "-xf", download_name], cwd=build_dir)
+
+ if mode != "bjam":
+ extract_build_dir = os.path.join(extract_dir, "build")
+ if os.path.exists(extract_build_dir):
+ shutil.rmtree(extract_build_dir)
+ os.makedirs(extract_build_dir)
+
+ logger.info("\rConfiguring %s..." % (name,))
+ if mode == "icu":
+ run_icu(name, build_tool_args, cwd=extract_build_dir)
+ elif mode == "autoconf":
+ run_autoconf(name, build_tool_args, cwd=extract_build_dir)
+ elif mode == "cmake":
+ run_cmake(name, build_tool_args, cwd=extract_build_dir)
+ else:
+ raise ValueError()
+ logger.info("\rBuilding %s... " % (name,))
+ __check_call__([make, "-j%s" % (IFCOS_NUM_BUILD_PROCS,)], cwd=extract_build_dir)
+ logger.info( "\rInstalling %s... " % (name,))
+ __check_call__([make, "install"], cwd=extract_build_dir)
+ logger.info( "\rInstalled %s \n" % (name,))
+ else:
+ logger.info( "\rConfiguring %s..." % (name,))
+ __check_call__([bash, "./bootstrap.sh"], cwd=extract_dir)
+ logger.info("\rBuilding %s... " % (name,))
+ __check_call__(["./b2", "-j%s" % (IFCOS_NUM_BUILD_PROCS,)]+build_tool_args, cwd=extract_dir)
+ logger.info("\rInstalling %s... " % (name,))
+ shutil.copy(os.path.join(extract_dir, "boost"), os.path.join(DEPS_DIR, "install", "boost-%s" % (BOOST_VERSION,)))
+ logger.info("\rInstalled %s \n" % (name,))
+
+cecho("Collecting dependencies:", GREEN)
+
+# Set compiler flags for 32bit builds on 64bit system
+# TODO: This is untested
+
+ADDITIONAL_ARGS=[]
+BOOST_ADDRESS_MODEL=[]
+if TARGET_ARCH == "i686" and __check_output__([uname, "-m"]).strip() == "x86_64":
+ ADDITIONAL_ARGS=["-m32", "-arch i386"]
+ BOOST_ADDRESS_MODEL=["architecture=x86", "address-model=32"]
+
+if get_os() == "Darwin":
+ ADDITIONAL_ARGS=["-mmacosx-version-min=10.6"]+ADDITIONAL_ARGS
+
+# If the linker supports GC sections, set it up to reduce binary file size
+# -fPIC is required for the shared libraries to work
+
+try:
+ CXXFLAGS=os.environ["CXXFLAGS"]
+except KeyError:
+ CXXFLAGS=""
+try:
+ CFLAGS=os.environ["CFLAGS"]
+except KeyError:
+ CFLAGS=""
+try:
+ LDFLAGS=os.environ["LDFLAGS"]
+except KeyError:
+ LDFLAGS=""
+if sp.call([bash, "-c", "man ld 2> /dev/null | grep gc-sections &> /dev/null"]) == 0:
+ CXXFLAGS_MINIMAL="%s -fPIC %s" % (CXXFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CXXFLAGS_MINIMAL"]=CXXFLAGS_MINIMAL
+ CFLAGS_MINIMAL="%s -fPIC %s" % (CFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CFLAGS_MINIMAL"]=CFLAGS_MINIMAL
+ CXXFLAGS="%s -fPIC -fdata-sections -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden %s" % (CXXFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CXXFLAGS"]=CXXFLAGS
+ CFLAGS="%s -fPIC -fdata-sections -ffunction-sections -fvisibility=hidden %s"% (CFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CFLAGS"]=CFLAGS
+ LDFLAGS="%s -Wl,--gc-sections %s" % (LDFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["LDFLAGS"]=LDFLAGS
+else:
+ CXXFLAGS_MINIMAL="%s -fPIC %s" % (CXXFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CXXFLAGS_MINIMAL"]=CXXFLAGS_MINIMAL
+ CFLAGS_MINIMAL="%s -fPIC %s" % (CFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CFLAGS_MINIMAL"]=CFLAGS_MINIMAL
+ CXXFLAGS="%s -fPIC -fvisibility=hidden -fvisibility-inlines-hidden %s" % (CXXFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CXXFLAGS"]=CXXFLAGS
+ CFLAGS="%s -fPIC -fvisibility=hidden -fvisibility-inlines-hidden %s" % (CFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["CFLAGS"]=CFLAGS
+ LDFLAGS="%s %s" % (LDFLAGS, str.join(" ", ADDITIONAL_ARGS))
+ os.environ["LDFLAGS"]=LDFLAGS
+
+# Some dependencies need a more recent CMake version than most distros provide
+build_dependency(name="cmake-%s" % (CMAKE_VERSION,), mode="autoconf", build_tool_args=[], download_url="https://cmake.org/files/v%s" % (CMAKE_VERSION_2,), download_name="cmake-%s.tar.gz" % (CMAKE_VERSION,))
+
+# Extract compiler flags from CMake to harmonize settings with other autoconf dependencies
+CMAKE_FLAG_EXTRACT_DIR="ifcopenshell_cmake_test_%s" % (time.time(),)
+# was sp.check_output([bash, "-c", "cat /dev/urandom | env LC_CTYPE=C tr -dc 'a-zA-Z0-9' | head -c 32"]), in bash script, unclear what the exact required format is and whether it's needed
+if os.path.exists(CMAKE_FLAG_EXTRACT_DIR):
+ shutil.rmtree(CMAKE_FLAG_EXTRACT_DIR)
+os.makedirs(CMAKE_FLAG_EXTRACT_DIR)
+BUILD_CFG_UPPER=BUILD_CFG.upper()
+for FL in ["C", "CXX"]:
+ __check_call__([bash, "-c", """echo "
+ message(\"\${CMAKE_%s_FLAGS_%s}\")
+ " > CMakeLists.txt""" % (FL, BUILD_CFG_UPPER)], cwd=CMAKE_FLAG_EXTRACT_DIR)
+ FL="%sFLAGS" % (FL,)
+ FLM="%sFLAGS_MINIMAL" % (FL,)
+# @TODO: bash code unclear
+# exec("%sFLAGS=%s" % (FL, sp.check_output([os.path.join(DEPS_DIR, "install", "cmake-%s" % (CMAKE_VERSION,), "bin", "cmake"), "."
+# declare ${FL}FLAGS_MINIMAL="`$DEPS_DIR/install/cmake-$CMAKE_VERSION/bin/cmake . 2>&1 >/dev/null` ${!FLM}"
+shutil.rmtree(CMAKE_FLAG_EXTRACT_DIR)
+
+build_dependency(name="pcre-%s" % (PCRE_VERSION,), mode="autoconf", build_tool_args=["--disable-shared"], download_url="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/", download_name="pcre-%s.tar.bz2" % (PCRE_VERSION,))
+
+# An issue exists with swig-1.3 and python >= 3.2
+# Therefore, build a recent copy from source
+build_dependency(name="swig", mode="autoconf", build_tool_args=["--with-pcre-prefix=%s/install/pcre-%s" % (DEPS_DIR, PCRE_VERSION)], download_url="https://github.com/swig/swig.git", download_name="swig", download_tool=download_tool_git, revision="rel-3.0.8")
+
+build_dependency(name="oce-%s" % (OCE_VERSION,), mode="cmake", build_tool_args=["-DOCE_DISABLE_TKSERVICE_FONT=ON", "-DOCE_TESTING=OFF", "-DOCE_BUILD_SHARED_LIB=OFF", "-DOCE_DISABLE_X11=ON", "-DOCE_VISUALISATION=OFF", "-DOCE_OCAF=OFF", "-DOCE_INSTALL_PREFIX=%s/install/oce-%s" % (DEPS_DIR, OCE_VERSION)], download_url="https://github.com/tpaviot/oce/archive/", download_name="OCE-%s.tar.gz" % (OCE_VERSION,))
+build_dependency("libxml2-%s" % (LIBXML_VERSION,), "autoconf", build_tool_args=["--without-python", "--disable-shared", "--without-zlib", "--without-iconv", "--without-lzma"], download_url="ftp://xmlsoft.org/libxml2/", download_name="libxml2-%s.tar.gz" % (LIBXML_VERSION,))
+build_dependency("OpenCOLLADA", "cmake", build_tool_args=["-DLIBXML2_INCLUDE_DIR=%s/install/libxml2-%s/include/libxml2" % (DEPS_DIR, LIBXML_VERSION), "-DLIBXML2_LIBRARIES=%s/install/libxml2-%s/lib/libxml2.a" % (DEPS_DIR, LIBXML_VERSION), "-DPCRE_INCLUDE_DIR=%s/install/pcre-%s/include" % (DEPS_DIR, PCRE_VERSION), "-DPCRE_PCREPOSIX_LIBRARY=%s/install/pcre-%s/lib/libpcreposix.a" % (DEPS_DIR, PCRE_VERSION), "-DPCRE_PCRE_LIBRARY=%s/install/pcre-%s/lib/libpcre.a" % (DEPS_DIR, PCRE_VERSION), "-DCMAKE_INSTALL_PREFIX=%s/install/OpenCOLLADA/" % (DEPS_DIR,)], download_url="https://github.com/KhronosGroup/OpenCOLLADA.git", download_name="OpenCOLLADA", download_tool=download_tool_git, revision=OPENCOLLADA_COMMIT)
+
+# Python should not be built with -fvisibility=hidden, from experience that introduces segfaults
+
+OLD_CXX_FLAGS=os.environ["CXXFLAGS"]
+OLD_C_FLAGS=os.environ["CFLAGS"]
+os.environ["CXXFLAGS"]=CXXFLAGS_MINIMAL
+os.environ["CFLAGS"]=CFLAGS_MINIMAL
+
+# On OSX a dynamic python library is built or it would not be compatible
+# with the system python because of some threading initialization
+PYTHON_CONFIGURE_ARGS=[]
+if get_os() == "Darwin":
+ PYTHON_CONFIGURE_ARGS=["--disable-static", "--enable-shared"]
+
+for PYTHON_VERSION in PYTHON_VERSIONS:
+ build_dependency("python-%s" % (PYTHON_VERSION,), "autoconf", PYTHON_CONFIGURE_ARGS, "http://www.python.org/ftp/python/%s/" % (PYTHON_VERSION,), "Python-%s.tgz" % (PYTHON_VERSION,))
+
+os.environ["CXXFLAGS"]=OLD_CXX_FLAGS
+os.environ["CFLAGS"]=OLD_C_FLAGS
+
+build_dependency("boost-%s" % (BOOST_VERSION,), mode="bjam", build_tool_args=["--stagedir=%s/install/boost-%s" % (DEPS_DIR, BOOST_VERSION), "--with-system", "--with-program_options", "--with-regex", "--with-thread", "--with-date_time", "link=static"]+BOOST_ADDRESS_MODEL+["cxxflags=\"%s\"" % (CXXFLAGS,), "linkflags=\"%s\"" % (LDFLAGS,), "stage"], download_url="http://downloads.sourceforge.net/project/boost/boost/%s/" % (BOOST_VERSION,), download_name="boost_%s.tar.bz2" % (BOOST_VERSION_UNDERSCORE,))
+
+build_dependency(name="icu-%s" % (ICU_VERSION,), mode="icu", build_tool_args=["--enable-static", "--disable-shared"], download_url="http://download.icu-project.org/files/icu4c/%s/" % (ICU_VERSION,), download_name="icu4c-%s-src.tgz" % (ICU_VERSION_UNDERSCORE,))
+
+cecho("Building IfcOpenShell:", GREEN)
+
+IFCOS_DIR=os.path.join(DEPS_DIR, "build", "ifcopenshell")
+if os.path.exists(IFCOS_DIR):
+ shutil.rmtree(IFCOS_DIR)
+os.makedirs(IFCOS_DIR)
+
+executables_dir = os.path.join(IFCOS_DIR, "executables")
+if not os.path.exists(executables_dir):
+ os.makedirs(executables_dir)
+
+logger.info("\rConfiguring executables...")
+
+run_cmake("", cmake_args=["-DBOOST_ROOT=%s/install/boost-%s" % (DEPS_DIR, BOOST_VERSION), "-DOCC_INCLUDE_DIR=%s/install/oce-%s/include/oce" % (DEPS_DIR, OCE_VERSION), "-DOCC_LIBRARY_DIR=%s/install/oce-%s/lib" % (DEPS_DIR, OCE_VERSION), "-DOPENCOLLADA_INCLUDE_DIR=%s/install/OpenCOLLADA/include/opencollada" % (DEPS_DIR,), "-DOPENCOLLADA_LIBRARY_DIR=%s/install/OpenCOLLADA/lib/opencollada" % (DEPS_DIR,), "-DICU_INCLUDE_DIR=%s/install/icu-%s/include" % (DEPS_DIR, ICU_VERSION), "-DICU_LIBRARY_DIR=%s/install/icu-%s/lib" % (DEPS_DIR, ICU_VERSION), "-DPCRE_LIBRARY_DIR=%s/install/pcre-%s/lib" % (DEPS_DIR, PCRE_VERSION), "-DBUILD_IFCPYTHON=OFF"], cmake_dir=CMAKE_DIR, cwd=executables_dir)
+
+logger.info("\rBuilding executables... ")
+
+__check_call__([make, "-j%s" % (IFCOS_NUM_BUILD_PROCS,)], cwd=CMAKE_DIR)
+
+if get_os() == "Darwin":
+ STRIP_OPTION="-x"
+else:
+ STRIP_OPTION="-s"
+
+__check_call__([strip, STRIP_OPTION, "IfcConvert", "IfcGeomServer"], cwd=CMAKE_DIR)
+
+# On OSX the actual Python library is not linked against.
+ADDITIONAL_ARGS=""
+if get_os() == "Darwin":
+ ADDITIONAL_ARGS="-Wl,-flat_namespace,-undefined,suppress"
+
+os.environ["CXXFLAGS"]="%s %s" % (CXXFLAGS_MINIMAL, ADDITIONAL_ARGS)
+os.environ["CFLAGS"]="%s %s" % (CFLAGS_MINIMAL, ADDITIONAL_ARGS)
+os.environ["LDFLAGS"]="%s %s" % (LDFLAGS, ADDITIONAL_ARGS)
+
+for PYTHON_VERSION in PYTHON_VERSIONS:
+ logger.info("\rConfiguring python %s wrapper..." % (PYTHON_VERSION,))
+
+ python_dir = os.path.join(IFCOS_DIR, "python-%s" % (PYTHON_VERSION,))
+ if not os.path.exists(python_dir):
+ os.makedirs(python_dir)
+
+ PYTHON_LIBRARY=__check_output__([bash, "-c", "ls %s/install/python-%s/lib/libpython*.*" % (DEPS_DIR, PYTHON_VERSION)], cwd=None).strip()
+ PYTHON_INCLUDE=__check_output__([bash, "-c", "ls -d %s/install/python-%s/include/python*" % (DEPS_DIR, PYTHON_VERSION)], cwd=None).strip()
+ PYTHON_EXECUTABLE=os.path.join(DEPS_DIR, "install", "python-%s" % (PYTHON_VERSION,), "bin", "python")
+ os.environ["PYTHON_LIBRARY_BASENAME"]=os.path.basename(PYTHON_LIBRARY)
+
+ run_cmake("", cmake_args=["-DBOOST_ROOT=%s/install/boost-%s" % (DEPS_DIR, BOOST_VERSION),
+ "-DOCC_INCLUDE_DIR=%s/install/oce-%s/include/oce" % (DEPS_DIR, OCE_VERSION),
+ "-DOCC_LIBRARY_DIR=%s/install/oce-%s/lib" % (DEPS_DIR, OCE_VERSION),
+ "-DOPENCOLLADA_INCLUDE_DIR=%s/install/OpenCOLLADA/include/opencollada" % (DEPS_DIR,),
+ "-DOPENCOLLADA_LIBRARY_DIR=%s/install/OpenCOLLADA/lib/opencollada" % (DEPS_DIR,),
+ "-DICU_INCLUDE_DIR=%s/install/icu-%s/include" % (DEPS_DIR, ICU_VERSION),
+ "-DICU_LIBRARY_DIR=%s/install/icu-%s/lib" % (DEPS_DIR, ICU_VERSION),
+ "-DPYTHON_LIBRARY=%s" % (PYTHON_LIBRARY,),
+ "-DPYTHON_EXECUTABLE=%s" % (PYTHON_EXECUTABLE,),
+ "-DPYTHON_INCLUDE_DIR=%s" % (PYTHON_INCLUDE,),
+ "-DSWIG_EXECUTABLE=%s/install/swig/bin/swig" % (DEPS_DIR,),
+ "-DCOLLADA_SUPPORT=OFF"], cmake_dir=CMAKE_DIR, cwd=python_dir)
+
+ logger.info("\rBuilding python %s wrapper... " % (PYTHON_VERSION,))
+
+ __check_call__([make, "-j%s" % (IFCOS_NUM_BUILD_PROCS,), "_ifcopenshell_wrapper"], cwd=CMAKE_DIR)
+
+ if get_os() != "Darwin":
+ # TODO: This symbol name depends on the Python version?
+ __check_call__([strip, "-s", "-K", "PyInit__ifcopenshell_wrapper", "ifcwrap/_ifcopenshell_wrapper.so"])
+
+logger.info("\rBuilt IfcOpenShell...\n\n")
diff --git a/nix/build-all.sh b/nix/build-all.sh
deleted file mode 100755
index 90a6345f4c..0000000000
--- a/nix/build-all.sh
+++ /dev/null
@@ -1,403 +0,0 @@
-###############################################################################
-# #
-# 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 script builds IfcOpenShell and its dependencies #
-# #
-# Prerequisites for this script to function correctly: #
-# * git * bzip2 * tar * c(++) compilers * yacc * autoconf #
-# on debian 7.8 these can be obtained with: #
-# $ apt-get install git gcc g++ autoconf bison bzip2 #
-# on ubuntu 14.04: #
-# $ apt-get install git gcc g++ autoconf bison make #
-# on OS X El Capitan with homebrew: #
-# $ brew install git bison autoconf automake #
-# #
-###############################################################################
-
-set -e
-
-PROJECT_NAME=IfcOpenShell
-OCE_VERSION=0.16
-PYTHON_VERSIONS=(2.7.10 3.2.6 3.3.6 3.4.4 3.5.1)
-BOOST_VERSION=1.59.0
-PCRE_VERSION=8.38
-LIBXML_VERSION=2.9.3
-CMAKE_VERSION=3.4.1
-ICU_VERSION=56.1
-
-# Helper function for coloured printing
-
-BLACK_ON_WHITE="\033[0;30;107m"
-RED="\033[31m"
-GREEN="\033[32m"
-YELLOW="\033[33m"
-MAGENTA="\033[35m"
-function cecho {
- printf "$1$2\033[0m\n"
-}
-
-function fullpath {
- python -c "import os, sys; print os.path.realpath(os.path.dirname(sys.argv[1]))" "$1"
-}
-
-# Set defaults for missing empty environment variables
-
-if [ -z "$IFCOS_NUM_BUILD_PROCS" ]; then
-IFCOS_NUM_BUILD_PROCS=$(expr $(sysctl -n hw.ncpu 2> /dev/null || cat /proc/cpuinfo | grep processor | wc -l) + 1)
-fi
-
-if [ -z "$TARGET_ARCH" ]; then
-TARGET_ARCH="$(uname -m)"
-fi
-
-SCRIPT_DIR=`fullpath "$0"`
-CMAKE_DIR="$SCRIPT_DIR/../cmake/"
-
-if [ -z "$DEPS_DIR" ]; then
-DEPS_DIR="$SCRIPT_DIR/../build/$(uname)/$TARGET_ARCH/"
-[ -d $DEPS_DIR ] || mkdir -p $DEPS_DIR
-DEPS_DIR=`fullpath $DEPS_DIR`
-fi
-
-if [ -z "$BUILD_CFG" ]; then
-BUILD_CFG="RelWithDebInfo"
-fi
-
-if [ -z "$BUILD_TYPE" ]; then
-BUILD_TYPE=Build
-fi
-
-# Print build configuration information
-
-cecho $BLACK_ON_WHITE "This script fetches and builds $PROJECT_NAME and its dependencies"
-echo ""
-cecho $GREEN "Script configuration:"
-
-cecho $MAGENTA "* Target Architecture = $TARGET_ARCH"
-echo " - Whether 32-bit (i686) or 64-bit (x86_64) will be built."
-cecho $MAGENTA "* Dependency Directory = $DEPS_DIR"
-echo " - The directory where $PROJECT_NAME dependencies are installed."
-cecho $MAGENTA "* Build Config Type = $BUILD_CFG"
-echo " - The used build configuration type for the dependencies."
-echo " Defaults to RelWithDebInfo if not specified."
-
-if [ "$BUILD_CFG" = "MinSizeRel" ]; then
-cecho $RED " WARNING: MinSizeRel build can suffer from a significant performance loss."
-fi
-
-cecho $MAGENTA "* IFCOS_NUM_BUILD_PROCS = $IFCOS_NUM_BUILD_PROCS"
-echo " - How many compiler processes may be run in parallel."
-
-echo ""
-
-# Check that required tools are in PATH
-
-for cmd in git bunzip2 tar cc c++ autoconf automake yacc make
-do
- which $cmd > /dev/null || { cecho $RED "Required tool '$cmd' not installed or not added to PATH" ; exit 1 ; }
-done
-
-which curl > /dev/null && DOWNLOAD="curl -sLO"
-which wget > /dev/null && DOWNLOAD="wget -q --no-check-certificate"
-
-if [ -z "$DOWNLOAD" ]; then
- cecho $RED "No download application found, tried: curl, wget"
- exit 1
-fi
-
-# Create log directory and file
-
-mkdir -p $DEPS_DIR/logs
-LOG_FILE=$DEPS_DIR/logs/`date +"%Y%m%d"`.log
-
-BOOST_VERSION_UNDERSCORE=${BOOST_VERSION//./_}
-ICU_VERSION_UNDERSCORE=${ICU_VERSION//./_}
-CMAKE_VERSION_2=${CMAKE_VERSION:0:3}
-
-OCE_LOCATION=https://github.com/tpaviot/oce/archive/OCE-$OCE_VERSION.tar.gz
-BOOST_LOCATION=http://downloads.sourceforge.net/project/boost/boost/$BOOST_VERSION/boost_$BOOST_VERSION_UNDERSCORE.tar.bz2
-OPENCOLLADA_LOCATION=https://github.com/KhronosGroup/OpenCOLLADA.git
-OPENCOLLADA_COMMIT=f99d59e73e565a41715eaebc00c7664e1ee5e628
-
-# Helper functions
-
-function download {
- [ -f $2 ] || $DOWNLOAD $1$2
-}
-
-function run_autoconf {
- if [ ! -f ../configure ]; then
- pushd . >>$LOG_FILE 2>&1
- cd ..
- ./autogen.sh >>$LOG_FILE 2>&1
- popd >>$LOG_FILE 2>&1
- fi
- ../configure $2 --prefix=$DEPS_DIR/install/$1 >>$LOG_FILE 2>&1
-}
-
-function run_cmake {
- if [ -z "$3" ]; then
- P=..
- else
- P=$3
- fi
- $DEPS_DIR/install/cmake-$CMAKE_VERSION/bin/cmake $P $2 -DCMAKE_BUILD_TYPE=$BUILD_TYPE >>$LOG_FILE 2>&1
-}
-
-function run_icu {
- PLATFORM=`uname -s`
- if [ $PLATFORM == "Darwin" ]; then
- PLATFORM=MacOSX
- fi
- ../source/runConfigureICU $PLATFORM $2 --prefix=$DEPS_DIR/install/$1 >>$LOG_FILE 2>&1
-}
-
-function git_clone {
- [ -d $2 ] || git clone $1 >>$LOG_FILE 2>&1
- if [ ! -z "$3" ]; then
- cd $2
- git checkout $3 >>$LOG_FILE 2>&1
- cd ..
- fi
-}
-
-function build_dependency {
- if [ -e $DEPS_DIR/install/$1 ]; then
- echo "Found existing $1"
- return
- fi
- mkdir -p $DEPS_DIR/build/
- cd $DEPS_DIR/build/
- printf "\rFetching $1... "
- $6 $4 $5 $7
- if [ -d $5 ]; then
- DEP_NAME=$5
- else
- DEP_NAME=`tar --exclude="*/*" -tf $5`
- [ -z $DEP_NAME ] && DEP_NAME=`tar -tf $5 2> /dev/null | head -n 1 | cut -f1 -d /`
- [ -d $DEP_NAME ] || tar -xf $5
- fi
- cd $DEP_NAME
- if [ "$2" != "bjam" ]; then
- [ -d build ] && rm -rf build
- mkdir build
- cd build
- printf "\rConfiguring $1..."
- run_$2 $1 "$3"
- printf "\rBuilding $1... "
- make -j$IFCOS_NUM_BUILD_PROCS >>$LOG_FILE 2>&1
- printf "\rInstalling $1... "
- make install >>$LOG_FILE 2>&1
- printf "\rInstalled $1 \n"
- else
- printf "\rConfiguring $1..."
- ./bootstrap.sh >>$LOG_FILE 2>&1
- printf "\rBuilding $1... "
- eval ./b2 $3 >>$LOG_FILE 2>&1
- printf "\rInstalling $1... "
- cp -R boost $DEPS_DIR/install/boost-$BOOST_VERSION/ >>$LOG_FILE 2>&1
- printf "\rInstalled $1 \n"
- fi
-}
-
-cecho $GREEN "Collecting dependencies:"
-
-# Set compiler flags for 32bit builds on 64bit system
-# TODO: This is untested
-
-if [ "$TARGET_ARCH" == "i686" ] && [ "$(uname -m)" == "x86_64" ]; then
-ADDITIONAL_ARGS="-m32 -arch i386"
-BOOST_ADDRESS_MODEL="architecture=x86 address-model=32"
-fi
-
-if [ "$(uname)" == "Darwin" ]; then
-ADDITIONAL_ARGS="-mmacosx-version-min=10.6 $ADDITIONAL_ARGS"
-fi
-
-# If the linker supports GC sections, set it up to reduce binary file size
-# -fPIC is required for the shared libraries to work
-
-if man ld 2> /dev/null | grep gc-sections &> /dev/null; then
-export CXXFLAGS_MINIMAL="$CXXFLAGS -fPIC $ADDITIONAL_ARGS"
-export CFLAGS_MINIMAL="$CFLAGS -fPIC $ADDITIONAL_ARGS"
-export CXXFLAGS="$CXXFLAGS -fPIC -fdata-sections -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden $ADDITIONAL_ARGS"
-export CFLAGS="$CFLAGS -fPIC -fdata-sections -ffunction-sections -fvisibility=hidden $ADDITIONAL_ARGS"
-export LDFLAGS="$LDFLAGS -Wl,--gc-sections $ADDITIONAL_ARGS"
-else
-export CXXFLAGS_MINIMAL="$CXXFLAGS -fPIC $ADDITIONAL_ARGS"
-export CFLAGS_MINIMAL="$CFLAGS -fPIC $ADDITIONAL_ARGS"
-export CXXFLAGS="$CXXFLAGS -fPIC -fvisibility=hidden -fvisibility-inlines-hidden $ADDITIONAL_ARGS"
-export CFLAGS="$CFLAGS -fPIC -fvisibility=hidden -fvisibility-inlines-hidden $ADDITIONAL_ARGS"
-export LDFLAGS="$LDFLAGS $ADDITIONAL_ARGS"
-fi
-
-# Some dependencies need a more recent CMake version than most distros provide
-build_dependency cmake-$CMAKE_VERSION autoconf "" https://cmake.org/files/v$CMAKE_VERSION_2/ cmake-$CMAKE_VERSION.tar.gz download
-
-# Extract compiler flags from CMake to harmonize settings with other autoconf dependencies
-CMAKE_FLAG_EXTRACT_DIR=ifcopenshell_cmake_test_`cat /dev/urandom | env LC_CTYPE=C tr -dc 'a-zA-Z0-9' | head -c 32`
-[ -e $CMAKE_FLAG_EXTRACT_DIR ] && rm -rf $CMAKE_FLAG_EXTRACT_DIR
-mkdir $CMAKE_FLAG_EXTRACT_DIR
-cd $CMAKE_FLAG_EXTRACT_DIR
-BUILD_CFG_UPPER=`echo $BUILD_CFG | awk '{print toupper($0)}'`
-for FL in C CXX; do
- echo "
- message(\"\${CMAKE_${FL}_FLAGS_${BUILD_CFG_UPPER}}\")
- " > CMakeLists.txt
- FL=${FL}FLAGS
- FLM=${FL}FLAGS_MINIMAL
- declare ${FL}FLAGS="`$DEPS_DIR/install/cmake-$CMAKE_VERSION/bin/cmake . 2>&1 >/dev/null` ${!FL}"
- declare ${FL}FLAGS_MINIMAL="`$DEPS_DIR/install/cmake-$CMAKE_VERSION/bin/cmake . 2>&1 >/dev/null` ${!FLM}"
-done
-cd ..
-rm -rf $CMAKE_FLAG_EXTRACT_DIR
-
-build_dependency pcre-$PCRE_VERSION autoconf "--disable-shared" ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ pcre-$PCRE_VERSION.tar.bz2 download
-
-# An issue exists with swig-1.3 and python >= 3.2
-# Therefore, build a recent copy from source
-build_dependency swig autoconf "--with-pcre-prefix=$DEPS_DIR/install/pcre-$PCRE_VERSION" https://github.com/swig/swig.git swig git_clone rel-3.0.8
-
-build_dependency oce-$OCE_VERSION cmake "-DOCE_DISABLE_TKSERVICE_FONT=ON -DOCE_TESTING=OFF -DOCE_BUILD_SHARED_LIB=OFF -DOCE_DISABLE_X11=ON -DOCE_VISUALISATION=OFF -DOCE_OCAF=OFF -DOCE_INSTALL_PREFIX=$DEPS_DIR/install/oce-$OCE_VERSION/" https://github.com/tpaviot/oce/archive/ OCE-$OCE_VERSION.tar.gz download
-build_dependency libxml2-$LIBXML_VERSION autoconf "--without-python --disable-shared --without-zlib --without-iconv --without-lzma" ftp://xmlsoft.org/libxml2/ libxml2-$LIBXML_VERSION.tar.gz download
-build_dependency OpenCOLLADA cmake "
--DLIBXML2_INCLUDE_DIR=$DEPS_DIR/install/libxml2-$LIBXML_VERSION/include/libxml2
--DLIBXML2_LIBRARIES=$DEPS_DIR/install/libxml2-$LIBXML_VERSION/lib/libxml2.a
--DPCRE_INCLUDE_DIR=$DEPS_DIR/install/pcre-$PCRE_VERSION/include
--DPCRE_PCREPOSIX_LIBRARY=$DEPS_DIR/install/pcre-$PCRE_VERSION/lib/libpcreposix.a
--DPCRE_PCRE_LIBRARY=$DEPS_DIR/install/pcre-$PCRE_VERSION/lib/libpcre.a
--DCMAKE_INSTALL_PREFIX=$DEPS_DIR/install/OpenCOLLADA/" https://github.com/KhronosGroup/OpenCOLLADA.git OpenCOLLADA git_clone $OPENCOLLADA_COMMIT
-
-# Python should not be built with -fvisibility=hidden, from experience that introduces segfaults
-
-OLD_CXX_FLAGS=$CXXFLAGS
-OLD_C_FLAGS=$CFLAGS
-export CXXFLAGS=$CXXFLAGS_MINIMAL
-export CFLAGS=$CFLAGS_MINIMAL
-
-# On OSX a dynamic python library is built or it would not be compatible
-# with the system python because of some threading initialization
-if [ "$(uname)" == "Darwin" ]; then
-PYTHON_CONFIGURE_ARGS="--disable-static --enable-shared"
-fi
-
-for PYTHON_VERSION in "${PYTHON_VERSIONS[@]}"; do
- build_dependency python-$PYTHON_VERSION autoconf "$PYTHON_CONFIGURE_ARGS" http://www.python.org/ftp/python/$PYTHON_VERSION/ Python-$PYTHON_VERSION.tgz download
-done
-
-export CXXFLAGS=$OLD_CXX_FLAGS
-export CFLAGS=$OLD_C_FLAGS
-
-build_dependency boost-$BOOST_VERSION bjam "--stagedir=$DEPS_DIR/install/boost-$BOOST_VERSION --with-system --with-program_options --with-regex --with-thread --with-date_time link=static $BOOST_ADDRESS_MODEL cxxflags=\"$CXXFLAGS\" linkflags=\"$LDFLAGS\" stage" http://downloads.sourceforge.net/project/boost/boost/$BOOST_VERSION/ boost_$BOOST_VERSION_UNDERSCORE.tar.bz2 download
-
-build_dependency icu-$ICU_VERSION icu "--enable-static --disable-shared" http://download.icu-project.org/files/icu4c/$ICU_VERSION/ icu4c-${ICU_VERSION_UNDERSCORE}-src.tgz download
-
-cecho $GREEN "Building IfcOpenShell:"
-
-IFCOS_DIR=$DEPS_DIR/build/ifcopenshell
-[ -d $IFCOS_DIR ] && rm -rf $IFCOS_DIR
-mkdir -p $IFCOS_DIR
-cd $IFCOS_DIR
-
-mkdir -p executables
-cd executables
-
-printf "\rConfiguring executables..."
-
-run_cmake "" "
--DBOOST_ROOT=$DEPS_DIR/install/boost-$BOOST_VERSION
--DOCC_INCLUDE_DIR=$DEPS_DIR/install/oce-$OCE_VERSION/include/oce
--DOCC_LIBRARY_DIR=$DEPS_DIR/install/oce-$OCE_VERSION/lib
--DOPENCOLLADA_INCLUDE_DIR=$DEPS_DIR/install/OpenCOLLADA/include/opencollada
--DOPENCOLLADA_LIBRARY_DIR=$DEPS_DIR/install/OpenCOLLADA/lib/opencollada
--DICU_INCLUDE_DIR=$DEPS_DIR/install/icu-$ICU_VERSION/include
--DICU_LIBRARY_DIR=$DEPS_DIR/install/icu-$ICU_VERSION/lib
--DPCRE_LIBRARY_DIR=$DEPS_DIR/install/pcre-$PCRE_VERSION/lib
--DBUILD_IFCPYTHON=OFF
-" $CMAKE_DIR
-
-printf "\rBuilding executables... "
-
-make -j$IFCOS_NUM_BUILD_PROCS >>$LOG_FILE 2>&1
-
-if [ "$(uname)" == "Darwin" ]; then
- STRIP_OPTION=-x
-else
- STRIP_OPTION=-s
-fi
-
-strip $STRIP_OPTION IfcConvert IfcGeomServer
-
-cd ..
-
-# On OSX the actual Python library is not linked against.
-ADDITIONAL_ARGS=
-if [ "$(uname)" == "Darwin" ]; then
-ADDITIONAL_ARGS="-Wl,-flat_namespace,-undefined,suppress"
-fi
-
-export CXXFLAGS="$CXXFLAGS_MINIMAL $ADDITIONAL_ARGS"
-export CFLAGS="$CFLAGS_MINIMAL $ADDITIONAL_ARGS"
-export LDFLAGS="$LDFLAGS $ADDITIONAL_ARGS"
-
-for PYTHON_VERSION in "${PYTHON_VERSIONS[@]}"; do
-
- printf "\rConfiguring python $PYTHON_VERSION wrapper..."
-
- mkdir -p python-$PYTHON_VERSION
- cd python-$PYTHON_VERSION
-
- PYTHON_LIBRARY=`ls $DEPS_DIR/install/python-$PYTHON_VERSION/lib/libpython*.*`
- PYTHON_INCLUDE=`ls -d $DEPS_DIR/install/python-$PYTHON_VERSION/include/python*`
- PYTHON_EXECUTABLE=$DEPS_DIR/install/python-$PYTHON_VERSION/bin/python
- export PYTHON_LIBRARY_BASENAME=`basename $PYTHON_LIBRARY`
-
- run_cmake "" "
- -DBOOST_ROOT=$DEPS_DIR/install/boost-$BOOST_VERSION
- -DOCC_INCLUDE_DIR=$DEPS_DIR/install/oce-$OCE_VERSION/include/oce
- -DOCC_LIBRARY_DIR=$DEPS_DIR/install/oce-$OCE_VERSION/lib
- -DOPENCOLLADA_INCLUDE_DIR=$DEPS_DIR/install/OpenCOLLADA/include/opencollada
- -DOPENCOLLADA_LIBRARY_DIR=$DEPS_DIR/install/OpenCOLLADA/lib/opencollada
- -DICU_INCLUDE_DIR=$DEPS_DIR/install/icu-$ICU_VERSION/include
- -DICU_LIBRARY_DIR=$DEPS_DIR/install/icu-$ICU_VERSION/lib
- -DPYTHON_LIBRARY=$PYTHON_LIBRARY
- -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE
- -DPYTHON_INCLUDE_DIR=$PYTHON_INCLUDE
- -DSWIG_EXECUTABLE=$DEPS_DIR/install/swig/bin/swig
- -DCOLLADA_SUPPORT=OFF
- " $CMAKE_DIR
-
- printf "\rBuilding python $PYTHON_VERSION wrapper... "
-
- make -j$IFCOS_NUM_BUILD_PROCS _ifcopenshell_wrapper >>$LOG_FILE 2>&1
-
- if [ "$(uname)" != "Darwin" ]; then
- # TODO: This symbol name depends on the Python version?
- strip -s \
- -K PyInit__ifcopenshell_wrapper \
- ifcwrap/_ifcopenshell_wrapper.so
- fi
-
- cd ..
-
-done
-
-printf "\rBuilt IfcOpenShell... \n\n"