forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			98 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								The Haxe Target
							 | 
						||
| 
								 | 
							
								---------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Include Order
							 | 
						||
| 
								 | 
							
								There are a few complications when setting the order in which things are configured, since a particular build might want to:
							 | 
						||
| 
								 | 
							
								  - set the compiler
							 | 
						||
| 
								 | 
							
								  - override some compiler settings
							 | 
						||
| 
								 | 
							
								  - make decisions based on the compiler or settings
							 | 
						||
| 
								 | 
							
								  - set or use standard file prefixes/suffixes 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Example Sequence
							 | 
						||
| 
								 | 
							
								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 include hxcpp_config
							 | 
						||
| 
								 | 
							
								- the 'vars' section of hxcpp_config is read - mainly to setup SDK locations
							 | 
						||
| 
								 | 
							
								- the hxcpp build tool then uses internal logic based on host and defines to work out which compiler/toolchain to use
							 | 
						||
| 
								 | 
							
								- finish-setup then sets a bunch of standard defines for file-extensions and linking flags based on
							 | 
						||
| 
								 | 
							
								   the type of toolchain being used.
							 | 
						||
| 
								 | 
							
								- The provided buildfile (Build.xml) is then processed. It can use the standard defines from finish-setup.
							 | 
						||
| 
								 | 
							
								- Build.xml imports the standard haxe-target buildfile, which adds standard runtime files
							 | 
						||
| 
								 | 
							
								- The toolchain file is then parsed - making use of any settings from the main Build.xml and finish-setup.
							 | 
						||
| 
								 | 
							
								  - This file includes the "common-defines.xml" from the compiler to inject standard haxe compiler flags
							 | 
						||
| 
								 | 
							
								- hxcpp_config "exe" is parsed.  Historically to add libraries or build-paths to targets.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Standard Environment
							 | 
						||
| 
								 | 
							
								finish-setup.xml is where the conventions are set. These variables include:
							 | 
						||
| 
								 | 
							
								  - haxelink = dll|static_link|exe
							 | 
						||
| 
								 | 
							
								  - LIBPREFIX = lib|""
							 | 
						||
| 
								 | 
							
								  - LIBEXTRA =
							 | 
						||
| 
								 | 
							
								     +  .iphonesim-64
							 | 
						||
| 
								 | 
							
								     +  .iphonesim
							 | 
						||
| 
								 | 
							
								     +  .iphoneos
							 | 
						||
| 
								 | 
							
								     +  .iphoneos-v7
							 | 
						||
| 
								 | 
							
								     +  .iphoneos-v7s
							 | 
						||
| 
								 | 
							
								     +  .iphoneos-64
							 | 
						||
| 
								 | 
							
								     +  .appletvsim-64
							 | 
						||
| 
								 | 
							
								     +  .appletvsim
							 | 
						||
| 
								 | 
							
								     +  .watchos
							 | 
						||
| 
								 | 
							
								     +  .watchsimulator
							 | 
						||
| 
								 | 
							
								     +  -x86
							 | 
						||
| 
								 | 
							
								     +  -v7
							 | 
						||
| 
								 | 
							
								     +  -64
							 | 
						||
| 
								 | 
							
								  - HX_LINK_SUFFIX = LIBEXTRA | -19 (msvc 19)
							 | 
						||
| 
								 | 
							
								  - LIBEXT = .a|.lib
							 | 
						||
| 
								 | 
							
								  - DBG = ""|"-debug"
							 | 
						||
| 
								 | 
							
								  - OBJEXT = "-list-of-config-ids" depending on available options
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								These variables are used by haxe-target - you can use them too.  Haxe then builds the "haxe" target, which uses some code like:
							 | 
						||
| 
								 | 
							
								```xml
							 | 
						||
| 
								 | 
							
								  <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 not depending on the compiler mode, and some standard libraries that are needed for Linux.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Experimenting With Hxcpp Generated Code/Build.xml
							 | 
						||
| 
								 | 
							
								If you are using external cpp code, or using meta-data to inject xml into the build process, and you are getting a compile or link error, then it can be useful to run the hxcpp build tool without re-running haxe.  This lets you hand-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, compile haxe with '-v' flag.  This gives quite a bit of debug, 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 will be the one you specified with the "-cpp" haxe compiler option.  Then, cut and paste this command into a shell, cmd or batch file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |