Charmonizer module to generate Makefiles
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/0534e4b2 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/0534e4b2 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/0534e4b2 Branch: refs/heads/c-bindings-wip1 Commit: 0534e4b20f51b474d03191658d94e2d1e93ed309 Parents: 76d7bab Author: Nick Wellnhofer <[email protected]> Authored: Sun Dec 23 01:35:58 2012 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Sun Dec 23 03:32:53 2012 +0100 ---------------------------------------------------------------------- charmonizer/buildbin/meld.pl | 1 + charmonizer/src/Charmonizer/Core/Make.c | 300 ++++++++++++++++++++++++++ charmonizer/src/Charmonizer/Core/Make.h | 74 +++++++ 3 files changed, 375 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/0534e4b2/charmonizer/buildbin/meld.pl ---------------------------------------------------------------------- diff --git a/charmonizer/buildbin/meld.pl b/charmonizer/buildbin/meld.pl index 7df3260..71f177d 100755 --- a/charmonizer/buildbin/meld.pl +++ b/charmonizer/buildbin/meld.pl @@ -73,6 +73,7 @@ my @core = qw( ConfWriterPerl ConfWriterRuby HeaderChecker + Make OperatingSystem Util ); http://git-wip-us.apache.org/repos/asf/lucy/blob/0534e4b2/charmonizer/src/Charmonizer/Core/Make.c ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Make.c b/charmonizer/src/Charmonizer/Core/Make.c new file mode 100644 index 0000000..07226f9 --- /dev/null +++ b/charmonizer/src/Charmonizer/Core/Make.c @@ -0,0 +1,300 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <string.h> +#include "Charmonizer/Core/Make.h" +#include "Charmonizer/Core/Compiler.h" +#include "Charmonizer/Core/Util.h" + +struct chaz_MakeVar { + char *name; + char *value; + size_t num_elements; +}; + +struct chaz_MakeRule { + char *targets; + char *prereqs; + char *commands; +}; + +struct chaz_MakeFile { + chaz_MakeVar **vars; + size_t num_vars; + chaz_MakeRule **rules; + size_t num_rules; + char **cleanups; + size_t num_cleanups; +}; + +static const char* +chaz_CC_link_command() { + return "$(CC)"; +} + +static const char* +chaz_CC_link_flags() { + return ""; +} + +static const char* +chaz_CC_link_output_flag() { + return "-o "; +} + +chaz_MakeFile* +chaz_MakeFile_new() { + chaz_MakeFile *makefile = (chaz_MakeFile*)malloc(sizeof(chaz_MakeFile)); + + makefile->vars = (chaz_MakeVar**)malloc(sizeof(chaz_MakeVar*)); + makefile->vars[0] = NULL; + makefile->num_vars = 0; + + makefile->rules = (chaz_MakeRule**)malloc(sizeof(chaz_MakeRule*)); + makefile->rules[0] = NULL; + makefile->num_rules = 0; + + makefile->cleanups = (char**)malloc(sizeof(char*)); + makefile->cleanups[0] = NULL; + makefile->num_cleanups = 0; + + return makefile; +} + +chaz_MakeVar* +chaz_MakeFile_add_var(chaz_MakeFile *makefile, const char *name, + const char *value) { + chaz_MakeVar *var = (chaz_MakeVar*)malloc(sizeof(chaz_MakeVar)); + chaz_MakeVar **vars = makefile->vars; + size_t num_vars = makefile->num_vars + 1; + + var->name = chaz_Util_strdup(name); + var->value = NULL; + var->num_elements = 0; + + if (value) { chaz_MakeVar_append(var, value); } + + vars = (chaz_MakeVar**)realloc(vars, + (num_vars + 1) * sizeof(chaz_MakeVar*)); + vars[num_vars-1] = var; + vars[num_vars] = NULL; + makefile->vars = vars; + makefile->num_vars = num_vars; + + return var; +} + +chaz_MakeRule* +chaz_MakeFile_add_rule(chaz_MakeFile *makefile, const char *target, + const char *prereq) { + chaz_MakeRule *rule = (chaz_MakeRule*)malloc(sizeof(chaz_MakeRule)); + chaz_MakeRule **rules = makefile->rules; + size_t num_rules = makefile->num_rules + 1; + + rule->targets = NULL; + rule->prereqs = NULL; + rule->commands = NULL; + + if (target) { chaz_MakeRule_add_target(rule, target); } + if (prereq) { chaz_MakeRule_add_prereq(rule, prereq); } + + rules = (chaz_MakeRule**)realloc(rules, + (num_rules + 1) * sizeof(chaz_MakeRule*)); + rules[num_rules-1] = rule; + rules[num_rules] = NULL; + makefile->rules = rules; + makefile->num_rules = num_rules; + + return rule; +} + +void +chaz_MakeFile_add_to_cleanup(chaz_MakeFile *makefile, const char *target) { + char *cleanup = chaz_Util_strdup(target); + char **cleanups = makefile->cleanups; + size_t num_cleanups = makefile->num_cleanups + 1; + + cleanups = (char**)realloc(cleanups, (num_cleanups + 1) * sizeof(char*)); + cleanups[num_cleanups-1] = cleanup; + cleanups[num_cleanups] = NULL; + makefile->cleanups = cleanups; + makefile->num_cleanups = num_cleanups; +} + +void +chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe, + const char *objects) { + const char *pattern = "%s %s %s %s%s"; + const char *link = chaz_CC_link_command(); + const char *link_flags = chaz_CC_link_flags(); + const char *output_flag = chaz_CC_link_output_flag(); + chaz_MakeRule *rule; + char *command; + size_t size; + + rule = chaz_MakeFile_add_rule(makefile, exe, objects); + + size = strlen(pattern) + + strlen(link) + + strlen(link_flags) + + strlen(objects) + + strlen(output_flag) + + strlen(exe) + + 50; + command = (char*)malloc(size); + sprintf(command, pattern, link, link_flags, objects, output_flag, exe); + chaz_MakeRule_add_command(rule, command); + + chaz_MakeFile_add_to_cleanup(makefile, exe); +} + +void +chaz_MakeFile_write(chaz_MakeFile *makefile) { + FILE *file; + size_t i; + + file = fopen("Makefile", "w"); + if (!file) { + chaz_Util_die("Can't open Makefile\n"); + } + + for (i = 0; makefile->vars[i]; i++) { + chaz_MakeVar *var = makefile->vars[i]; + fprintf(file, "%s = %s\n", var->name, var->value); + } + fprintf(file, "\n"); + + for (i = 0; makefile->rules[i]; i++) { + chaz_MakeRule *rule = makefile->rules[i]; + fprintf(file, "%s :", rule->targets); + if (rule->prereqs) { + fprintf(file, " %s", rule->prereqs); + } + fprintf(file, "\n"); + if (rule->commands) { + fprintf(file, "%s", rule->commands); + } + fprintf(file, "\n"); + } + + if (makefile->cleanups[0]) { + fprintf(file, "clean :\n\trm -f"); + for (i = 0; makefile->cleanups[i]; i++) { + char *cleanup = makefile->cleanups[i]; + fprintf(file, " \\\n\t %s", cleanup); + } + fprintf(file, "\n\n"); + } + + fprintf(file, "distclean : clean\n"); + fprintf(file, "\trm -f charmonizer charmony.h Makefile\n\n"); + + fclose(file); +} + +void +chaz_MakeVar_append(chaz_MakeVar *var, const char *element) { + char *value; + + if (var->num_elements == 0) { + value = chaz_Util_strdup(element); + } + else { + value = (char*)malloc(strlen(var->value) + strlen(element) + 20); + + if (var->num_elements == 1) { + sprintf(value, "\\\n %s \\\n %s", var->value, element); + } + else { + sprintf(value, "%s \\\n %s", var->value, element); + } + + free(var->value); + } + + var->value = value; + var->num_elements++; +} + +void +chaz_MakeRule_add_target(chaz_MakeRule *rule, const char *target) { + char *targets; + + if (!rule->targets) { + targets = chaz_Util_strdup(target); + } + else { + targets = (char*)malloc(strlen(rule->targets) + strlen(target) + 20); + sprintf(targets, "%s %s", rule->targets, target); + free(rule->targets); + } + + rule->targets = targets; +} + +void +chaz_MakeRule_add_prereq(chaz_MakeRule *rule, const char *prereq) { + char *prereqs; + + if (!rule->prereqs) { + prereqs = chaz_Util_strdup(prereq); + } + else { + prereqs = (char*)malloc(strlen(rule->prereqs) + strlen(prereq) + 20); + sprintf(prereqs, "%s %s", rule->prereqs, prereq); + free(rule->prereqs); + } + + rule->prereqs = prereqs; +} + +void +chaz_MakeRule_add_command(chaz_MakeRule *rule, const char *command) { + char *commands; + + if (!rule->commands) { + commands = (char*)malloc(strlen(command) + 20); + sprintf(commands, "\t%s\n", command); + } + else { + commands = (char*)malloc(strlen(rule->commands) + strlen(command) + 20); + sprintf(commands, "%s\t%s\n", rule->commands, command); + free(rule->commands); + } + + rule->commands = commands; +} + +void +chaz_MakeRule_add_command_make(chaz_MakeRule *rule, const char *dir, + const char *target) { + char *command; + + if (!target) { + command = (char*)malloc(strlen(dir) + 20); + sprintf(command, "make -C %s", dir); + } + else { + command = (char*)malloc(strlen(dir) + strlen(target) + 20); + sprintf(command, "make -C %s %s", dir, target); + } + + chaz_MakeRule_add_command(rule, command); + + free(command); +} + + http://git-wip-us.apache.org/repos/asf/lucy/blob/0534e4b2/charmonizer/src/Charmonizer/Core/Make.h ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Make.h b/charmonizer/src/Charmonizer/Core/Make.h new file mode 100644 index 0000000..dfb8413 --- /dev/null +++ b/charmonizer/src/Charmonizer/Core/Make.h @@ -0,0 +1,74 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Charmonizer/Core/Compiler.h + */ + +#ifndef H_CHAZ_MAKE +#define H_CHAZ_MAKE + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct chaz_MakeFile chaz_MakeFile; +typedef struct chaz_MakeVar chaz_MakeVar; +typedef struct chaz_MakeRule chaz_MakeRule; + +chaz_MakeFile* +chaz_MakeFile_new(); + +chaz_MakeVar* +chaz_MakeFile_add_var(chaz_MakeFile *makefile, const char *name, + const char *value); + +chaz_MakeRule* +chaz_MakeFile_add_rule(chaz_MakeFile *makefile, const char *target, + const char *prereq); + +void +chaz_MakeFile_add_to_cleanup(chaz_MakeFile *makefile, const char *target); + +void +chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe, + const char *objects); + +void +chaz_MakeFile_write(chaz_MakeFile *makefile); + +void +chaz_MakeVar_append(chaz_MakeVar *var, const char *element); + +void +chaz_MakeRule_add_target(chaz_MakeRule *rule, const char *target); + +void +chaz_MakeRule_add_prereq(chaz_MakeRule *rule, const char *prereq); + +void +chaz_MakeRule_add_command(chaz_MakeRule *rule, const char *command); + +void +chaz_MakeRule_add_command_make(chaz_MakeRule *rule, const char *dir, + const char *target); + +#ifdef __cplusplus +} +#endif + +#endif /* H_CHAZ_MAKE */ + +
