1 #!/usr/bin/env java --enable-preview --source 24 --class-path bldr/classes 2 /* 3 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. Oracle designates this 9 * particular file as subject to the "Classpath" exception as provided 10 * by Oracle in the LICENSE file that accompanied this code. 11 * 12 * This code is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 * version 2 for more details (a copy is included in the LICENSE file that 16 * accompanied this code). 17 * 18 * You should have received a copy of the GNU General Public License version 19 * 2 along with this work; if not, write to the Free Software Foundation, 20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 21 * 22 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 23 * or visit www.oracle.com if you need additional information or have any 24 * questions. 25 */ 26 27 import module java.compiler; 28 import static bldr.Bldr.*; 29 void main(String[] args) throws IOException, InterruptedException, URISyntaxException { 30 var hatDir = Path.of(System.getProperty("user.dir")); 31 var thirdPartyDir = path(hatDir, "thirdparty");// maybe clean? 32 var jextractDir = untarIfNeeded( 33 curlIfNeeded( 34 new URI("https://download.java.net/java/early_access/jextract/22/5/openjdk-22-jextract+5-33_macos-aarch64_bin.tar.gz").toURL(), 35 path(thirdPartyDir, "jextract.tar")), 36 path(thirdPartyDir, "jextract-22")); 37 38 var licensePattern = Pattern.compile("^.*Copyright.*202[4-9].*(Intel|Oracle).*$"); 39 var eolws = Pattern.compile("^.* $"); 40 var tab = Pattern.compile("^.*\\t.*"); 41 42 paths(hatDir, "docs", "hat", "examples", "backends").forEach(dir -> { 43 paths(dir, path -> !Pattern.matches("^.*(-debug|rleparser).*$", path.toString()) 44 && Pattern.matches("^.*\\.(java|md|cpp|h|hpp)$", path.toString()) 45 ).stream().map(path -> new TextFile(path)).forEach(textFile -> { 46 if (!Pattern.matches("^.*md$", textFile.path().toString()) && !textFile.grep(licensePattern)) { 47 System.err.println("ERR MISSING LICENSE " + textFile.path()); 48 } 49 textFile.lines().forEach(line -> { 50 if (line.grep(tab)) { 51 System.err.println("ERR TAB " + textFile.path() + ":" + line.line() + "#" + line.num()); 52 } 53 if (line.grep(eolws)) { 54 System.err.println("ERR TRAILING WHITESPACE " + textFile.path() + ":" + line.line() + "#" + line.num()); 55 } 56 }); 57 }); 58 }); 59 60 var target = path(hatDir, "build");// mkdir(rmdir(path(hatDir, "build"))); 61 62 var hatJavacOpts = javacjarconfig($ -> $.opts( 63 "--source", "24", 64 "--enable-preview", 65 "--add-exports=java.base/jdk.internal=ALL-UNNAMED", 66 "--add-exports=java.base/jdk.internal.vm.annotation=ALL-UNNAMED" 67 )); 68 69 70 var hatJarResult = javacjar($ -> $ 71 .seed(hatJavacOpts) 72 .jar(path(target, "hat-1.0.jar")) 73 .source_path(path(hatDir, "hat/src/main/java")) 74 ); 75 var hatExampleJavaConfig = javacjarconfig($ -> $.seed(hatJavacOpts).class_path(hatJarResult.jar)); 76 println(hatJarResult.jar); 77 for (var exampleDir : paths(path(hatDir, "examples"), "blackscholes", "mandel", "squares", "heal", "violajones", "life")) { 78 javacjar($ -> $ 79 .seed(hatExampleJavaConfig) 80 .jar(path(target, "hat-example-" + exampleDir.getFileName() + "-1.0.jar")) 81 .source_path(path(exampleDir, "src/main/java")) 82 .resource_path(path(exampleDir, "src/main/resources")) 83 ); 84 } 85 var backendsDir = path(hatDir, "backends"); 86 for (var backendDir : paths(backendsDir, "opencl", "ptx")) { 87 javacjar($ -> $ 88 .seed(hatExampleJavaConfig) 89 .jar(path(target, "hat-backend-" + backendDir.getFileName() + "-1.0.jar")) 90 .source_path(path(backendDir, "src/main/java")) 91 .resource_path(path(backendDir, "src/main/resources")) 92 ); 93 } 94 var hattricksDir = path(hatDir, "hattricks"); 95 96 if (Files.exists(hattricksDir)) { 97 for (var hattrickDir : paths(hattricksDir, "chess", "view")) { 98 javacjar($ -> $ 99 .seed(hatExampleJavaConfig) 100 .jar(path(target, "hat-example-" + hattrickDir.getFileName() + "-1.0.jar")) 101 .source_path(path(hattrickDir, "src/main/java")) 102 .resource_path(path(hattrickDir, "src/main/resources")) 103 ); 104 } 105 106 for (var hattrickDir : paths(hattricksDir, "nbody")) { 107 var appFrameworks = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"; 108 var MAC_APP_FRAMEWORKS = Path.of(appFrameworks); 109 var MAC_LIB_FRAMEWORKS = Path.of("/System/Library/Frameworks"); 110 var jextractedJava = path(target, "jextracted-java"); 111 mkdir(jextractedJava); 112 var jextractedOpenCL = path(jextractedJava, "opencl"); 113 var jextractedOpenGL = path(jextractedJava, "opengl"); 114 var jextractconfig = jextractconfig($ -> $ 115 .home(jextractDir) 116 .cwd(hattrickDir) 117 .output(jextractedJava) 118 .compile_flag("-F" + MAC_APP_FRAMEWORKS) 119 ); 120 if (!existingDir(jextractedOpenCL)) { 121 jextract($ -> $ 122 .seed(jextractconfig) 123 .target_package("opencl") 124 .library(path(MAC_LIB_FRAMEWORKS, "OpenCL.framework/OpenCL")) 125 .header(path(MAC_APP_FRAMEWORKS, "OpenCL.framework/Headers/opencl.h")) 126 ); 127 } 128 if (!existingDir(jextractedOpenGL)) { 129 jextract($ -> $ 130 .seed(jextractconfig) 131 .target_package("opengl") 132 .library(path(MAC_LIB_FRAMEWORKS, "GLUT.framework/GLUT"), path(MAC_LIB_FRAMEWORKS, "OpenGL.framework/OpenGL")) 133 .header(path(MAC_APP_FRAMEWORKS, "GLUT.framework/Headers/glut.h")) 134 ); 135 } 136 137 javacjar($ -> $ 138 .seed(hatExampleJavaConfig) 139 .jar(path(target, "hat-example-" + hattrickDir.getFileName() + "-1.0.jar")) 140 .source_path(path(hattrickDir, "src/main/java"), jextractedOpenCL, jextractedOpenGL) 141 .resource_path(path(hattrickDir, "src/main/resources")) 142 ); 143 } 144 } 145 146 var cmakeBldDebugDir = backendsDir.resolve("bld-debug"); 147 if (!existingDir(cmakeBldDebugDir)) { 148 mkdir(cmakeBldDebugDir); 149 cmake($ -> $.cwd(backendsDir)._B(cmakeBldDebugDir).opts("-DHAT_TARGET=" + target)); 150 } 151 cmake($ -> $.cwd(backendsDir).__build(cmakeBldDebugDir)); 152 }