1 # Building HAT
  2 
  3 ----
  4 
  5 * [Contents](hat-00.md)
  6 * House Keeping
  7   * [Project Layout](hat-01-01-project-layout.md)
  8   * [Building Babylon](hat-01-02-building-babylon.md)
  9   * [Building HAT](hat-01-03-building-hat.md)
 10     * [Enabling the CUDA Backend](hat-01-05-building-hat-for-cuda.md)
 11 * Programming Model
 12   * [Programming Model](hat-03-programming-model.md)
 13 * Interface Mapping
 14   * [Interface Mapping Overview](hat-04-01-interface-mapping.md)
 15   * [Cascade Interface Mapping](hat-04-02-cascade-interface-mapping.md)
 16 * Implementation Detail
 17   * [Walkthrough Of Accelerator.compute()](hat-accelerator-compute.md)
 18   * [How we minimize buffer transfers](hat-minimizing-buffer-transfers.md)
 19 
 20 ---
 21 
 22 # Building HAT
 23 
 24 We can build HAT using maven and cmake.
 25 
 26 Maven controls the build but delegates to cmake for native artifacts (such as various backends).
 27 
 28 Note: You should not edit the pom.xml files, these are autogenerated (using mkpoms) and your changes will get overwritten.
 29 
 30 
 31 ## Setting environment variables JAVA_HOME and PATH
 32 
 33 To build HAT we need to ensure that `JAVA_HOME` is set
 34 to point to our babylon jdk (the one we built [here](hat-01-02-building-babylon.md))
 35 
 36 It will simplify our tasks going forward if we add `${JAVA_HOME}/bin` to our PATH (before any other JAVA installs).
 37 
 38 The `env.bash` shell script can be sourced (dot included) in your shell to set JAVA_HOME and PATH
 39 
 40 It should detect the arch type (AARCH64 or X86_46) and select the correct relative parent dir and inject that dir in your PATH.
 41 
 42 You will need jextract for your platform, and the jextract/bin dir should also be in your path.
 43 
 44 
 45 ```bash
 46 cd hat
 47 . ./env.bash
 48 export PATH=${PATH}:/path/to/my/jextract/bin
 49 echo ${JAVA_HOME}
 50 /Users/ME/github/babylon/hat/../build/macosx-aarch64-server-release/jdk
 51 echo ${PATH}
 52 /Users/ME/github/babylon/hat/../build/macosx-aarch64-server-release/jdk/bin:/usr/local/bin:......
 53 ```
 54 
 55 ## Root level maven pom.xml properties
 56 
 57 If you followed the instructions for building babylon your `pom.xml`
 58 properties should look like this, and should not need changing
 59 
 60 ```xml
 61 <project>
 62     <!-- yada -->
 63     <properties>
 64         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 65         <hat.build>${env.PWD}/build</hat.build>
 66     </properties>
 67     <!-- yada -->
 68 </project>
 69 ```
 70 ## Sanity checking your env and root pom.xml
 71 
 72 After sourcing `env.bash` or making changes to `pom.xml` we can
 73 sanity check our setup by running
 74 
 75 ```bash
 76 cd hat
 77 java @bldr/sanity
 78 ```
 79 
 80 ## Building with maven
 81 
 82 Now we should be able to use maven to build, if successful maven will place all jars and libs in a newly created `build` dir in your top level hat dir.
 83 
 84 ```bash
 85 cd hat
 86 . ./env.bash
 87 mvn clean  compile package install
 88 ls build
 89 hat-1.0.jar                         hat-example-heal-1.0.jar        libptx_backend.dylib
 90 hat-backend-ffi-cuda-1.0.jar        hat-example-mandel-1.0.jar      libspirv_backend.dylib
 91 hat-backend-ffi-mock-1.0.jar        hat-example-squares-1.0.jar     mock_info
 92 hat-backend-ffi-opencl-1.0.jar      hat-example-view-1.0.jar        opencl_info
 93 hat-backend-ffi-ptx-1.0.jar         hat-example-violajones-1.0.jar  ptx_info
 94 hat-backend-ffi-spirv-1.0.jar       libmock_backend.dylib           spirv_info
 95 hat-example-experiments-1.0.jar     libopencl_backend.dylib
 96 ```
 97 
 98 The provided `maven-build.bash` script contains the minimal maven commandline
 99 
100 ```bash
101 bash maven-build.bash
102 ```
103 
104 ## Running an example
105 
106 To run an example we use the maven artifacts in `build`
107 
108 ```bash
109 ${JAVA_HOME}/bin/java \
110    --enable-preview --enable-native-access=ALL-UNNAMED \
111    --class-path build/hat-1.0.jar:build/hat-example-mandel-1.0.jar:build/hat-backend-ffi-opencl-1.0.jar \
112    --add-exports=java.base/jdk.internal=ALL-UNNAMED \
113    -Djava.library.path=build\
114    mandel.Main
115 ```
116 
117 The provided `hat/run` java launch script simplifies this somewhat, we just need to pass the backend name `ffi-opencl` and the package name `mandel`
118 (all examples are assumed to be in `packagename/Main.java`
119 
120 ```bash
121 java @hat/run ffi-opencl mandel
122 ```