From cb46d84fbaea70ec28a2c604f68721d7c74aa2ec Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 18 Jun 2018 23:36:31 -0400 Subject: [PATCH] Add initial support for Java This is currently limited to: - one source file at a time (type=object) - in-place compilation (no OBJDIR support) - class files (as opposed to jars) --- src/configure.c | 1 + src/configure.h | 1 + src/makefile.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/src/configure.c b/src/configure.c index f879ceb..a1ae911 100644 --- a/src/configure.c +++ b/src/configure.c @@ -136,6 +136,7 @@ const struct ExtensionType _sExtensionType[] = { "s", OT_ASM_SOURCE }, { "S", OT_ASMPP_SOURCE }, { "sx", OT_ASMPP_SOURCE }, + { "java", OT_JAVA_SOURCE }, { "m", OT_OBJC_SOURCE }, { "mm", OT_OBJCXX_SOURCE }, { "v", OT_VERILOG_SOURCE }, diff --git a/src/configure.h b/src/configure.h index 44381f1..274130c 100644 --- a/src/configure.h +++ b/src/configure.h @@ -100,6 +100,7 @@ typedef enum _ObjectType OT_CXX_SOURCE, OT_ASM_SOURCE, OT_ASMPP_SOURCE, + OT_JAVA_SOURCE, OT_OBJC_SOURCE, OT_OBJCXX_SOURCE, OT_VERILOG_SOURCE, diff --git a/src/makefile.c b/src/makefile.c index 5bff986..6e8b7d9 100644 --- a/src/makefile.c +++ b/src/makefile.c @@ -528,6 +528,7 @@ static void _targets_cflags(Makefile * makefile); static void _targets_cxxflags(Makefile * makefile); static void _targets_exeext(Makefile * makefile); static void _targets_ldflags(Makefile * makefile); +static void _targets_jflags(Makefile * makefile); static void _targets_vflags(Makefile * makefile); static void _binary_ldflags(Makefile * makefile, String const * ldflags); static void _variables_binary(Makefile * makefile, char * done) @@ -546,6 +547,7 @@ static void _variables_binary(Makefile * makefile, char * done) _targets_cflags(makefile); _targets_cxxflags(makefile); _targets_ldflags(makefile); + _targets_jflags(makefile); _targets_vflags(makefile); _targets_exeext(makefile); } @@ -656,6 +658,23 @@ static void _targets_ldflags(Makefile * makefile) } } +static void _targets_jflags(Makefile * makefile) +{ + String const * j; + String const * jff; + String const * jf; + + j = _makefile_get_config(makefile, NULL, "javac"); + jff = _makefile_get_config(makefile, NULL, "jflags_force"); + jf = _makefile_get_config(makefile, NULL, "jflags"); + if(j != NULL || jff != NULL || jf != NULL) + _makefile_output_program(makefile, "javac", 1); + if(jff != NULL) + _makefile_output_variable(makefile, "JFLAGSF", jff); + if(jf != NULL) + _makefile_output_variable(makefile, "JFLAGS", jf); +} + static void _targets_vflags(Makefile * makefile) { String const * v; @@ -1011,6 +1030,10 @@ static int _objs_source(Makefile * makefile, String * source, TargetType tt) source, (tt == TT_LIBTOOL) ? ".lo" : ".o"); break; + case OT_JAVA_SOURCE: + _makefile_print(makefile, "%s%s%s", " $(OBJDIR)", + source, ".class"); + break; case OT_VERILOG_SOURCE: _makefile_print(makefile, "%s%s%s", " $(OBJDIR)", source, ".o"); @@ -1053,6 +1076,7 @@ static void _flags_asm(Makefile * makefile, String const * target); static void _flags_asmpp(Makefile * makefile, String const * target); static void _flags_c(Makefile * makefile, String const * target); static void _flags_cxx(Makefile * makefile, String const * target); +static void _flags_java(Makefile * makefile, String const * target); static void _flags_verilog(Makefile * makefile, String const * target); static int _target_flags(Makefile * makefile, String const * target) { @@ -1103,6 +1127,10 @@ static int _target_flags(Makefile * makefile, String const * target) done[OT_ASM_SOURCE] = 1; _flags_asm(makefile, target); break; + case OT_JAVA_SOURCE: + done[OT_JAVA_SOURCE] = 1; + _flags_java(makefile, target); + break; case OT_OBJC_SOURCE: done[OT_C_SOURCE] = 1; /* fallback */ @@ -1197,6 +1225,17 @@ static void _flags_cxx(Makefile * makefile, String const * target) _makefile_print(makefile, "%c", '\n'); } +static void _flags_java(Makefile * makefile, String const * target) +{ + String const * p; + + _makefile_print(makefile, "%s%s", target, + "_JFLAGS = $(JFLAGSF) $(JFLAGS)"); + if((p = _makefile_get_config(makefile, target, "jflags")) != NULL) + _makefile_print(makefile, " %s", p); + _makefile_print(makefile, "%c", '\n'); +} + static void _flags_verilog(Makefile * makefile, String const * target) { String const * p; @@ -1458,6 +1497,16 @@ static int _target_object(Makefile * makefile, _makefile_print(makefile, " %s", p); _makefile_print(makefile, "%c", '\n'); break; + case OT_JAVA_SOURCE: + _makefile_print(makefile, "\n%s%s%s%s\n%s%s", + target, "_OBJS = ", + "$(OBJDIR)", target, target, "_JFLAGS =" + " $(JFLAGSF) $(JFLAGS)"); + if((p = _makefile_get_config(makefile, target, + "jflags")) != NULL) + _makefile_print(makefile, " %s", p); + _makefile_print(makefile, "%c", '\n'); + break; case OT_VERILOG_SOURCE: _makefile_print(makefile, "\n%s%s%s%s\n%s%s", target, "_OBJS = ", @@ -1832,6 +1881,25 @@ static int _target_source(Makefile * makefile, _makefile_print(makefile, "%s%s%s%s\n", " -c ", source, ".", extension); break; + case OT_JAVA_SOURCE: + _makefile_print(makefile, "%s%s", "\n$(OBJDIR)", + target); + _makefile_print(makefile, "%s%s%s%s", ": ", source, ".", + extension); + source[len] = '.'; /* FIXME ugly */ + _source_depends(makefile, source); + _makefile_print(makefile, "%s", "\n\t"); + if(strchr(source, '/') != NULL) + ret = _source_subdir(makefile, source); + q = _makefile_get_config(makefile, source, "jflags"); + source[len] = '\0'; + _makefile_print(makefile, "%s%s%s", "$(JAVAC) $(", + target, "_JFLAGS)"); + if(q != NULL) + _makefile_print(makefile, " %s", q); + _makefile_print(makefile, "%s%s%s%s%c", " ", source, + ".", extension, '\n'); + break; case OT_VERILOG_SOURCE: if(tt == TT_OBJECT) _makefile_print(makefile, "%s%s", "\n$(OBJDIR)",