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 }