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 <[email protected]> Authored: Sun Dec 23 02:23:18 2012 +0100 Committer: Nick Wellnhofer <[email protected]> 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; }
