You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
neptools/COMPILE.md

6.3 KiB

Note: all of the following assumes you're on Linux. If you're on Windows, have fun figuring things out...

You'll need python (for the compilation script), a C++14 compiler and boost-1.61 sources. Boost is not included in the git repository or as a submodule, because it's huge, you can use use ./get_boost.sh to automatically download it. Alternatively place it/symlink into ext/boost, the build script will automatically compile the required boost libraries with the correct flags. In an ideal world, you can just run:

./waf configure
./waf

You can specify compile flags on configure:

CXX=g++-5.3.0 CXXFLAGS="-O3 -DNDEBUG" LINKFLAGS="-whatever" ./waf configure

You can use CXXFLAGS_NEPTOOLS, LINKFLAGS_NEPTOOLS, etc. to add flags only used during compiling Neptools, and CXXFLAGS_EXT etc. to add flags only used during compiling bundled libs.

Some useful flags for configure:

  • --optimize: produce some default optimization, but keep assertions enabled.
  • --optimize-ext: optimize ext libs even if Neptools itself is not optimized (will also remove debug info).
  • --release: --optimize + no asserts
  • --system-boost: use external Boost, see next section for warnings

If everything goes well, you'll get an executable in build/stcm-editor.

Boost with C++14

Note: This is no longer needed, but you can still manually compile and use a standalone version of boost. Please note that you need boost compiled with c++14 support. If you want to use your distribution's build, it'll most likely have a C++98 ABI version, which means it'll probably compile but crash randomly when run. Unless you want to avoid all this pain, use the bundled build above.

Download the latest release, and look at getting started guide, specially the 5.2. section. If you have boost installed globally, that can cause problems. In this case edit tools/build/src/engine/jambase.c and remove/comment out the line:

"BOOST_BUILD_PATH = /usr/share/boost-build ;\n",

before running bootstrap.sh.

Continue until 5.2.4. You'll need to add cxxflags=-std=c++14 to the b2 command line. Adding link=static is also a good idea to avoid dynamic loader path problems. We currently only use the filesystem library, so you can add --with-filesystem to reduce build time. I used the following command line:

b2 --with-filesystem toolset=gcc-5.3.0 variant=release link=static threading=single runtime-link=shared cxxflags=-std=c++14 stage

To actually use it, if you unpacked boost into $boost_dir:

./waf configure --system-boost --boost-includes $boost_dir --boost-libs $boost_dir/stage/lib

(Cross) Compiling to Windows

Currently only clang (compiled from git, probably patched, see next section. 3.8 doesn't support exceptions properly) is supported, with MSVC 2013 lib files. You'll also need lld if you want LTO or want to cross compile. I've only tested cross compiling, but it should be possible to compile on Windows too.

Install MSVC 2013 on a Windows (virtual) machine. If you want to cross compile, you'll need to copy directories named include and lib to your Linux box from Program Files (x86)/Microsoft Visual Studio 12.0/VC and Program Files (x86)/Windows Kits/8.1 too (assuming default install location).

Problem #1: Linux filesystems are usually case-sensitive, but MSVC headers pretty much expect a case-insensitive file lookup. Solution 1: store the files on a case-insensitive fs (fat, ntfs, etc, or just mount your Windows fs). Solution 2: use ciopfs. Make sure you mount ciopfs first, and copy into that directory, otherwise you'll manually have to convert all files to downcase.

Problem #2: clang won't know where are your files, so you'll need some compiler flags. For compiling you'll need: -m32 -imsvc $vc/include -imsvc $winkit/include/um -imsvc $winkit/include/shared where $vc and $winkit refers to the folders you previously copied. Using -isystem prevent clang from overflowing your terminal about how awful the microsoft headers are (we know that). For linking, you'll need /libpath:$vc/lib /libpath:$winkit/lib/winv6.3/um/x86.

To compile boost (no longer needed), look here. You'll need to create a ~/user-config.jam. Mine looks like this (clang is installed into $clangbin):

using msvc : clang : "$clangbin/clang-cl" :
  <compileflags>"-m32 -fms-compatibility-version=18 -imsvc $vc/include -imsvc $winkit/include/um -imsvc $winkit/include/shared -Xclang -emit-llvm-bc"
  <linkflags>"/libpath:$vc/lib /libpath:$winkit/lib/winv6.3/um/x86"
  <compiler>"$clangbin/clang-cl"
  <linker>"$clangbin/lld-link"
  <setup>
  ;

-Xclang -emit-llvm-bc is used to enable LTO-ing boost. You can remove it if you do not want it. Then use b2 toolset=msvc-clang ... to compile boost. You can also create a 64-bit version, in this case remove -m32 from cflags and adjust the libpaths (but it's not really required if you only build static libs).

Now you can compile this project. Use something like that:

CC=$clangbin/clang-cl CXX=$clangbin/clang-cl LINK_CXX=$clangbin/lld-link AR=$clangbin/llvm-lib CXXFLAGS="your cflags"  LINKFLAGS="your linkflags" ./waf configure --clang-hack [--system-boost --boost-includes ...]

Some potential problems with the clang toolchain

When building a .dll, llvm-link wants to invoke the original lib.exe to create an imports lib or whatever, which won't work on Linux (and completely unnecessary, since we export 0 symbols...).

Open tools/lld/COFF/Driver.cpp, find these lines:

  if (!Config->Exports.empty() || Config->DLL) {
    fixupExports();
    writeImportLibrary();
    assignExportOrdinals();
  }

and comment out/delete the writeImportLibrary() line (the others are needed for the dinput8.dll hack).

The second problem is that when using LTO, it can still crash lld when creating a dll. See llvm.patch for a path that fixes it for the time being.