Structure of the top-level
---------------------------
The top-level nodes live inside an "xml" node, and can be:
- *set* - Set a "define", define being a general variable.
  ```xml
  
  ```
- *setenv* - Sets an hxcpp define and an environment variable for child processes.
   ```xml
   
   ```
- *unset* - Unset a define.  if="name" will no longer be true
  ```xml
  
  ```
- *setup* - Used internally to call custom setup code to find SDKs etc.
  ```xml
  
  ```
- *echo* - Print value to console.  Good for debugging.
  ```xml
  
  ```
- *error* - Print value to console and force error.  Good for checking prerequisites.
  ```xml
  
  ```
- *pleaseUpdateHxcppTool* - Used to tell people updating git version that they need to recompile the build tool.
  ```xml
  
  ```
- *path* - Add an directory to the exe search path.
  ```xml
  
  ```
- *mkdir* - Create a directory.
  ```xml
  
  ```
- *section* - Groups block of elements - usually ones that all respect the same if/unless condition.
  ```xml
    
  ```
- *copy* - Copy file when node is parsed.
  ```xml
  
  ```
- *import*/*include* - Read xml from another file. 'import' resets the relative base to the new file, include does not.
  ```xml
  
  
  ```
    + noerror - setting the optional noerror allows the file to be missing
    + section - setting the optional section will only read the named section from the xml file.  Used by hxcpp_config.xml.
- *pragma* - Only include build file once, even with multiple include statements.
  ```xml
  
  ```
- *nvccflag* - Add flag to all nvcc compiles.
  ```xml
  
  ```
- *nvcclinkflag* - Add flag when linking with nvcc code.
  ```xml
  
  ```
- *files* - Define a file group, and set default tags.
  ```xml
  
   ...
  
  ```
    + dir = directory to which the filenames in the group are relative
    + tags = comma separated list of flags tags
- *target* - Define a target, and set its toolid(link mode) and output name.
  ```xml
  
   ...
  
  ```
- *copyFile* - Copy a file after given toolId is run into target output directory
  ```xml
  
  ```
- *magiclib* - Internal for replacing dlls with object files
  ```xml
  
  ```
- *compiler* - Define a compiler.
  ```xml
  
   ...
  
  ```
    + Use optional 'replace' to overwrite, otherwise append
    + It is assumed only 1 compiler is active
    + exe can be overridden in the body of the definition
- *stripper* - Define a stripper, to remove debug information for release from gcc executables
  ```xml
   
  ```
    + Use optional 'replace' to overwrite, otherwise append
- *linker* - Define a linker.
  ```xml
   
  ```
    + Use optional 'replace' to overwrite, otherwise append
    + id could be 'static_link', 'dll' or 'exe'.  Usually all 3 linkers are defined.
    + exe can be overridden in the body of the definition
- *prelinker* - Define a prelinker.
  ```xml
  
   ...
  
  ```