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] [7/7] git commit: refs/heads/c-bindings-wip1 - Charmonizer module to
generate Makefiles
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 <we...@aevum.de>
Authored: Sun Dec 23 01:35:58 2012 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
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 */
+
+