Skip to content

Commit

Permalink
feat: added --compile-options / -C flags
Browse files Browse the repository at this point in the history
These options will be passed directly to the compiler.

Fixes jbangdev#1397
  • Loading branch information
quintesse committed Oct 20, 2022
1 parent 30cc175 commit e0c391b
Show file tree
Hide file tree
Showing 13 changed files with 104 additions and 46 deletions.
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/debugging.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ NOTE: Be sure to put a breakpoint in your IDE/debugger before you connect to mak

== Debug info

JBang since version 0.100 compiles with debug info enabled by default.
JBang since version 0.100 compiles with debug info enabled by default. You can use `-C=-g` to tweak how much debug info is included: `jbang -C=-g=lines,vars,source` or to turn it off use `jbang -C=-g=none".

== Debug jbang itself

Expand Down
15 changes: 10 additions & 5 deletions src/main/java/dev/jbang/catalog/Alias.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,11 @@ public class Alias extends CatalogItem {
public final String javaVersion;
@SerializedName(value = "main")
public final String mainClass;
@SerializedName(value = "compile-options")
public final List<String> compileOptions;

private Alias() {
this(null, null, null, null, null, null, null, null, null, null, null, null, null);
this(null, null, null, null, null, null, null, null, null, null, null, null, null, null);
}

public Alias(String scriptRef,
Expand All @@ -48,6 +50,7 @@ public Alias(String scriptRef,
Map<String, String> properties,
String javaVersion,
String mainClass,
List<String> compileOptions,
Catalog catalog) {
super(catalog);
this.scriptRef = scriptRef;
Expand All @@ -62,6 +65,7 @@ public Alias(String scriptRef,
this.properties = properties;
this.javaVersion = javaVersion;
this.mainClass = mainClass;
this.compileOptions = compileOptions;
}

/**
Expand Down Expand Up @@ -123,7 +127,7 @@ private static Alias merge(Alias a1, String name, Function<String, Alias> findUn
a2 = merge(a2, a2.scriptRef, findUnqualifiedAlias, names);
String desc = a1.description != null ? a1.description : a2.description;
List<String> args = a1.arguments != null && !a1.arguments.isEmpty() ? a1.arguments : a2.arguments;
List<String> opts = a1.javaOptions != null && !a1.javaOptions.isEmpty() ? a1.javaOptions
List<String> jopts = a1.javaOptions != null && !a1.javaOptions.isEmpty() ? a1.javaOptions
: a2.javaOptions;
List<String> srcs = a1.sources != null && !a1.sources.isEmpty() ? a1.sources
: a2.sources;
Expand All @@ -139,10 +143,11 @@ private static Alias merge(Alias a1, String name, Function<String, Alias> findUn
: a2.properties;
String javaVersion = a1.javaVersion != null ? a1.javaVersion : a2.javaVersion;
String mainClass = a1.mainClass != null ? a1.mainClass : a2.mainClass;
List<String> copts = a1.compileOptions != null && !a1.compileOptions.isEmpty() ? a1.compileOptions
: a2.compileOptions;
Catalog catalog = a2.catalog != null ? a2.catalog : a1.catalog;
return new Alias(a2.scriptRef, desc, args, opts, srcs, ress, deps, repos, cpaths, props, javaVersion,
mainClass,
catalog);
return new Alias(a2.scriptRef, desc, args, jopts, srcs, ress, deps, repos, cpaths, props, javaVersion,
mainClass, copts, catalog);
} else {
return a1;
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/dev/jbang/catalog/Catalog.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public Catalog(String baseRef, String description, ResourceRef catalogRef, Map<S
aliases.forEach((key, a) -> this.aliases.put(key,
new Alias(a.scriptRef, a.description, a.arguments, a.javaOptions, a.sources, a.resources,
a.dependencies, a.repositories, a.classpaths, a.properties, a.javaVersion, a.mainClass,
this)));
a.compileOptions, this)));
templates.forEach((key, t) -> this.templates.put(key,
new Template(t.fileRefs, t.description, t.properties, this)));
}
Expand Down
10 changes: 6 additions & 4 deletions src/main/java/dev/jbang/catalog/CatalogUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,11 @@ public static Path addNearestAlias(String name,
List<String> classPaths,
Map<String, String> properties,
String javaVersion,
String mainClass) {
String mainClass,
List<String> compileOptions) {
Path catalogFile = Catalog.getCatalogFile(null);
addAlias(catalogFile, name, scriptRef, description, arguments, javaRuntimeOptions, sources, resources,
dependencies, repositories, classPaths, properties, javaVersion, mainClass);
dependencies, repositories, classPaths, properties, javaVersion, mainClass, compileOptions);
return catalogFile;
}

Expand All @@ -68,13 +69,14 @@ public static Alias addAlias(Path catalogFile,
List<String> classPaths,
Map<String, String> properties,
String javaVersion,
String mainClass) {
String mainClass,
List<String> compileOptions) {
Path cwd = Util.getCwd();
catalogFile = cwd.resolve(catalogFile);
Catalog catalog = Catalog.get(catalogFile);
scriptRef = catalog.relativize(scriptRef);
Alias alias = new Alias(scriptRef, description, arguments, javaRuntimeOptions, sources, resources,
dependencies, repositories, classPaths, properties, javaVersion, mainClass, catalog);
dependencies, repositories, classPaths, properties, javaVersion, mainClass, compileOptions, catalog);
catalog.aliases.put(name, alias);
try {
catalog.write();
Expand Down
21 changes: 9 additions & 12 deletions src/main/java/dev/jbang/cli/Alias.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ class AliasAdd extends BaseAliasCommand {
@CommandLine.Mixin
ScriptMixin scriptMixin;

@CommandLine.Mixin
BuildMixin buildMixin;

@CommandLine.Mixin
DependencyInfoMixin dependencyInfoMixin;

Expand All @@ -74,14 +77,6 @@ class AliasAdd extends BaseAliasCommand {
@CommandLine.Option(names = { "--java-options" }, description = "A Java runtime option")
List<String> javaRuntimeOptions;

@CommandLine.Option(names = { "-m",
"--main" }, description = "Main class to use when running. Used primarily for running jar's.")
String main;

@CommandLine.Option(names = { "-j",
"--java" }, description = "JDK version to use for running the alias.")
String javaVersion;

@CommandLine.Option(names = { "--name" }, description = "A name for the alias")
String name;

Expand Down Expand Up @@ -109,12 +104,14 @@ public Integer doCall() {
CatalogUtil.addAlias(catFile, name, scriptMixin.scriptOrFile, desc, userParams, javaRuntimeOptions,
scriptMixin.sources, scriptMixin.resources, dependencyInfoMixin.getDependencies(),
dependencyInfoMixin.getRepositories(), dependencyInfoMixin.getClasspaths(),
dependencyInfoMixin.getProperties(), javaVersion, main);
dependencyInfoMixin.getProperties(), buildMixin.javaVersion, buildMixin.main,
buildMixin.compileOptions);
} else {
catFile = CatalogUtil.addNearestAlias(name, scriptMixin.scriptOrFile, desc, userParams, javaRuntimeOptions,
scriptMixin.sources, scriptMixin.resources, dependencyInfoMixin.getDependencies(),
dependencyInfoMixin.getRepositories(), dependencyInfoMixin.getClasspaths(),
dependencyInfoMixin.getProperties(), javaVersion, main);
dependencyInfoMixin.getProperties(), buildMixin.javaVersion, buildMixin.main,
buildMixin.compileOptions);
}
info(String.format("Alias '%s' added to '%s'", name, catFile));
return EXIT_OK;
Expand All @@ -130,8 +127,8 @@ ProjectBuilder createProjectBuilder() {
.additionalSources(scriptMixin.sources)
.additionalResources(scriptMixin.resources)
.forceType(scriptMixin.forceType)
.javaVersion(javaVersion)
.mainClass(main)
.javaVersion(buildMixin.javaVersion)
.mainClass(buildMixin.main)
.setArguments(userParams)
.javaOptions(javaRuntimeOptions);
Path cat = getCatalog(false);
Expand Down
1 change: 1 addition & 0 deletions src/main/java/dev/jbang/cli/BaseBuildCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ ProjectBuilder createProjectBuilder() {
.catalog(scriptMixin.catalog)
.javaVersion(buildMixin.javaVersion)
.mainClass(buildMixin.main)
.compileOptions(buildMixin.compileOptions)
.nativeImage(nativeImage)
.buildDir(buildDir);
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/dev/jbang/cli/BuildMixin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.jbang.cli;

import java.util.List;

import picocli.CommandLine;

public class BuildMixin {
Expand All @@ -18,4 +20,7 @@ void setJavaVersion(String javaVersion) {
@CommandLine.Option(names = { "-m",
"--main" }, description = "Main class to use when running. Used primarily for running jar's.")
String main;

@CommandLine.Option(names = { "-C", "--compile-options" }, description = "Options to pass to the compiler")
public List<String> compileOptions;
}
3 changes: 2 additions & 1 deletion src/main/java/dev/jbang/cli/Export.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ protected ProjectBuilder createProjectBuilder(ExportMixin exportMixin) {
.forceType(exportMixin.scriptMixin.forceType)
.catalog(exportMixin.scriptMixin.catalog)
.javaVersion(exportMixin.buildMixin.javaVersion)
.mainClass(exportMixin.buildMixin.main);
.mainClass(exportMixin.buildMixin.main)
.compileOptions(exportMixin.buildMixin.compileOptions);
}
}

Expand Down
14 changes: 14 additions & 0 deletions src/main/java/dev/jbang/source/ProjectBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public class ProjectBuilder {
private List<Project> javaAgents = new ArrayList<>();
private Source.Type forceType = null;
private String mainClass;
private List<String> compileOptions = Collections.emptyList();
private File catalogFile;

private ModularClassPath mcp;
Expand Down Expand Up @@ -180,6 +181,15 @@ public ProjectBuilder mainClass(String mainClass) {
return this;
}

public ProjectBuilder compileOptions(List<String> compileOptions) {
if (compileOptions != null) {
this.compileOptions = compileOptions;
} else {
this.compileOptions = Collections.emptyList();
}
return this;
}

public ProjectBuilder javaOptions(List<String> javaOptions) {
if (javaOptions != null) {
this.javaOptions = javaOptions;
Expand Down Expand Up @@ -444,6 +454,7 @@ private Project updateProject(Project prj) {
ss.addClassPaths(replaceAllProps(additionalClasspaths));
updateAllSources(prj, replaceAllProps(additionalSources));
ss.addResources(allToFileRef(replaceAllProps(additionalResources)));
ss.addCompileOptions(compileOptions);
prj.putProperties(properties);
prj.addRuntimeOptions(javaOptions);
prj.addJavaAgents(javaAgents);
Expand Down Expand Up @@ -536,6 +547,9 @@ private void updateFromAlias(Alias alias) {
if (mainClass == null) {
mainClass(alias.mainClass);
}
if (compileOptions.isEmpty()) {
compileOptions(alias.compileOptions);
}
}

public static boolean isAlias(ResourceRef resourceRef) {
Expand Down
25 changes: 21 additions & 4 deletions src/test/java/dev/jbang/cli/TestAlias.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class TestAlias extends BaseTest {
" \"description\": \"twodesc\",\n" +
" \"arguments\": [\"2\"],\n" +
" \"java-options\": [\"--two\"],\n" +
" \"compile-options\": [\"--ctwo\"],\n" +
" \"dependencies\": [\"twodep\"],\n" +
" \"repositories\": [\"tworepo\"],\n" +
" \"classpaths\": [\"twocp\"],\n" +
Expand All @@ -45,13 +46,15 @@ public class TestAlias extends BaseTest {
" \"script-ref\": \"http://dummy\",\n" +
" \"arguments\": [\"3\"],\n" +
" \"java-options\": [\"--three\"],\n" +
" \"compile-options\": [\"--cthree\"],\n" +
" \"properties\": {\"three\":\"3\"}\n" +
" },\n" +
" \"four\": {\n" +
" \"script-ref\": \"three\",\n" +
" \"description\": \"fourdesc\",\n" +
" \"arguments\": [\"4\"],\n" +
" \"java-options\": [\"--four\"],\n" +
" \"compile-options\": [\"--cfour\"],\n" +
" \"dependencies\": [\"fourdep\"],\n" +
" \"repositories\": [\"fourrepo\"],\n" +
" \"classpaths\": [\"fourcp\"],\n" +
Expand Down Expand Up @@ -117,7 +120,8 @@ void testAddWithDefaultCatalogFile2() throws IOException {
"--java-options", "jopts",
"-D", "prop=val",
"--main", "mainclass",
"--java", "version",
"--compile-options", "copts",
"--java", "999",
"aap", "noot", "mies");
assertThat(Files.isRegularFile(Paths.get(cwd.toString(), Catalog.JBANG_CATALOG_JSON)),
is(true));
Expand All @@ -136,7 +140,9 @@ void testAddWithDefaultCatalogFile2() throws IOException {
assertThat(alias.properties, hasEntry("prop", "val"));
assertThat(alias.arguments, iterableWithSize(3));
assertThat(alias.mainClass, is("mainclass"));
assertThat(alias.javaVersion, is("version"));
assertThat(alias.compileOptions, iterableWithSize(1));
assertThat(alias.compileOptions, contains("copts"));
assertThat(alias.javaVersion, is("999"));
assertThat(alias.arguments, contains("aap", "noot", "mies"));
}

Expand All @@ -158,7 +164,8 @@ void testAddWithDefaultCatalogFile3() throws IOException {
"--java-options", "jopts",
"-D", "prop=val",
"--main", "mainclass",
"--java", "version",
"--compile-options", "copts",
"--java", "999",
"aap", "noot", "mies");
assertThat(Files.size(catFile), not(is(0L)));
Alias alias = Alias.get("name");
Expand All @@ -176,7 +183,9 @@ void testAddWithDefaultCatalogFile3() throws IOException {
assertThat(alias.properties, hasEntry("prop", "val"));
assertThat(alias.arguments, iterableWithSize(3));
assertThat(alias.mainClass, is("mainclass"));
assertThat(alias.javaVersion, is("version"));
assertThat(alias.compileOptions, iterableWithSize(1));
assertThat(alias.compileOptions, contains("copts"));
assertThat(alias.javaVersion, is("999"));
assertThat(alias.arguments, contains("aap", "noot", "mies"));
}

Expand Down Expand Up @@ -331,6 +340,7 @@ void testGetAliasOne() throws IOException {
assertThat(alias.arguments, nullValue());
assertThat(alias.javaOptions, nullValue());
assertThat(alias.properties, nullValue());
assertThat(alias.compileOptions, nullValue());
}

@Test
Expand All @@ -352,6 +362,8 @@ void testGetAliasTwo() throws IOException {
assertThat(alias.classpaths, contains("twocp"));
assertThat(alias.properties, aMapWithSize(1));
assertThat(alias.properties, hasEntry("two", "2"));
assertThat(alias.compileOptions, iterableWithSize(1));
assertThat(alias.compileOptions, contains("--ctwo"));
}

@Test
Expand All @@ -373,6 +385,8 @@ void testGetAliasFour() throws IOException {
assertThat(alias.classpaths, contains("fourcp"));
assertThat(alias.properties, aMapWithSize(1));
assertThat(alias.properties, hasEntry("four", "4"));
assertThat(alias.compileOptions, iterableWithSize(1));
assertThat(alias.compileOptions, contains("--cfour"));
}

@Test
Expand All @@ -387,6 +401,8 @@ void testGetAliasFive() throws IOException {
assertThat(alias.javaOptions, contains("--three"));
assertThat(alias.properties, aMapWithSize(1));
assertThat(alias.properties, hasEntry("three", "3"));
assertThat(alias.compileOptions, iterableWithSize(1));
assertThat(alias.compileOptions, contains("--cthree"));
}

@Test
Expand All @@ -398,6 +414,7 @@ void testGetAliasGav() throws IOException {
assertThat(alias.arguments, nullValue());
assertThat(alias.javaOptions, nullValue());
assertThat(alias.properties, nullValue());
assertThat(alias.compileOptions, nullValue());
}

@Test
Expand Down
10 changes: 5 additions & 5 deletions src/test/java/dev/jbang/cli/TestAliasNearest.java
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ void testAddLocalFile() throws IOException {
void testAddLocal(String ref, String result) throws IOException {
Path cwd = Util.getCwd();
Path localCatalog = cwd.resolve(Catalog.JBANG_CATALOG_JSON);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null, null);
clearSettingsCaches();
Catalog catalog = Catalog.get(localCatalog);
assertThat(catalog.aliases.keySet(), hasItem("new"));
Expand All @@ -162,7 +162,7 @@ void testAddLocalExplicit() throws IOException {
Path cwd = Util.getCwd();
Path localCatalog = cwd.resolve(Catalog.JBANG_CATALOG_JSON);
CatalogUtil.addAlias(Paths.get(Catalog.JBANG_CATALOG_JSON), "new", "dummy.java", null, null, null, null, null,
null, null, null, null, null, null);
null, null, null, null, null, null, null);
clearSettingsCaches();
Catalog catalog = Catalog.get(localCatalog);
assertThat(catalog.aliases.keySet(), hasItem("new"));
Expand All @@ -184,7 +184,7 @@ void testAddDotLocal(String ref, String result) throws IOException {
Path localCatalog = cwd.resolve(Catalog.JBANG_CATALOG_JSON);
Path dotLocalCatalog = cwd.resolve(Settings.JBANG_DOT_DIR).resolve(Catalog.JBANG_CATALOG_JSON);
Files.delete(localCatalog);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null, null);
assertThat(localCatalog.toFile(), not(anExistingFile()));
clearSettingsCaches();
Catalog catalog = Catalog.get(dotLocalCatalog);
Expand All @@ -209,7 +209,7 @@ void testAddParent(String ref, String result) throws IOException {
Path parentCatalog = cwd.getParent().resolve(Settings.JBANG_DOT_DIR).resolve(Catalog.JBANG_CATALOG_JSON);
Files.delete(localCatalog);
Files.delete(dotLocalCatalog);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null, null);
assertThat(localCatalog.toFile(), not(anExistingFile()));
assertThat(dotLocalCatalog.toFile(), not(anExistingFile()));
clearSettingsCaches();
Expand Down Expand Up @@ -238,7 +238,7 @@ void testAddGlobal(String ref, String result) throws IOException {
Files.delete(localCatalog);
Files.delete(dotLocalCatalog);
Files.delete(parentCatalog);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null);
CatalogUtil.addNearestAlias("new", ref, null, null, null, null, null, null, null, null, null, null, null, null);
assertThat(localCatalog.toFile(), not(anExistingFile()));
assertThat(dotLocalCatalog.toFile(), not(anExistingFile()));
assertThat(parentCatalog.toFile(), not(anExistingFile()));
Expand Down
Loading

0 comments on commit e0c391b

Please sign in to comment.