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 2013/05/16 00:28:47 UTC
[lucy-commits] [13/21] git commit: refs/heads/master - Regenerate charmonizer.c
Regenerate charmonizer.c
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/07c27701
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/07c27701
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/07c27701
Branch: refs/heads/master
Commit: 07c277014e4eb08fdc6d798cfa56450324f4ad05
Parents: 86e34de
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Mon May 13 22:31:25 2013 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Wed May 15 19:23:22 2013 +0200
----------------------------------------------------------------------
clownfish/compiler/common/charmonizer.c | 574 ++++++++++++++------
clownfish/runtime/common/charmonizer.c | 448 ++++++++++++----
common/charmonizer.c | 762 +++++++++++++++++---------
3 files changed, 1256 insertions(+), 528 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/07c27701/clownfish/compiler/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/common/charmonizer.c b/clownfish/compiler/common/charmonizer.c
index 5c74620..6119e88 100644
--- a/clownfish/compiler/common/charmonizer.c
+++ b/clownfish/compiler/common/charmonizer.c
@@ -36,12 +36,58 @@
/***************************************************************************/
+#line 21 "src/Charmonizer/Core/SharedLibrary.h"
+/* Charmonizer/Core/SharedLibrary.h
+ */
+
+#ifndef H_CHAZ_SHARED_LIB
+#define H_CHAZ_SHARED_LIB
+
+typedef struct chaz_SharedLib chaz_SharedLib;
+
+chaz_SharedLib*
+chaz_SharedLib_new(const char *name, const char *version,
+ const char *major_version);
+
+void
+chaz_SharedLib_destroy(chaz_SharedLib *flags);
+
+const char*
+chaz_SharedLib_get_name(chaz_SharedLib *lib);
+
+const char*
+chaz_SharedLib_get_version(chaz_SharedLib *lib);
+
+const char*
+chaz_SharedLib_get_major_version(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_major_version_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_no_version_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_implib_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_export_filename(chaz_SharedLib *lib);
+
+#endif /* H_CHAZ_SHARED_LIB */
+
+
+
+/***************************************************************************/
+
#line 21 "src/Charmonizer/Core/CFlags.h"
-/* Charmonizer/Core/Compiler.h
+/* Charmonizer/Core/CFlags.h
*/
-#ifndef H_CHAZ_FLAGS
-#define H_CHAZ_FLAGS
+#ifndef H_CHAZ_CFLAGS
+#define H_CHAZ_CFLAGS
#define CHAZ_CFLAGS_STYLE_POSIX 1
#define CHAZ_CFLAGS_STYLE_GNU 2
@@ -96,18 +142,25 @@ void
chaz_CFlags_link_shared_library(chaz_CFlags *flags);
void
+chaz_CFlags_set_shared_library_version(chaz_CFlags *flags,
+ chaz_SharedLib *lib);
+
+void
chaz_CFlags_set_link_output(chaz_CFlags *flags, const char *filename);
void
chaz_CFlags_add_library_path(chaz_CFlags *flags, const char *directory);
void
-chaz_CFlags_add_library(chaz_CFlags *flags, const char *library);
+chaz_CFlags_add_library(chaz_CFlags *flags, chaz_SharedLib *lib);
+
+void
+chaz_CFlags_add_external_library(chaz_CFlags *flags, const char *library);
void
chaz_CFlags_enable_code_coverage(chaz_CFlags *flags);
-#endif /* H_CHAZ_FLAGS */
+#endif /* H_CHAZ_CFLAGS */
@@ -172,11 +225,6 @@ chaz_CC_get_cc(void);
const char*
chaz_CC_get_cflags(void);
-/* Accessor for `cflags_style`.
- */
-int
-chaz_CC_get_cflags_style(void);
-
/* Accessor for `extra_cflags`.
*/
chaz_CFlags*
@@ -187,6 +235,11 @@ chaz_CC_get_extra_cflags(void);
chaz_CFlags*
chaz_CC_get_temp_cflags(void);
+/* Return a new CFlags object.
+ */
+chaz_CFlags*
+chaz_CC_new_cflags(void);
+
/* Return the extension for a compiled object.
*/
const char*
@@ -204,9 +257,6 @@ chaz_CC_msvc_version_num(void);
const char*
chaz_CC_link_command(void);
-char*
-chaz_CC_shared_lib_file(const char *name);
-
#endif /* H_CHAZ_COMPILER */
@@ -416,19 +466,21 @@ chaz_HeadCheck_contains_member(const char *struct_name, const char *member,
/***************************************************************************/
#line 21 "src/Charmonizer/Core/Make.h"
-/* Charmonizer/Core/Compiler.h
+/* Charmonizer/Core/Make.h
*/
#ifndef H_CHAZ_MAKE
#define H_CHAZ_MAKE
/* #include "Charmonizer/Core/CFlags.h" */
+/* #include "Charmonizer/Core/SharedLib.h" */
typedef struct chaz_MakeFile chaz_MakeFile;
typedef struct chaz_MakeVar chaz_MakeVar;
typedef struct chaz_MakeRule chaz_MakeRule;
-typedef void (*chaz_Make_list_files_callback_t)(char *file, void *context);
+typedef void (*chaz_Make_list_files_callback_t)(const char *dir, char *file,
+ void *context);
/** Initialize the environment.
*/
@@ -539,14 +591,31 @@ chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
* to the list of files to clean.
*
* @param makefile The makefile.
- * @param name The name of the shared library without prefix or extension.
+ * @param lib The shared library.
* @param sources The list of source files.
* @param link_flags Additional link flags.
*/
chaz_MakeRule*
-chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, const char *name,
+chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, chaz_SharedLib *lib,
const char *sources, chaz_CFlags *link_flags);
+/** Add a rule to build the lemon parser generator.
+ *
+ * @param makefile The makefile.
+ * @param dir The lemon directory.
+ */
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_exe(chaz_MakeFile *makefile, const char *dir);
+
+/** Add a rule for a lemon grammar.
+ *
+ * @param makefile The makefile.
+ * @param base_name The filename of the grammar without extension.
+ */
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_grammar(chaz_MakeFile *makefile,
+ const char *base_name);
+
/** Write the makefile to a file named 'Makefile' in the current directory.
*
* @param makefile The makefile.
@@ -696,6 +765,11 @@ chaz_OS_shared_lib_ext(void);
const char*
chaz_OS_dev_null(void);
+/* Return the directory separator on this system.
+ */
+const char*
+chaz_OS_dir_sep(void);
+
/* Return the shell type of this system.
*/
int
@@ -1162,12 +1236,136 @@ void chaz_UnusedVars_run(void);
/***************************************************************************/
+#line 17 "src/Charmonizer/Core/SharedLibrary.c"
+#include <string.h>
+#include <stdlib.h>
+/* #include "Charmonizer/Core/SharedLib.h" */
+/* #include "Charmonizer/Core/Compiler.h" */
+/* #include "Charmonizer/Core/Util.h" */
+/* #include "Charmonizer/Core/OperatingSystem.h" */
+
+struct chaz_SharedLib {
+ char *name;
+ char *version;
+ char *major_version;
+};
+
+static char*
+S_build_filename(chaz_SharedLib *lib, const char *version, const char *ext);
+
+static const char*
+S_get_prefix(void);
+
+chaz_SharedLib*
+chaz_SharedLib_new(const char *name, const char *version,
+ const char *major_version) {
+ chaz_SharedLib *lib = (chaz_SharedLib*)malloc(sizeof(chaz_SharedLib));
+ lib->name = chaz_Util_strdup(name);
+ lib->version = chaz_Util_strdup(version);
+ lib->major_version = chaz_Util_strdup(major_version);
+ return lib;
+}
+
+void
+chaz_SharedLib_destroy(chaz_SharedLib *lib) {
+ free(lib->name);
+ free(lib->version);
+ free(lib->major_version);
+ free(lib);
+}
+
+const char*
+chaz_SharedLib_get_name(chaz_SharedLib *lib) {
+ return lib->name;
+}
+
+const char*
+chaz_SharedLib_get_version(chaz_SharedLib *lib) {
+ return lib->version;
+}
+
+const char*
+chaz_SharedLib_get_major_version(chaz_SharedLib *lib) {
+ return lib->major_version;
+}
+
+char*
+chaz_SharedLib_filename(chaz_SharedLib *lib) {
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ if (strcmp(shlib_ext, ".dll") == 0) {
+ return S_build_filename(lib, lib->major_version, shlib_ext);
+ }
+ else {
+ return S_build_filename(lib, lib->version, shlib_ext);
+ }
+}
+
+char*
+chaz_SharedLib_major_version_filename(chaz_SharedLib *lib) {
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ return S_build_filename(lib, lib->major_version, shlib_ext);
+}
+
+char*
+chaz_SharedLib_no_version_filename(chaz_SharedLib *lib) {
+ const char *prefix = S_get_prefix();
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ return chaz_Util_join("", prefix, lib->name, shlib_ext, NULL);
+}
+
+char*
+chaz_SharedLib_implib_filename(chaz_SharedLib *lib) {
+ return S_build_filename(lib, lib->major_version, ".lib");
+}
+
+char*
+chaz_SharedLib_export_filename(chaz_SharedLib *lib) {
+ return S_build_filename(lib, lib->major_version, ".exp");
+}
+
+static char*
+S_build_filename(chaz_SharedLib *lib, const char *version, const char *ext) {
+ const char *prefix = S_get_prefix();
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ if (strcmp(shlib_ext, ".dll") == 0) {
+ return chaz_Util_join("", prefix, lib->name, "-", version, ext, NULL);
+ }
+ else if (strcmp(shlib_ext, ".dylib") == 0) {
+ return chaz_Util_join("", prefix, lib->name, ".", version, ext, NULL);
+ }
+ else {
+ return chaz_Util_join("", prefix, lib->name, ext, ".", version, NULL);
+ }
+}
+
+static const char*
+S_get_prefix() {
+ if (chaz_CC_msvc_version_num()) {
+ return "";
+ }
+ else if (chaz_OS_is_cygwin()) {
+ return "cyg";
+ }
+ else {
+ return "lib";
+ }
+}
+
+
+
+/***************************************************************************/
+
#line 17 "src/Charmonizer/Core/CFlags.c"
#include <string.h>
#include <stdlib.h>
-/* #include "Charmonizer/Core/Flags.h" */
+/* #include "Charmonizer/Core/CFlags.h" */
/* #include "Charmonizer/Core/Util.h" */
/* #include "Charmonizer/Core/OperatingSystem.h" */
+/* #include "Charmonizer/Core/SharedLibrary.h" */
struct chaz_CFlags {
int style;
@@ -1362,7 +1560,7 @@ chaz_CFlags_link_shared_library(chaz_CFlags *flags) {
string = "/DLL";
}
else if (flags->style == CHAZ_CFLAGS_STYLE_GNU) {
- if (chaz_OS_is_darwin()) {
+ if (strcmp(chaz_OS_shared_lib_ext(), ".dylib") == 0) {
string = "-dynamiclib";
}
else {
@@ -1377,6 +1575,30 @@ chaz_CFlags_link_shared_library(chaz_CFlags *flags) {
}
void
+chaz_CFlags_set_shared_library_version(chaz_CFlags *flags,
+ chaz_SharedLib *lib) {
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+ char *string;
+
+ if (flags->style != CHAZ_CFLAGS_STYLE_GNU
+ || strcmp(shlib_ext, ".dll") == 0) {
+ return;
+ }
+
+ if (strcmp(chaz_OS_shared_lib_ext(), ".dylib") == 0) {
+ const char *version = chaz_SharedLib_get_version(lib);
+ string = chaz_Util_join(" ", "-current_version", version, NULL);
+ }
+ else {
+ char *soname = chaz_SharedLib_major_version_filename(lib);
+ string = chaz_Util_join("", "-Wl,-soname,", soname, NULL);
+ free(soname);
+ }
+ chaz_CFlags_append(flags, string);
+ free(string);
+}
+
+void
chaz_CFlags_set_link_output(chaz_CFlags *flags, const char *filename) {
const char *output;
char *string;
@@ -1413,13 +1635,26 @@ chaz_CFlags_add_library_path(chaz_CFlags *flags, const char *directory) {
}
void
-chaz_CFlags_add_library(chaz_CFlags *flags, const char *library) {
+chaz_CFlags_add_library(chaz_CFlags *flags, chaz_SharedLib *lib) {
+ char *filename;
+ if (flags->style == CHAZ_CFLAGS_STYLE_MSVC) {
+ filename = chaz_SharedLib_implib_filename(lib);
+ }
+ else {
+ filename = chaz_SharedLib_filename(lib);
+ }
+ chaz_CFlags_append(flags, filename);
+ free(filename);
+}
+
+void
+chaz_CFlags_add_external_library(chaz_CFlags *flags, const char *library) {
char *string;
if (flags->style == CHAZ_CFLAGS_STYLE_MSVC) {
string = chaz_Util_join("", library, ".lib", NULL);
}
else {
- string = chaz_Util_join("", "-l ", library, NULL);
+ string = chaz_Util_join(" ", "-l", library, NULL);
}
chaz_CFlags_append(flags, string);
free(string);
@@ -1746,11 +1981,6 @@ chaz_CC_get_cflags(void) {
return chaz_CC.cflags;
}
-int
-chaz_CC_get_cflags_style(void) {
- return chaz_CC.cflags_style;
-}
-
chaz_CFlags*
chaz_CC_get_extra_cflags(void) {
return chaz_CC.extra_cflags;
@@ -1761,6 +1991,11 @@ chaz_CC_get_temp_cflags(void) {
return chaz_CC.temp_cflags;
}
+chaz_CFlags*
+chaz_CC_new_cflags(void) {
+ return chaz_CFlags_new(chaz_CC.cflags_style);
+}
+
const char*
chaz_CC_obj_ext(void) {
return chaz_CC.obj_ext;
@@ -1793,21 +2028,6 @@ chaz_CC_link_command() {
}
}
-char*
-chaz_CC_shared_lib_file(const char *name) {
- const char *prefix = "";
- const char *shlib_ext = chaz_OS_shared_lib_ext();
- if (!chaz_CC.intval__MSC_VER) {
- if (chaz_OS_is_cygwin()) {
- prefix = "cyg";
- }
- else {
- prefix = "lib";
- }
- }
- return chaz_Util_join("", prefix, name, shlib_ext, NULL);
-}
-
/***************************************************************************/
@@ -3070,6 +3290,9 @@ chaz_Make_audition(const char *make) {
chaz_MakeFile*
chaz_MakeFile_new() {
chaz_MakeFile *makefile = (chaz_MakeFile*)malloc(sizeof(chaz_MakeFile));
+ const char *exe_ext = chaz_OS_exe_ext();
+ const char *obj_ext = chaz_CC_obj_ext();
+ char *generated;
makefile->vars = (chaz_MakeVar**)malloc(sizeof(chaz_MakeVar*));
makefile->vars[0] = NULL;
@@ -3082,10 +3305,11 @@ chaz_MakeFile_new() {
makefile->clean = S_new_rule("clean", NULL);
makefile->distclean = S_new_rule("distclean", "clean");
- chaz_MakeRule_add_rm_command(makefile->distclean,
- "charmonizer$(EXE_EXT) charmonizer$(OBJ_EXT)"
- " charmony.h Makefile");
+ generated = chaz_Util_join("", "charmonizer", exe_ext, " charmonizer",
+ obj_ext, " charmony.h Makefile", NULL);
+ chaz_MakeRule_add_rm_command(makefile->distclean, generated);
+ free(generated);
return makefile;
}
@@ -3165,8 +3389,7 @@ chaz_MakeFile_distclean_rule(chaz_MakeFile *makefile) {
chaz_MakeRule*
chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe,
const char *sources, chaz_CFlags *link_flags) {
- int cflags_style = chaz_CC_get_cflags_style();
- chaz_CFlags *local_flags = chaz_CFlags_new(cflags_style);
+ chaz_CFlags *local_flags = chaz_CC_new_cflags();
const char *link = chaz_CC_link_command();
const char *link_flags_string = "";
const char *local_flags_string;
@@ -3178,6 +3401,9 @@ chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe,
if (link_flags) {
link_flags_string = chaz_CFlags_get_string(link_flags);
}
+ if (chaz_CC_msvc_version_num()) {
+ chaz_CFlags_append(local_flags, "/nologo");
+ }
chaz_CFlags_set_link_output(local_flags, exe);
local_flags_string = chaz_CFlags_get_string(local_flags);
command = chaz_Util_join(" ", link, sources, link_flags_string,
@@ -3194,8 +3420,7 @@ chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe,
chaz_MakeRule*
chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
const char *sources, chaz_CFlags *cflags) {
- int cflags_style = chaz_CC_get_cflags_style();
- chaz_CFlags *local_flags = chaz_CFlags_new(cflags_style);
+ chaz_CFlags *local_flags = chaz_CC_new_cflags();
const char *cc = chaz_CC_get_cc();
const char *cflags_string = "";
const char *local_flags_string;
@@ -3207,6 +3432,9 @@ chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
if (cflags) {
cflags_string = chaz_CFlags_get_string(cflags);
}
+ if (chaz_CC_msvc_version_num()) {
+ chaz_CFlags_append(local_flags, "/nologo");
+ }
chaz_CFlags_set_output_exe(local_flags, exe);
local_flags_string = chaz_CFlags_get_string(local_flags);
command = chaz_Util_join(" ", cc, sources, cflags_string,
@@ -3222,45 +3450,91 @@ chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
}
chaz_MakeRule*
-chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, const char *name,
+chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, chaz_SharedLib *lib,
const char *sources, chaz_CFlags *link_flags) {
- int cflags_style = chaz_CC_get_cflags_style();
- chaz_CFlags *local_flags = chaz_CFlags_new(cflags_style);
+ chaz_CFlags *local_flags = chaz_CC_new_cflags();
const char *link = chaz_CC_link_command();
const char *link_flags_string = "";
const char *local_flags_string;
chaz_MakeRule *rule;
- char *shared_lib;
+ char *filename;
char *command;
- shared_lib = chaz_CC_shared_lib_file(name);
- rule = chaz_MakeFile_add_rule(makefile, shared_lib, sources);
+ filename = chaz_SharedLib_filename(lib);
+ rule = chaz_MakeFile_add_rule(makefile, filename, sources);
if (link_flags) {
link_flags_string = chaz_CFlags_get_string(link_flags);
}
+ if (chaz_CC_msvc_version_num()) {
+ chaz_CFlags_append(local_flags, "/nologo");
+ }
chaz_CFlags_link_shared_library(local_flags);
- chaz_CFlags_set_link_output(local_flags, shared_lib);
+ chaz_CFlags_set_shared_library_version(local_flags, lib);
+ chaz_CFlags_set_link_output(local_flags, filename);
local_flags_string = chaz_CFlags_get_string(local_flags);
command = chaz_Util_join(" ", link, sources, link_flags_string,
local_flags_string, NULL);
chaz_MakeRule_add_command(rule, command);
- chaz_MakeRule_add_rm_command(makefile->clean, shared_lib);
+ chaz_MakeRule_add_rm_command(makefile->clean, filename);
if (chaz_CC_msvc_version_num()) {
/* Remove import library and export file under MSVC. */
- char *filename;
- filename = chaz_Util_join("", name, ".lib", NULL);
- chaz_MakeRule_add_rm_command(makefile->clean, filename);
- free(filename);
- filename = chaz_Util_join("", name, ".exp", NULL);
- chaz_MakeRule_add_rm_command(makefile->clean, filename);
- free(filename);
+ char *lib_filename = chaz_SharedLib_implib_filename(lib);
+ char *exp_filename = chaz_SharedLib_export_filename(lib);
+ chaz_MakeRule_add_rm_command(makefile->clean, lib_filename);
+ chaz_MakeRule_add_rm_command(makefile->clean, exp_filename);
+ free(lib_filename);
+ free(exp_filename);
}
chaz_CFlags_destroy(local_flags);
- free(shared_lib);
+ free(filename);
+ free(command);
+ return rule;
+}
+
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_exe(chaz_MakeFile *makefile, const char *dir) {
+ chaz_CFlags *cflags = chaz_CC_new_cflags();
+ chaz_MakeRule *rule;
+ const char *dir_sep = chaz_OS_dir_sep();
+ const char *exe_ext = chaz_OS_exe_ext();
+ char *lemon_exe = chaz_Util_join("", dir, dir_sep, "lemon", exe_ext, NULL);
+ char *lemon_c = chaz_Util_join(dir_sep, dir, "lemon.c", NULL);
+
+ chaz_CFlags_enable_optimization(cflags);
+ chaz_MakeFile_add_var(makefile, "LEMON_EXE", lemon_exe);
+ rule = chaz_MakeFile_add_compiled_exe(makefile, "$(LEMON_EXE)", lemon_c,
+ cflags);
+
+ chaz_CFlags_destroy(cflags);
+ free(lemon_c);
+ free(lemon_exe);
+ return rule;
+}
+
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_grammar(chaz_MakeFile *makefile,
+ const char *base_name) {
+ char *c_file = chaz_Util_join(".", base_name, "c", NULL);
+ char *h_file = chaz_Util_join(".", base_name, "h", NULL);
+ char *y_file = chaz_Util_join(".", base_name, "y", NULL);
+ char *command = chaz_Util_join(" ", "$(LEMON_EXE) -q", y_file, NULL);
+
+ chaz_MakeRule *rule = chaz_MakeFile_add_rule(makefile, c_file, y_file);
+ chaz_MakeRule *clean_rule = chaz_MakeFile_clean_rule(makefile);
+
+ chaz_MakeRule_add_prereq(rule, "$(LEMON_EXE)");
+ chaz_MakeRule_add_command(rule, command);
+
+ chaz_MakeRule_add_rm_command(clean_rule, h_file);
+ chaz_MakeRule_add_rm_command(clean_rule, c_file);
+
+ free(c_file);
+ free(h_file);
+ free(y_file);
free(command);
return rule;
}
@@ -3292,7 +3566,7 @@ chaz_MakeFile_write(chaz_MakeFile *makefile) {
/* Inference rule for .c files. */
fprintf(out, ".c.obj :\n");
if (chaz_CC_msvc_version_num()) {
- fprintf(out, "\t$(CC) $(CFLAGS) /c $< /Fo$@\n\n");
+ fprintf(out, "\t$(CC) /nologo $(CFLAGS) /c $< /Fo$@\n\n");
}
else {
fprintf(out, "\t$(CC) $(CFLAGS) -c $< -o $@\n\n");
@@ -3564,7 +3838,7 @@ chaz_Make_list_files(const char *dir, const char *ext,
file);
}
- callback(file + prefix_len, context);
+ callback(dir, file + prefix_len, context);
}
free(prefix);
@@ -3591,11 +3865,12 @@ chaz_Make_list_files(const char *dir, const char *ext,
static struct {
char name[CHAZ_OS_NAME_MAX+1];
char dev_null[20];
+ char dir_sep[2];
char exe_ext[5];
char shared_lib_ext[7];
char local_command_start[3];
int shell_type;
-} chaz_OS = { "", "", "", "", "", 0 };
+} chaz_OS = { "", "", "", "", "", "", 0 };
void
chaz_OS_init(void) {
@@ -3627,6 +3902,7 @@ chaz_OS_init(void) {
free(uname);
strcpy(chaz_OS.dev_null, "/dev/null");
+ strcpy(chaz_OS.dir_sep, "/");
strcpy(chaz_OS.exe_ext, "");
if (memcmp(chaz_OS.name, "darwin", 6) == 0) {
strcpy(chaz_OS.shared_lib_ext, ".dylib");
@@ -3642,6 +3918,7 @@ chaz_OS_init(void) {
else if (chaz_Util_can_open_file("nul")) {
strcpy(chaz_OS.name, "windows");
strcpy(chaz_OS.dev_null, "nul");
+ strcpy(chaz_OS.dir_sep, "\\");
strcpy(chaz_OS.exe_ext, ".exe");
strcpy(chaz_OS.shared_lib_ext, ".dll");
strcpy(chaz_OS.local_command_start, ".\\");
@@ -3683,6 +3960,11 @@ chaz_OS_dev_null(void) {
return chaz_OS.dev_null;
}
+const char*
+chaz_OS_dir_sep(void) {
+ return chaz_OS.dir_sep;
+}
+
int
chaz_OS_shell_type(void) {
return chaz_OS.shell_type;
@@ -4288,23 +4570,9 @@ chaz_DirManip_try_rmdir(void) {
if (chaz_DirManip_compile_rmdir("direct.h")) { return; }
}
-static int
-chaz_DirManip_is_cygwin(void) {
- static int is_cygwin = -1;
- static const char cygwin_code[] =
- CHAZ_QUOTE(#ifndef __CYGWIN__ )
- CHAZ_QUOTE( #error "Not Cygwin" )
- CHAZ_QUOTE(#endif )
- CHAZ_QUOTE(int main() { return 0; } );
- if (is_cygwin == -1) {
- is_cygwin = chaz_CC_test_compile(cygwin_code);
- }
- return is_cygwin;
-}
-
void
chaz_DirManip_run(void) {
- char dir_sep[3];
+ const char *dir_sep = chaz_OS_dir_sep();
int remove_zaps_dirs = false;
int has_dirent_h = chaz_HeadCheck_check_header("dirent.h");
int has_direct_h = chaz_HeadCheck_check_header("direct.h");
@@ -4362,16 +4630,6 @@ chaz_DirManip_run(void) {
chaz_ConfWriter_add_def("MAKEDIR_MODE_IGNORED", "1");
}
- if (chaz_DirManip_is_cygwin()) {
- strcpy(dir_sep, "/");
- }
- else if (chaz_HeadCheck_check_header("windows.h")) {
- strcpy(dir_sep, "\\\\");
- }
- else {
- strcpy(dir_sep, "/");
- }
-
{
char scratch[5];
sprintf(scratch, "\"%s\"", dir_sep);
@@ -5167,12 +5425,6 @@ chaz_UnusedVars_run(void) {
/* #include "Charmonizer/Probe.h" */
/* #include "Charmonizer/Probe/Integers.h" */
-#if defined(_WIN32) && !defined(__CYGWIN__)
- #define DIR_SEP "\\"
-#else
- #define DIR_SEP "/"
-#endif
-
typedef struct SourceFileContext {
chaz_MakeVar *common_objs;
chaz_MakeVar *test_cfc_objs;
@@ -5214,19 +5466,11 @@ S_add_compiler_flags(struct chaz_CLIArgs *args) {
}
static void
-S_add_common_cflags(chaz_CFlags *cflags) {
- if (chaz_CC_msvc_version_num()) {
- chaz_CFlags_append(cflags, "/nologo");
- }
- chaz_CFlags_enable_optimization(cflags);
-}
-
-static void
-S_source_file_callback(char *file, void *context) {
+S_source_file_callback(const char *dir, char *file, void *context) {
SourceFileContext *sfc = (SourceFileContext*)context;
+ const char *dir_sep = chaz_OS_dir_sep();
+ const char *obj_ext = chaz_CC_obj_ext();
size_t file_len = strlen(file);
- size_t obj_file_size;
- const char *pattern;
char *obj_file;
if (strcmp(file, "CFCParseHeader.c") == 0) { return; }
@@ -5238,11 +5482,7 @@ S_source_file_callback(char *file, void *context) {
}
file[file_len-2] = '\0';
- pattern = "$(SRC_DIR)" DIR_SEP "%s$(OBJ_EXT)";
- obj_file_size = strlen(pattern) + file_len + 10;
- obj_file = (char*)malloc(obj_file_size);
- sprintf(obj_file, pattern, file);
-
+ obj_file = chaz_Util_join("", dir, dir_sep, file, obj_ext, NULL);
if (strlen(file) >= 7 && memcmp(file, "CFCTest", 7) == 0) {
chaz_MakeVar_append(sfc->test_cfc_objs, obj_file);
}
@@ -5258,14 +5498,20 @@ S_write_makefile(struct chaz_CLIArgs *args) {
SourceFileContext sfc;
const char *base_dir = "..";
+ const char *dir_sep = chaz_OS_dir_sep();
const char *exe_ext = chaz_OS_exe_ext();
const char *obj_ext = chaz_CC_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 *lemon_dir = chaz_Util_join(dir_sep, base_dir, "..", "..", "lemon",
+ NULL);
+ char *src_dir = chaz_Util_join(dir_sep, base_dir, "src", NULL);
+ char *include_dir = chaz_Util_join(dir_sep, base_dir, "include", NULL);
+ char *parse_header = chaz_Util_join(dir_sep, src_dir, "CFCParseHeader",
+ NULL);
+ char *cfc_exe = chaz_Util_join("", "cfc", exe_ext, NULL);
+ char *test_cfc_exe = chaz_Util_join("", "t", dir_sep, "test_cfc", exe_ext,
+ NULL);
- char *src_dir;
char *scratch;
chaz_MakeFile *makefile;
@@ -5273,44 +5519,28 @@ S_write_makefile(struct chaz_CLIArgs *args) {
chaz_MakeRule *rule;
chaz_MakeRule *clean_rule;
- int cflags_style = chaz_CC_get_cflags_style();
chaz_CFlags *extra_cflags = chaz_CC_get_extra_cflags();
chaz_CFlags *makefile_cflags;
chaz_CFlags *link_flags;
- chaz_CFlags *lemon_cflags;
printf("Creating Makefile...\n");
- src_dir = (char*)malloc(strlen(base_dir) + 20);
- sprintf(src_dir, "%s" DIR_SEP "src", base_dir);
-
makefile = chaz_MakeFile_new();
/* Directories */
chaz_MakeFile_add_var(makefile, "BASE_DIR", base_dir);
- chaz_MakeFile_add_var(makefile, "SRC_DIR", src_dir);
- chaz_MakeFile_add_var(makefile, "INCLUDE_DIR",
- "$(BASE_DIR)" DIR_SEP "include");
- chaz_MakeFile_add_var(makefile, "LEMON_DIR",
- "$(BASE_DIR)" DIR_SEP ".." DIR_SEP ".." DIR_SEP
- "lemon");
-
- /* File extensions */
-
- chaz_MakeFile_add_var(makefile, "EXE_EXT", exe_ext);
- chaz_MakeFile_add_var(makefile, "OBJ_EXT", obj_ext);
/* C compiler */
chaz_MakeFile_add_var(makefile, "CC", chaz_CC_get_cc());
- makefile_cflags = chaz_CFlags_new(cflags_style);
- S_add_common_cflags(makefile_cflags);
+ makefile_cflags = chaz_CC_new_cflags();
+ chaz_CFlags_enable_optimization(makefile_cflags);
chaz_CFlags_add_include_dir(makefile_cflags, ".");
- chaz_CFlags_add_include_dir(makefile_cflags, "$(INCLUDE_DIR)");
- chaz_CFlags_add_include_dir(makefile_cflags, "$(SRC_DIR)");
+ chaz_CFlags_add_include_dir(makefile_cflags, include_dir);
+ chaz_CFlags_add_include_dir(makefile_cflags, src_dir);
if (args->code_coverage) {
chaz_CFlags_enable_code_coverage(makefile_cflags);
}
@@ -5329,65 +5559,56 @@ S_write_makefile(struct chaz_CLIArgs *args) {
chaz_Make_list_files(src_dir, "c", S_source_file_callback, &sfc);
- chaz_MakeVar_append(sfc.common_objs,
- "$(SRC_DIR)" DIR_SEP "CFCParseHeader$(OBJ_EXT)");
- chaz_MakeVar_append(sfc.test_cfc_objs, "t" DIR_SEP "test_cfc$(OBJ_EXT)");
-
- chaz_MakeFile_add_var(makefile, "CFC_OBJS", "cfc$(OBJ_EXT)");
+ scratch = chaz_Util_join("", parse_header, obj_ext, NULL);
+ chaz_MakeVar_append(sfc.common_objs, scratch);
+ free(scratch);
- /* Executables */
+ scratch = chaz_Util_join("", "t", dir_sep, "test_cfc", obj_ext, NULL);
+ chaz_MakeVar_append(sfc.test_cfc_objs, scratch);
+ free(scratch);
- chaz_MakeFile_add_var(makefile, "LEMON_EXE",
- "$(LEMON_DIR)" DIR_SEP "lemon$(EXE_EXT)");
- chaz_MakeFile_add_var(makefile, "CFC_EXE", "cfc$(EXE_EXT)");
- chaz_MakeFile_add_var(makefile, "TEST_CFC_EXE",
- "t" DIR_SEP "test_cfc$(EXE_EXT)");
+ scratch = chaz_Util_join("", "cfc", obj_ext, NULL);
+ chaz_MakeFile_add_var(makefile, "CFC_OBJS", scratch);
+ free(scratch);
/* Rules */
- chaz_MakeFile_add_rule(makefile, "all", "$(CFC_EXE)");
+ chaz_MakeFile_add_rule(makefile, "all", cfc_exe);
- lemon_cflags = chaz_CFlags_new(cflags_style);
- S_add_common_cflags(lemon_cflags);
- chaz_MakeFile_add_compiled_exe(makefile, "$(LEMON_EXE)",
- "$(LEMON_DIR)" DIR_SEP "lemon.c",
- lemon_cflags);
- chaz_CFlags_destroy(lemon_cflags);
+ chaz_MakeFile_add_lemon_exe(makefile, lemon_dir);
+ chaz_MakeFile_add_lemon_grammar(makefile, parse_header);
- 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);
+ /*
+ * The dependency is actually on CFCParseHeader.h, but make doesn't cope
+ * well with multiple output files.
+ */
+ scratch = chaz_Util_join(".", parse_header, "c", NULL);
+ chaz_MakeFile_add_rule(makefile, "$(COMMON_OBJS)", scratch);
free(scratch);
- chaz_MakeFile_add_rule(makefile, "$(COMMON_OBJS)", parse_header_c);
-
- link_flags = chaz_CFlags_new(cflags_style);
+ link_flags = chaz_CC_new_cflags();
if (chaz_CC_msvc_version_num()) {
chaz_CFlags_append(link_flags, "/nologo");
}
if (args->code_coverage) {
chaz_CFlags_enable_code_coverage(link_flags);
}
- chaz_MakeFile_add_exe(makefile, "$(CFC_EXE)",
- "$(COMMON_OBJS) $(CFC_OBJS)", link_flags);
- chaz_MakeFile_add_exe(makefile, "$(TEST_CFC_EXE)",
+ chaz_MakeFile_add_exe(makefile, cfc_exe, "$(COMMON_OBJS) $(CFC_OBJS)",
+ link_flags);
+ chaz_MakeFile_add_exe(makefile, test_cfc_exe,
"$(COMMON_OBJS) $(TEST_CFC_OBJS)", link_flags);
chaz_CFlags_destroy(link_flags);
- rule = chaz_MakeFile_add_rule(makefile, "test", "$(TEST_CFC_EXE)");
- chaz_MakeRule_add_command(rule, "$(TEST_CFC_EXE)");
+ rule = chaz_MakeFile_add_rule(makefile, "test", test_cfc_exe);
+ chaz_MakeRule_add_command(rule, test_cfc_exe);
if (args->code_coverage) {
- rule = chaz_MakeFile_add_rule(makefile, "coverage",
- "$(TEST_CFC_EXE)");
+ rule = chaz_MakeFile_add_rule(makefile, "coverage", test_cfc_exe);
chaz_MakeRule_add_command(rule,
"lcov"
" --zerocounters"
" --directory $(BASE_DIR)");
- chaz_MakeRule_add_command(rule, "$(TEST_CFC_EXE)");
+ chaz_MakeRule_add_command(rule, test_cfc_exe);
chaz_MakeRule_add_command(rule,
"lcov"
" --capture"
@@ -5407,8 +5628,6 @@ S_write_makefile(struct chaz_CLIArgs *args) {
chaz_MakeRule_add_rm_command(clean_rule, "$(COMMON_OBJS)");
chaz_MakeRule_add_rm_command(clean_rule, "$(CFC_OBJS)");
chaz_MakeRule_add_rm_command(clean_rule, "$(TEST_CFC_OBJS)");
- chaz_MakeRule_add_rm_command(clean_rule, parse_header_h);
- chaz_MakeRule_add_rm_command(clean_rule, parse_header_c);
if (args->code_coverage) {
chaz_MakeRule_add_rm_command(clean_rule, "cfc.info");
@@ -5418,7 +5637,12 @@ S_write_makefile(struct chaz_CLIArgs *args) {
chaz_MakeFile_write(makefile);
chaz_MakeFile_destroy(makefile);
+ free(lemon_dir);
free(src_dir);
+ free(include_dir);
+ free(parse_header);
+ free(cfc_exe);
+ free(test_cfc_exe);
}
int main(int argc, const char **argv) {
http://git-wip-us.apache.org/repos/asf/lucy/blob/07c27701/clownfish/runtime/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/common/charmonizer.c b/clownfish/runtime/common/charmonizer.c
index 3affa90..aef9a82 100644
--- a/clownfish/runtime/common/charmonizer.c
+++ b/clownfish/runtime/common/charmonizer.c
@@ -36,12 +36,58 @@
/***************************************************************************/
+#line 21 "src/Charmonizer/Core/SharedLibrary.h"
+/* Charmonizer/Core/SharedLibrary.h
+ */
+
+#ifndef H_CHAZ_SHARED_LIB
+#define H_CHAZ_SHARED_LIB
+
+typedef struct chaz_SharedLib chaz_SharedLib;
+
+chaz_SharedLib*
+chaz_SharedLib_new(const char *name, const char *version,
+ const char *major_version);
+
+void
+chaz_SharedLib_destroy(chaz_SharedLib *flags);
+
+const char*
+chaz_SharedLib_get_name(chaz_SharedLib *lib);
+
+const char*
+chaz_SharedLib_get_version(chaz_SharedLib *lib);
+
+const char*
+chaz_SharedLib_get_major_version(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_major_version_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_no_version_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_implib_filename(chaz_SharedLib *lib);
+
+char*
+chaz_SharedLib_export_filename(chaz_SharedLib *lib);
+
+#endif /* H_CHAZ_SHARED_LIB */
+
+
+
+/***************************************************************************/
+
#line 21 "src/Charmonizer/Core/CFlags.h"
-/* Charmonizer/Core/Compiler.h
+/* Charmonizer/Core/CFlags.h
*/
-#ifndef H_CHAZ_FLAGS
-#define H_CHAZ_FLAGS
+#ifndef H_CHAZ_CFLAGS
+#define H_CHAZ_CFLAGS
#define CHAZ_CFLAGS_STYLE_POSIX 1
#define CHAZ_CFLAGS_STYLE_GNU 2
@@ -96,18 +142,25 @@ void
chaz_CFlags_link_shared_library(chaz_CFlags *flags);
void
+chaz_CFlags_set_shared_library_version(chaz_CFlags *flags,
+ chaz_SharedLib *lib);
+
+void
chaz_CFlags_set_link_output(chaz_CFlags *flags, const char *filename);
void
chaz_CFlags_add_library_path(chaz_CFlags *flags, const char *directory);
void
-chaz_CFlags_add_library(chaz_CFlags *flags, const char *library);
+chaz_CFlags_add_library(chaz_CFlags *flags, chaz_SharedLib *lib);
+
+void
+chaz_CFlags_add_external_library(chaz_CFlags *flags, const char *library);
void
chaz_CFlags_enable_code_coverage(chaz_CFlags *flags);
-#endif /* H_CHAZ_FLAGS */
+#endif /* H_CHAZ_CFLAGS */
@@ -172,11 +225,6 @@ chaz_CC_get_cc(void);
const char*
chaz_CC_get_cflags(void);
-/* Accessor for `cflags_style`.
- */
-int
-chaz_CC_get_cflags_style(void);
-
/* Accessor for `extra_cflags`.
*/
chaz_CFlags*
@@ -187,6 +235,11 @@ chaz_CC_get_extra_cflags(void);
chaz_CFlags*
chaz_CC_get_temp_cflags(void);
+/* Return a new CFlags object.
+ */
+chaz_CFlags*
+chaz_CC_new_cflags(void);
+
/* Return the extension for a compiled object.
*/
const char*
@@ -204,9 +257,6 @@ chaz_CC_msvc_version_num(void);
const char*
chaz_CC_link_command(void);
-char*
-chaz_CC_shared_lib_file(const char *name);
-
#endif /* H_CHAZ_COMPILER */
@@ -416,19 +466,21 @@ chaz_HeadCheck_contains_member(const char *struct_name, const char *member,
/***************************************************************************/
#line 21 "src/Charmonizer/Core/Make.h"
-/* Charmonizer/Core/Compiler.h
+/* Charmonizer/Core/Make.h
*/
#ifndef H_CHAZ_MAKE
#define H_CHAZ_MAKE
/* #include "Charmonizer/Core/CFlags.h" */
+/* #include "Charmonizer/Core/SharedLib.h" */
typedef struct chaz_MakeFile chaz_MakeFile;
typedef struct chaz_MakeVar chaz_MakeVar;
typedef struct chaz_MakeRule chaz_MakeRule;
-typedef void (*chaz_Make_list_files_callback_t)(char *file, void *context);
+typedef void (*chaz_Make_list_files_callback_t)(const char *dir, char *file,
+ void *context);
/** Initialize the environment.
*/
@@ -539,14 +591,31 @@ chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
* to the list of files to clean.
*
* @param makefile The makefile.
- * @param name The name of the shared library without prefix or extension.
+ * @param lib The shared library.
* @param sources The list of source files.
* @param link_flags Additional link flags.
*/
chaz_MakeRule*
-chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, const char *name,
+chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, chaz_SharedLib *lib,
const char *sources, chaz_CFlags *link_flags);
+/** Add a rule to build the lemon parser generator.
+ *
+ * @param makefile The makefile.
+ * @param dir The lemon directory.
+ */
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_exe(chaz_MakeFile *makefile, const char *dir);
+
+/** Add a rule for a lemon grammar.
+ *
+ * @param makefile The makefile.
+ * @param base_name The filename of the grammar without extension.
+ */
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_grammar(chaz_MakeFile *makefile,
+ const char *base_name);
+
/** Write the makefile to a file named 'Makefile' in the current directory.
*
* @param makefile The makefile.
@@ -696,6 +765,11 @@ chaz_OS_shared_lib_ext(void);
const char*
chaz_OS_dev_null(void);
+/* Return the directory separator on this system.
+ */
+const char*
+chaz_OS_dir_sep(void);
+
/* Return the shell type of this system.
*/
int
@@ -1441,12 +1515,136 @@ void chaz_VariadicMacros_run(void);
/***************************************************************************/
+#line 17 "src/Charmonizer/Core/SharedLibrary.c"
+#include <string.h>
+#include <stdlib.h>
+/* #include "Charmonizer/Core/SharedLib.h" */
+/* #include "Charmonizer/Core/Compiler.h" */
+/* #include "Charmonizer/Core/Util.h" */
+/* #include "Charmonizer/Core/OperatingSystem.h" */
+
+struct chaz_SharedLib {
+ char *name;
+ char *version;
+ char *major_version;
+};
+
+static char*
+S_build_filename(chaz_SharedLib *lib, const char *version, const char *ext);
+
+static const char*
+S_get_prefix(void);
+
+chaz_SharedLib*
+chaz_SharedLib_new(const char *name, const char *version,
+ const char *major_version) {
+ chaz_SharedLib *lib = (chaz_SharedLib*)malloc(sizeof(chaz_SharedLib));
+ lib->name = chaz_Util_strdup(name);
+ lib->version = chaz_Util_strdup(version);
+ lib->major_version = chaz_Util_strdup(major_version);
+ return lib;
+}
+
+void
+chaz_SharedLib_destroy(chaz_SharedLib *lib) {
+ free(lib->name);
+ free(lib->version);
+ free(lib->major_version);
+ free(lib);
+}
+
+const char*
+chaz_SharedLib_get_name(chaz_SharedLib *lib) {
+ return lib->name;
+}
+
+const char*
+chaz_SharedLib_get_version(chaz_SharedLib *lib) {
+ return lib->version;
+}
+
+const char*
+chaz_SharedLib_get_major_version(chaz_SharedLib *lib) {
+ return lib->major_version;
+}
+
+char*
+chaz_SharedLib_filename(chaz_SharedLib *lib) {
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ if (strcmp(shlib_ext, ".dll") == 0) {
+ return S_build_filename(lib, lib->major_version, shlib_ext);
+ }
+ else {
+ return S_build_filename(lib, lib->version, shlib_ext);
+ }
+}
+
+char*
+chaz_SharedLib_major_version_filename(chaz_SharedLib *lib) {
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ return S_build_filename(lib, lib->major_version, shlib_ext);
+}
+
+char*
+chaz_SharedLib_no_version_filename(chaz_SharedLib *lib) {
+ const char *prefix = S_get_prefix();
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ return chaz_Util_join("", prefix, lib->name, shlib_ext, NULL);
+}
+
+char*
+chaz_SharedLib_implib_filename(chaz_SharedLib *lib) {
+ return S_build_filename(lib, lib->major_version, ".lib");
+}
+
+char*
+chaz_SharedLib_export_filename(chaz_SharedLib *lib) {
+ return S_build_filename(lib, lib->major_version, ".exp");
+}
+
+static char*
+S_build_filename(chaz_SharedLib *lib, const char *version, const char *ext) {
+ const char *prefix = S_get_prefix();
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+
+ if (strcmp(shlib_ext, ".dll") == 0) {
+ return chaz_Util_join("", prefix, lib->name, "-", version, ext, NULL);
+ }
+ else if (strcmp(shlib_ext, ".dylib") == 0) {
+ return chaz_Util_join("", prefix, lib->name, ".", version, ext, NULL);
+ }
+ else {
+ return chaz_Util_join("", prefix, lib->name, ext, ".", version, NULL);
+ }
+}
+
+static const char*
+S_get_prefix() {
+ if (chaz_CC_msvc_version_num()) {
+ return "";
+ }
+ else if (chaz_OS_is_cygwin()) {
+ return "cyg";
+ }
+ else {
+ return "lib";
+ }
+}
+
+
+
+/***************************************************************************/
+
#line 17 "src/Charmonizer/Core/CFlags.c"
#include <string.h>
#include <stdlib.h>
-/* #include "Charmonizer/Core/Flags.h" */
+/* #include "Charmonizer/Core/CFlags.h" */
/* #include "Charmonizer/Core/Util.h" */
/* #include "Charmonizer/Core/OperatingSystem.h" */
+/* #include "Charmonizer/Core/SharedLibrary.h" */
struct chaz_CFlags {
int style;
@@ -1641,7 +1839,7 @@ chaz_CFlags_link_shared_library(chaz_CFlags *flags) {
string = "/DLL";
}
else if (flags->style == CHAZ_CFLAGS_STYLE_GNU) {
- if (chaz_OS_is_darwin()) {
+ if (strcmp(chaz_OS_shared_lib_ext(), ".dylib") == 0) {
string = "-dynamiclib";
}
else {
@@ -1656,6 +1854,30 @@ chaz_CFlags_link_shared_library(chaz_CFlags *flags) {
}
void
+chaz_CFlags_set_shared_library_version(chaz_CFlags *flags,
+ chaz_SharedLib *lib) {
+ const char *shlib_ext = chaz_OS_shared_lib_ext();
+ char *string;
+
+ if (flags->style != CHAZ_CFLAGS_STYLE_GNU
+ || strcmp(shlib_ext, ".dll") == 0) {
+ return;
+ }
+
+ if (strcmp(chaz_OS_shared_lib_ext(), ".dylib") == 0) {
+ const char *version = chaz_SharedLib_get_version(lib);
+ string = chaz_Util_join(" ", "-current_version", version, NULL);
+ }
+ else {
+ char *soname = chaz_SharedLib_major_version_filename(lib);
+ string = chaz_Util_join("", "-Wl,-soname,", soname, NULL);
+ free(soname);
+ }
+ chaz_CFlags_append(flags, string);
+ free(string);
+}
+
+void
chaz_CFlags_set_link_output(chaz_CFlags *flags, const char *filename) {
const char *output;
char *string;
@@ -1692,13 +1914,26 @@ chaz_CFlags_add_library_path(chaz_CFlags *flags, const char *directory) {
}
void
-chaz_CFlags_add_library(chaz_CFlags *flags, const char *library) {
+chaz_CFlags_add_library(chaz_CFlags *flags, chaz_SharedLib *lib) {
+ char *filename;
+ if (flags->style == CHAZ_CFLAGS_STYLE_MSVC) {
+ filename = chaz_SharedLib_implib_filename(lib);
+ }
+ else {
+ filename = chaz_SharedLib_filename(lib);
+ }
+ chaz_CFlags_append(flags, filename);
+ free(filename);
+}
+
+void
+chaz_CFlags_add_external_library(chaz_CFlags *flags, const char *library) {
char *string;
if (flags->style == CHAZ_CFLAGS_STYLE_MSVC) {
string = chaz_Util_join("", library, ".lib", NULL);
}
else {
- string = chaz_Util_join("", "-l ", library, NULL);
+ string = chaz_Util_join(" ", "-l", library, NULL);
}
chaz_CFlags_append(flags, string);
free(string);
@@ -2025,11 +2260,6 @@ chaz_CC_get_cflags(void) {
return chaz_CC.cflags;
}
-int
-chaz_CC_get_cflags_style(void) {
- return chaz_CC.cflags_style;
-}
-
chaz_CFlags*
chaz_CC_get_extra_cflags(void) {
return chaz_CC.extra_cflags;
@@ -2040,6 +2270,11 @@ chaz_CC_get_temp_cflags(void) {
return chaz_CC.temp_cflags;
}
+chaz_CFlags*
+chaz_CC_new_cflags(void) {
+ return chaz_CFlags_new(chaz_CC.cflags_style);
+}
+
const char*
chaz_CC_obj_ext(void) {
return chaz_CC.obj_ext;
@@ -2072,21 +2307,6 @@ chaz_CC_link_command() {
}
}
-char*
-chaz_CC_shared_lib_file(const char *name) {
- const char *prefix = "";
- const char *shlib_ext = chaz_OS_shared_lib_ext();
- if (!chaz_CC.intval__MSC_VER) {
- if (chaz_OS_is_cygwin()) {
- prefix = "cyg";
- }
- else {
- prefix = "lib";
- }
- }
- return chaz_Util_join("", prefix, name, shlib_ext, NULL);
-}
-
/***************************************************************************/
@@ -3349,6 +3569,9 @@ chaz_Make_audition(const char *make) {
chaz_MakeFile*
chaz_MakeFile_new() {
chaz_MakeFile *makefile = (chaz_MakeFile*)malloc(sizeof(chaz_MakeFile));
+ const char *exe_ext = chaz_OS_exe_ext();
+ const char *obj_ext = chaz_CC_obj_ext();
+ char *generated;
makefile->vars = (chaz_MakeVar**)malloc(sizeof(chaz_MakeVar*));
makefile->vars[0] = NULL;
@@ -3361,10 +3584,11 @@ chaz_MakeFile_new() {
makefile->clean = S_new_rule("clean", NULL);
makefile->distclean = S_new_rule("distclean", "clean");
- chaz_MakeRule_add_rm_command(makefile->distclean,
- "charmonizer$(EXE_EXT) charmonizer$(OBJ_EXT)"
- " charmony.h Makefile");
+ generated = chaz_Util_join("", "charmonizer", exe_ext, " charmonizer",
+ obj_ext, " charmony.h Makefile", NULL);
+ chaz_MakeRule_add_rm_command(makefile->distclean, generated);
+ free(generated);
return makefile;
}
@@ -3444,8 +3668,7 @@ chaz_MakeFile_distclean_rule(chaz_MakeFile *makefile) {
chaz_MakeRule*
chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe,
const char *sources, chaz_CFlags *link_flags) {
- int cflags_style = chaz_CC_get_cflags_style();
- chaz_CFlags *local_flags = chaz_CFlags_new(cflags_style);
+ chaz_CFlags *local_flags = chaz_CC_new_cflags();
const char *link = chaz_CC_link_command();
const char *link_flags_string = "";
const char *local_flags_string;
@@ -3457,6 +3680,9 @@ chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe,
if (link_flags) {
link_flags_string = chaz_CFlags_get_string(link_flags);
}
+ if (chaz_CC_msvc_version_num()) {
+ chaz_CFlags_append(local_flags, "/nologo");
+ }
chaz_CFlags_set_link_output(local_flags, exe);
local_flags_string = chaz_CFlags_get_string(local_flags);
command = chaz_Util_join(" ", link, sources, link_flags_string,
@@ -3473,8 +3699,7 @@ chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe,
chaz_MakeRule*
chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
const char *sources, chaz_CFlags *cflags) {
- int cflags_style = chaz_CC_get_cflags_style();
- chaz_CFlags *local_flags = chaz_CFlags_new(cflags_style);
+ chaz_CFlags *local_flags = chaz_CC_new_cflags();
const char *cc = chaz_CC_get_cc();
const char *cflags_string = "";
const char *local_flags_string;
@@ -3486,6 +3711,9 @@ chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
if (cflags) {
cflags_string = chaz_CFlags_get_string(cflags);
}
+ if (chaz_CC_msvc_version_num()) {
+ chaz_CFlags_append(local_flags, "/nologo");
+ }
chaz_CFlags_set_output_exe(local_flags, exe);
local_flags_string = chaz_CFlags_get_string(local_flags);
command = chaz_Util_join(" ", cc, sources, cflags_string,
@@ -3501,45 +3729,91 @@ chaz_MakeFile_add_compiled_exe(chaz_MakeFile *makefile, const char *exe,
}
chaz_MakeRule*
-chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, const char *name,
+chaz_MakeFile_add_shared_lib(chaz_MakeFile *makefile, chaz_SharedLib *lib,
const char *sources, chaz_CFlags *link_flags) {
- int cflags_style = chaz_CC_get_cflags_style();
- chaz_CFlags *local_flags = chaz_CFlags_new(cflags_style);
+ chaz_CFlags *local_flags = chaz_CC_new_cflags();
const char *link = chaz_CC_link_command();
const char *link_flags_string = "";
const char *local_flags_string;
chaz_MakeRule *rule;
- char *shared_lib;
+ char *filename;
char *command;
- shared_lib = chaz_CC_shared_lib_file(name);
- rule = chaz_MakeFile_add_rule(makefile, shared_lib, sources);
+ filename = chaz_SharedLib_filename(lib);
+ rule = chaz_MakeFile_add_rule(makefile, filename, sources);
if (link_flags) {
link_flags_string = chaz_CFlags_get_string(link_flags);
}
+ if (chaz_CC_msvc_version_num()) {
+ chaz_CFlags_append(local_flags, "/nologo");
+ }
chaz_CFlags_link_shared_library(local_flags);
- chaz_CFlags_set_link_output(local_flags, shared_lib);
+ chaz_CFlags_set_shared_library_version(local_flags, lib);
+ chaz_CFlags_set_link_output(local_flags, filename);
local_flags_string = chaz_CFlags_get_string(local_flags);
command = chaz_Util_join(" ", link, sources, link_flags_string,
local_flags_string, NULL);
chaz_MakeRule_add_command(rule, command);
- chaz_MakeRule_add_rm_command(makefile->clean, shared_lib);
+ chaz_MakeRule_add_rm_command(makefile->clean, filename);
if (chaz_CC_msvc_version_num()) {
/* Remove import library and export file under MSVC. */
- char *filename;
- filename = chaz_Util_join("", name, ".lib", NULL);
- chaz_MakeRule_add_rm_command(makefile->clean, filename);
- free(filename);
- filename = chaz_Util_join("", name, ".exp", NULL);
- chaz_MakeRule_add_rm_command(makefile->clean, filename);
- free(filename);
+ char *lib_filename = chaz_SharedLib_implib_filename(lib);
+ char *exp_filename = chaz_SharedLib_export_filename(lib);
+ chaz_MakeRule_add_rm_command(makefile->clean, lib_filename);
+ chaz_MakeRule_add_rm_command(makefile->clean, exp_filename);
+ free(lib_filename);
+ free(exp_filename);
}
chaz_CFlags_destroy(local_flags);
- free(shared_lib);
+ free(filename);
+ free(command);
+ return rule;
+}
+
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_exe(chaz_MakeFile *makefile, const char *dir) {
+ chaz_CFlags *cflags = chaz_CC_new_cflags();
+ chaz_MakeRule *rule;
+ const char *dir_sep = chaz_OS_dir_sep();
+ const char *exe_ext = chaz_OS_exe_ext();
+ char *lemon_exe = chaz_Util_join("", dir, dir_sep, "lemon", exe_ext, NULL);
+ char *lemon_c = chaz_Util_join(dir_sep, dir, "lemon.c", NULL);
+
+ chaz_CFlags_enable_optimization(cflags);
+ chaz_MakeFile_add_var(makefile, "LEMON_EXE", lemon_exe);
+ rule = chaz_MakeFile_add_compiled_exe(makefile, "$(LEMON_EXE)", lemon_c,
+ cflags);
+
+ chaz_CFlags_destroy(cflags);
+ free(lemon_c);
+ free(lemon_exe);
+ return rule;
+}
+
+chaz_MakeRule*
+chaz_MakeFile_add_lemon_grammar(chaz_MakeFile *makefile,
+ const char *base_name) {
+ char *c_file = chaz_Util_join(".", base_name, "c", NULL);
+ char *h_file = chaz_Util_join(".", base_name, "h", NULL);
+ char *y_file = chaz_Util_join(".", base_name, "y", NULL);
+ char *command = chaz_Util_join(" ", "$(LEMON_EXE) -q", y_file, NULL);
+
+ chaz_MakeRule *rule = chaz_MakeFile_add_rule(makefile, c_file, y_file);
+ chaz_MakeRule *clean_rule = chaz_MakeFile_clean_rule(makefile);
+
+ chaz_MakeRule_add_prereq(rule, "$(LEMON_EXE)");
+ chaz_MakeRule_add_command(rule, command);
+
+ chaz_MakeRule_add_rm_command(clean_rule, h_file);
+ chaz_MakeRule_add_rm_command(clean_rule, c_file);
+
+ free(c_file);
+ free(h_file);
+ free(y_file);
free(command);
return rule;
}
@@ -3571,7 +3845,7 @@ chaz_MakeFile_write(chaz_MakeFile *makefile) {
/* Inference rule for .c files. */
fprintf(out, ".c.obj :\n");
if (chaz_CC_msvc_version_num()) {
- fprintf(out, "\t$(CC) $(CFLAGS) /c $< /Fo$@\n\n");
+ fprintf(out, "\t$(CC) /nologo $(CFLAGS) /c $< /Fo$@\n\n");
}
else {
fprintf(out, "\t$(CC) $(CFLAGS) -c $< -o $@\n\n");
@@ -3843,7 +4117,7 @@ chaz_Make_list_files(const char *dir, const char *ext,
file);
}
- callback(file + prefix_len, context);
+ callback(dir, file + prefix_len, context);
}
free(prefix);
@@ -3870,11 +4144,12 @@ chaz_Make_list_files(const char *dir, const char *ext,
static struct {
char name[CHAZ_OS_NAME_MAX+1];
char dev_null[20];
+ char dir_sep[2];
char exe_ext[5];
char shared_lib_ext[7];
char local_command_start[3];
int shell_type;
-} chaz_OS = { "", "", "", "", "", 0 };
+} chaz_OS = { "", "", "", "", "", "", 0 };
void
chaz_OS_init(void) {
@@ -3906,6 +4181,7 @@ chaz_OS_init(void) {
free(uname);
strcpy(chaz_OS.dev_null, "/dev/null");
+ strcpy(chaz_OS.dir_sep, "/");
strcpy(chaz_OS.exe_ext, "");
if (memcmp(chaz_OS.name, "darwin", 6) == 0) {
strcpy(chaz_OS.shared_lib_ext, ".dylib");
@@ -3921,6 +4197,7 @@ chaz_OS_init(void) {
else if (chaz_Util_can_open_file("nul")) {
strcpy(chaz_OS.name, "windows");
strcpy(chaz_OS.dev_null, "nul");
+ strcpy(chaz_OS.dir_sep, "\\");
strcpy(chaz_OS.exe_ext, ".exe");
strcpy(chaz_OS.shared_lib_ext, ".dll");
strcpy(chaz_OS.local_command_start, ".\\");
@@ -3962,6 +4239,11 @@ chaz_OS_dev_null(void) {
return chaz_OS.dev_null;
}
+const char*
+chaz_OS_dir_sep(void) {
+ return chaz_OS.dir_sep;
+}
+
int
chaz_OS_shell_type(void) {
return chaz_OS.shell_type;
@@ -4658,23 +4940,9 @@ chaz_DirManip_try_rmdir(void) {
if (chaz_DirManip_compile_rmdir("direct.h")) { return; }
}
-static int
-chaz_DirManip_is_cygwin(void) {
- static int is_cygwin = -1;
- static const char cygwin_code[] =
- CHAZ_QUOTE(#ifndef __CYGWIN__ )
- CHAZ_QUOTE( #error "Not Cygwin" )
- CHAZ_QUOTE(#endif )
- CHAZ_QUOTE(int main() { return 0; } );
- if (is_cygwin == -1) {
- is_cygwin = chaz_CC_test_compile(cygwin_code);
- }
- return is_cygwin;
-}
-
void
chaz_DirManip_run(void) {
- char dir_sep[3];
+ const char *dir_sep = chaz_OS_dir_sep();
int remove_zaps_dirs = false;
int has_dirent_h = chaz_HeadCheck_check_header("dirent.h");
int has_direct_h = chaz_HeadCheck_check_header("direct.h");
@@ -4732,16 +5000,6 @@ chaz_DirManip_run(void) {
chaz_ConfWriter_add_def("MAKEDIR_MODE_IGNORED", "1");
}
- if (chaz_DirManip_is_cygwin()) {
- strcpy(dir_sep, "/");
- }
- else if (chaz_HeadCheck_check_header("windows.h")) {
- strcpy(dir_sep, "\\\\");
- }
- else {
- strcpy(dir_sep, "/");
- }
-
{
char scratch[5];
sprintf(scratch, "\"%s\"", dir_sep);
@@ -4820,7 +5078,7 @@ chaz_Floats_math_library(void) {
return NULL;
}
- chaz_CFlags_add_library(temp_cflags, "m");
+ chaz_CFlags_add_external_library(temp_cflags, "m");
output = chaz_CC_capture_output(sqrt_code, &output_len);
chaz_CFlags_clear(temp_cflags);
@@ -5653,7 +5911,7 @@ typedef struct chaz_LargeFiles_unbuff_combo {
/* Check for a 64-bit file pointer type.
*/
-static const int
+static int
chaz_LargeFiles_probe_off64(void);
/* Check what name 64-bit ftell, fseek go by.
@@ -5720,7 +5978,7 @@ chaz_LargeFiles_run(void) {
chaz_ConfWriter_end_module();
}
-static const int
+static int
chaz_LargeFiles_probe_off64(void) {
static const char off64_code[] =
CHAZ_QUOTE( %s )