You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2012/12/23 23:00:11 UTC

[lucy-commits] [4/7] git commit: refs/heads/c-bindings-wip1 - Generate Makefile for cfc

Generate Makefile for cfc


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/19985059
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/19985059
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/19985059

Branch: refs/heads/c-bindings-wip1
Commit: 199850593caf23764ceba078c4580d1acc592109
Parents: f840b74
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sun Dec 23 02:23:18 2012 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Dec 23 03:32:54 2012 +0100

----------------------------------------------------------------------
 clownfish/compiler/c/.gitignore            |    1 +
 clownfish/compiler/c/Makefile              |   65 --------------
 clownfish/compiler/c/configure             |    2 +-
 clownfish/compiler/common/charmonizer.main |  107 +++++++++++++++++++++++
 4 files changed, 109 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/19985059/clownfish/compiler/c/.gitignore
----------------------------------------------------------------------
diff --git a/clownfish/compiler/c/.gitignore b/clownfish/compiler/c/.gitignore
index ccdc7c7..537df0b 100644
--- a/clownfish/compiler/c/.gitignore
+++ b/clownfish/compiler/c/.gitignore
@@ -1,3 +1,4 @@
 /cfc
 /charmonizer
 /charmony.h
+/Makefile

http://git-wip-us.apache.org/repos/asf/lucy/blob/19985059/clownfish/compiler/c/Makefile
----------------------------------------------------------------------
diff --git a/clownfish/compiler/c/Makefile b/clownfish/compiler/c/Makefile
deleted file mode 100644
index 242af0f..0000000
--- a/clownfish/compiler/c/Makefile
+++ /dev/null
@@ -1,65 +0,0 @@
-CFC_INCLUDE_DIR = ../include
-CFC_SOURCE_DIR = ../src
-LEMON_DIR = ../../../lemon
-
-CFLAGS = -g -I. -I$(CFC_SOURCE_DIR) -I$(CFC_INCLUDE_DIR)
-
-LEMON = $(LEMON_DIR)/lemon
-CFC_PARSE_HEADER = $(CFC_SOURCE_DIR)/CFCParseHeader
-
-CFC = cfc
-CFC_OBJS = \
-    $(CFC_SOURCE_DIR)/CFCBase.o \
-    $(CFC_SOURCE_DIR)/CFCBindAliases.o \
-    $(CFC_SOURCE_DIR)/CFCBindClass.o \
-    $(CFC_SOURCE_DIR)/CFCBindCore.o \
-    $(CFC_SOURCE_DIR)/CFCBindFile.o \
-    $(CFC_SOURCE_DIR)/CFCBindFunction.o \
-    $(CFC_SOURCE_DIR)/CFCBindMethod.o \
-    $(CFC_SOURCE_DIR)/CFCCBlock.o \
-    $(CFC_SOURCE_DIR)/CFCClass.o \
-    $(CFC_SOURCE_DIR)/CFCDocuComment.o \
-    $(CFC_SOURCE_DIR)/CFCDumpable.o \
-    $(CFC_SOURCE_DIR)/CFCFile.o \
-    $(CFC_SOURCE_DIR)/CFCFileSpec.o \
-    $(CFC_SOURCE_DIR)/CFCFunction.o \
-    $(CFC_SOURCE_DIR)/CFCHierarchy.o \
-    $(CFC_SOURCE_DIR)/CFCLexHeader.o \
-    $(CFC_SOURCE_DIR)/CFCMemPool.o \
-    $(CFC_SOURCE_DIR)/CFCMethod.o \
-    $(CFC_SOURCE_DIR)/CFCParamList.o \
-    $(CFC_SOURCE_DIR)/CFCParcel.o \
-    $(CFC_SOURCE_DIR)/CFCParseHeader.o \
-    $(CFC_SOURCE_DIR)/CFCParser.o \
-    $(CFC_SOURCE_DIR)/CFCSymbol.o \
-    $(CFC_SOURCE_DIR)/CFCType.o \
-    $(CFC_SOURCE_DIR)/CFCUtil.o \
-    $(CFC_SOURCE_DIR)/CFCVariable.o \
-    $(CFC_SOURCE_DIR)/CFCVersion.o \
-    cfc.o
-
-all : $(CFC)
-
-$(LEMON) :
-	make -C $(LEMON_DIR)
-
-$(CFC_PARSE_HEADER).c : $(CFC_PARSE_HEADER).h
-
-$(CFC_PARSE_HEADER).c $(CFC_PARSE_HEADER).h : $(LEMON) $(CFC_PARSE_HEADER).y
-	$(LEMON) -q $(CFC_PARSE_HEADER).y
-
-$(CFC_OBJS) : $(CFC_PARSE_HEADER).h
-
-$(CFC) : $(CFC_OBJS)
-	$(CC) $(LDFLAGS) $(CFC_OBJS) $(LOADLIBES) $(LDLIBS) -o $@
-
-clean :
-	rm -f \
-	    $(CFC) \
-	    $(CFC_OBJS) \
-	    $(CFC_PARSE_HEADER).c \
-	    $(CFC_PARSE_HEADER).h
-
-distclean : clean
-	rm -f charmonizer charmony.h
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/19985059/clownfish/compiler/c/configure
----------------------------------------------------------------------
diff --git a/clownfish/compiler/c/configure b/clownfish/compiler/c/configure
index d0fedc0..ab48e9a 100755
--- a/clownfish/compiler/c/configure
+++ b/clownfish/compiler/c/configure
@@ -43,5 +43,5 @@ echo $command
 $command || exit
 
 echo Running charmonizer
-./charmonizer --cc=$CC $@
+./charmonizer --cc=$CC --enable-makefile $@
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/19985059/clownfish/compiler/common/charmonizer.main
----------------------------------------------------------------------
diff --git a/clownfish/compiler/common/charmonizer.main b/clownfish/compiler/common/charmonizer.main
index d9902ea..5643637 100644
--- a/clownfish/compiler/common/charmonizer.main
+++ b/clownfish/compiler/common/charmonizer.main
@@ -26,6 +26,8 @@
 #define MAX_CC_LEN 128
 #define MAX_FLAGS_LEN 2048
 
+#define DIR_SEP "/"
+
 struct CLIArgs {
     char cc_command[MAX_CC_LEN + 1];
     char cc_flags[MAX_FLAGS_LEN + 1];
@@ -75,7 +77,105 @@ S_parse_arguments(int argc, char **argv, struct CLIArgs *args) {
 
 }
 
+static void
+S_write_makefile() {
+    const char *base_dir  = "..";
+    const char *lemon_dir = ".." DIR_SEP ".." DIR_SEP ".." DIR_SEP "lemon";
+    const char *exe_ext   = chaz_OS_exe_ext();
+    const char *obj_ext   = chaz_OS_obj_ext();
+
+    const char *parse_header_y = "$(SRC_DIR)" DIR_SEP "CFCParseHeader.y";
+    const char *parse_header_h = "$(SRC_DIR)" DIR_SEP "CFCParseHeader.h";
+    const char *parse_header_c = "$(SRC_DIR)" DIR_SEP "CFCParseHeader.c";
+
+    char *src_dir;
+    char *scratch;
+
+    chaz_MakeFile *makefile;
+    chaz_MakeVar  *var;
+    chaz_MakeRule *rule;
+
+    makefile = chaz_MakeFile_new();
+
+    src_dir = (char*)malloc(strlen(base_dir) + 20);
+    sprintf(src_dir, "%s" DIR_SEP "src", base_dir);
+    chaz_MakeFile_add_var(makefile, "SRC_DIR", src_dir);
+    scratch = (char*)malloc(strlen(base_dir) + 20);
+    sprintf(scratch, "%s" DIR_SEP "include", base_dir);
+    chaz_MakeFile_add_var(makefile, "INCLUDE_DIR", scratch);
+    free(scratch);
+    chaz_MakeFile_add_var(makefile, "LEMON_DIR", lemon_dir);
+
+    chaz_MakeFile_add_var(makefile, "EXE_EXT", exe_ext);
+    chaz_MakeFile_add_var(makefile, "OBJ_EXT", obj_ext);
+
+    chaz_MakeFile_add_var(makefile, "LEMON_EXE",
+                          "$(LEMON_DIR)" DIR_SEP "lemon$(EXE_EXT)");
+    chaz_MakeFile_add_var(makefile, "CFC_EXE", "cfc$(EXE_EXT)");
+
+    var = chaz_MakeFile_add_var(makefile, "CFLAGS", NULL);
+    chaz_MakeVar_append(var, "-I.");
+    chaz_MakeVar_append(var, "-I$(INCLUDE_DIR)");
+    chaz_MakeVar_append(var, "-I$(SRC_DIR)");
+
+    var = chaz_MakeFile_add_var(makefile, "CFC_OBJS", NULL);
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCBase$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCBindAliases$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCBindClass$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCBindCore$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCBindFile$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCBindFunction$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCBindMethod$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCCBlock$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCClass$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCDocuComment$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCDumpable$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCFile$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCFileSpec$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCFunction$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCHierarchy$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCLexHeader$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCMemPool$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCMethod$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCParamList$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCParcel$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCParseHeader$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCParser$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCSymbol$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCType$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCUtil$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCVariable$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "$(SRC_DIR)" DIR_SEP "CFCVersion$(OBJ_EXT)");
+    chaz_MakeVar_append(var, "cfc$(OBJ_EXT)");
+
+    chaz_MakeFile_add_rule(makefile, "all", "$(CFC_EXE)");
+
+    rule = chaz_MakeFile_add_rule(makefile, "$(LEMON_EXE)", NULL);
+    chaz_MakeRule_add_command_make(rule, "$(LEMON_DIR)", NULL);
+
+    rule = chaz_MakeFile_add_rule(makefile, parse_header_c, NULL);
+    chaz_MakeRule_add_prereq(rule, "$(LEMON_EXE)");
+    chaz_MakeRule_add_prereq(rule, parse_header_y);
+    scratch = (char*)malloc(strlen(parse_header_y) + 20);
+    sprintf(scratch, "$(LEMON_EXE) -q %s", parse_header_y);
+    chaz_MakeRule_add_command(rule, scratch);
+    free(scratch);
+
+    chaz_MakeFile_add_rule(makefile, "$(CFC_OBJS)", parse_header_c);
+
+    chaz_MakeFile_add_exe(makefile, "$(CFC_EXE)", "$(CFC_OBJS)");
+
+    chaz_MakeFile_add_to_cleanup(makefile, "$(CFC_OBJS)");
+    chaz_MakeFile_add_to_cleanup(makefile, parse_header_h);
+    chaz_MakeFile_add_to_cleanup(makefile, parse_header_c);
+
+    chaz_MakeFile_write(makefile);
+
+    free(src_dir);
+}
+
 int main(int argc, char **argv) {
+    size_t i;
     struct CLIArgs args;
     memset(&args, 0, sizeof(struct CLIArgs));
 
@@ -89,6 +189,13 @@ int main(int argc, char **argv) {
     /* Clean up. */
     chaz_Probe_clean_up();
 
+    for (i = 0; i < argc; i++) {
+        if (strncmp(argv[i], "--enable-makefile", 17) == 0) {
+            S_write_makefile();
+            break;
+        }
+    }
+
     return 0;
 }