When compiling from Haxe via hxcpp, a Build.xml file is generated in the output directory. The file lists the generated files and dependencies and ultimately includes the toolchain/haxe-target.xml file, which describes how to combine these files.
There are a few complications when setting the order in which things are configured, since a particular build might want to:
You can see which files are included by setting the HXCPP_VERBOSE define when compiling. One example is for a hypothetical user 'Hugh' on a Windows platform:
Using makefile: Build.xml
No specified toolchain
- Parsing include: C:/Users/Hugh/dev/hxcpp/toolchain/setup.xml
- Parsing include: C:\Users\Hugh\.hxcpp_config.xml (section "vars")
Using Windows compiler: MSVC
- Parsing include: C:/Users/Hugh/dev/hxcpp/toolchain/finish-setup.xml
- Parsing makefile: C:\Users\Hugh\test\proj\cpp\Build.xml
- Parsing include: C:/Users/Hugh/dev/hxcpp/build-tool/BuildCommon.xml
- Parsing include: C:/Users/Hugh/dev/hxcpp/toolchain/haxe-target.xml
- Parsing include: C:/Users/Hugh/dev/hxcpp/toolchain/msvc-toolchain.xml
- Parsing compiler: C:/Users/Hugh/dev/hxcpp/toolchain/common-defines.xml
- Parsing include: C:\Users\Hugh\.hxcpp_config.xml (section "exes")setup.xml is read because no custom toolchain is specified, and this just includes .hxcpp_config.xml.vars section of .hxcpp_config.xml is read - mainly to setup SDK locations.hxcpp build tool then uses internal logic based on the host and defines to work out which compiler/toolchain to use. In this case, MSVC (Microsoft Visual Studio C++) is selected.finish-setup.xml then sets some standard defines for file extensions and linking flags based on the type of toolchain being used.Build.xml) is then processed. It can use the standard defines from finish-setup.xml.Build.xml imports the standard Haxe target build files (haxe-target.xml), which adds the files required for the Haxe runtime.msvc-toolchain.xml) is then parsed - making use of any settings from the main Build.xml and finish-setup.xml. This file includes common-defines.xml inject standard Haxe compiler flags.exes section of .hxcpp_config.xml is read. Historically to add libraries or build-paths to targets.finish-setup.xml is where the conventions are set. These variables include:
haxelink - dll, static_link, or exeLIBPREFIX - lib or emptyLIBEXTRA:
.iphonesim-64.iphonesim.iphoneos.iphoneos-v7.iphoneos-v7s.iphoneos-64.appletvsim-64.appletvsim.watchos.watchsimulator-x86-v7-64HX_LINK_SUFFIX - LIBEXTRA, -19 (MSVC 19)
LIBEXT - .a, .libDBG - -debug or emptyOBJEXT - -list-of-config-ids depending on available optionsThese variables are used by haxe-target.xml - you can use them too. Haxe then builds the haxe target, which uses some code like:
<set name="HAXE_OUTPUT_FILE" value="${LIBPREFIX}${HAXE_OUTPUT_PART}${DBG}" /> <target id="haxe" tool="linker" toolid="${haxelink}" output="${HAXE_OUTPUT_FILE}"> <ext value="${LIBEXTRA}.a" if="static_link" /> <!-- ... --> <files id="__main__" unless="static_link" /> <files id="__lib__" if="static_link"/> <files id="__resources__" /> <files id="__externs__" /> <files id="runtime" unless="dll_import" /> <files id="cppia" if="scriptable" /> <lib name="-lpthread" if="linux" unless="static_link" /> <lib name="-ldl" if="linux" unless="static_link" /> </target>
Here you can see the various file groups, which are enabled or disabled depending on the compiler mode, and some standard libraries that are needed for Linux.
hxcpp-generated code/Build.xmlIf you are using external C++ code or using metadata to inject XML into the build process, and you are getting a compiler or linker error, then it can be useful to run the hxcpp build tool without re-running Haxe. This lets you manually edit the build file or generated C++ code until you get things to work. Once you have solved the issues using this technique, then you can move the changes back into the injected/external code.
First, invoke the Haxe compiler with the -v flag. This gives quite a bit of debug info, but will include a line like this:
haxelib run hxcpp Build.xml haxe -Dhaxe3="1" -Dhaxe_ver="4.000" -Dhxcpp_api_level="332" -Dsource-header="Generated by Haxe 4.0.0" -I"" -I"C:/Users/Hugh/dev/haxe/std/cpp/_std/" -I"C:/Users/Hugh/dev/haxe/std/"
To use this, first change directories to your output directory. This is the directory specified in the --cpp Haxe compiler option. Then copy and paste the haxelib run ... command into a shell, command or batch file.