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/18bc527f Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/18bc527f Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/18bc527f Branch: refs/heads/master Commit: 18bc527f72ddb63c97e20edb0dd1d18a99ffe143 Parents: f084e27 Author: Nick Wellnhofer <[email protected]> Authored: Thu Mar 14 14:43:32 2013 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Thu Mar 14 14:43:32 2013 +0100 ---------------------------------------------------------------------- clownfish/compiler/common/charmonizer.c | 21 +++++-- clownfish/runtime/common/charmonizer.c | 63 +++++++++++++++++-- common/charmonizer.c | 89 +++++++++++++++++++++++-- 3 files changed, 155 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/18bc527f/clownfish/compiler/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/clownfish/compiler/common/charmonizer.c b/clownfish/compiler/common/charmonizer.c index e9bec80..d79f642 100644 --- a/clownfish/compiler/common/charmonizer.c +++ b/clownfish/compiler/common/charmonizer.c @@ -87,6 +87,11 @@ chaz_CC_clean_up(void); void chaz_CC_set_warnings_as_errors(const int flag); +/* (Re)set "extra" cflags. + */ +void +chaz_CC_set_extra_cflags(const char *); + /* Concatenate onto the end of the "extra" cflags. A space will be inserted * automatically. */ @@ -1341,6 +1346,12 @@ chaz_CC_capture_output(const char *source, size_t *output_len) { } void +chaz_CC_set_extra_cflags(const char *flags) { + free(chaz_CC.extra_cflags); + chaz_CC.extra_cflags = chaz_Util_strdup(flags); +} + +void chaz_CC_add_extra_cflags(const char *flags) { if (!strlen(chaz_CC.extra_cflags)) { free(chaz_CC.extra_cflags); @@ -2807,13 +2818,13 @@ chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe, size = strlen(pattern) + strlen(link) + strlen(link_flags) - + strlen(extra_link_flags) + strlen(objects) + + strlen(extra_link_flags) + strlen(output_flag) + strlen(exe) + 50; command = (char*)malloc(size); - sprintf(command, pattern, link, link_flags, extra_link_flags, objects, + sprintf(command, pattern, link, link_flags, objects, extra_link_flags, output_flag, exe); chaz_MakeRule_add_command(rule, command); @@ -2841,14 +2852,14 @@ chaz_MakeFile_add_shared_obj(chaz_MakeFile *makefile, const char *shared_obj, + strlen(link) + strlen(shobj_flags) + strlen(link_flags) - + strlen(extra_link_flags) + strlen(objects) + + strlen(extra_link_flags) + strlen(output_flag) + strlen(shared_obj) + 50; command = (char*)malloc(size); - sprintf(command, pattern, link, shobj_flags, link_flags, extra_link_flags, - objects, output_flag, shared_obj); + sprintf(command, pattern, link, shobj_flags, link_flags, objects, + extra_link_flags, output_flag, shared_obj); chaz_MakeRule_add_command(rule, command); chaz_MakeFile_add_to_cleanup(makefile, shared_obj); http://git-wip-us.apache.org/repos/asf/lucy/blob/18bc527f/clownfish/runtime/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/clownfish/runtime/common/charmonizer.c b/clownfish/runtime/common/charmonizer.c index 0b7524c..d243fe4 100644 --- a/clownfish/runtime/common/charmonizer.c +++ b/clownfish/runtime/common/charmonizer.c @@ -87,6 +87,11 @@ chaz_CC_clean_up(void); void chaz_CC_set_warnings_as_errors(const int flag); +/* (Re)set "extra" cflags. + */ +void +chaz_CC_set_extra_cflags(const char *); + /* Concatenate onto the end of the "extra" cflags. A space will be inserted * automatically. */ @@ -918,6 +923,11 @@ void chaz_DirManip_run(void); void chaz_Floats_run(void); +/* Determine which flags are needed to link against the math library. + */ +const char* +chaz_Floats_math_library_flags(void); + #endif /* H_CHAZ_FLOATS */ @@ -1641,6 +1651,12 @@ chaz_CC_capture_output(const char *source, size_t *output_len) { } void +chaz_CC_set_extra_cflags(const char *flags) { + free(chaz_CC.extra_cflags); + chaz_CC.extra_cflags = chaz_Util_strdup(flags); +} + +void chaz_CC_add_extra_cflags(const char *flags) { if (!strlen(chaz_CC.extra_cflags)) { free(chaz_CC.extra_cflags); @@ -3107,13 +3123,13 @@ chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe, size = strlen(pattern) + strlen(link) + strlen(link_flags) - + strlen(extra_link_flags) + strlen(objects) + + strlen(extra_link_flags) + strlen(output_flag) + strlen(exe) + 50; command = (char*)malloc(size); - sprintf(command, pattern, link, link_flags, extra_link_flags, objects, + sprintf(command, pattern, link, link_flags, objects, extra_link_flags, output_flag, exe); chaz_MakeRule_add_command(rule, command); @@ -3141,14 +3157,14 @@ chaz_MakeFile_add_shared_obj(chaz_MakeFile *makefile, const char *shared_obj, + strlen(link) + strlen(shobj_flags) + strlen(link_flags) - + strlen(extra_link_flags) + strlen(objects) + + strlen(extra_link_flags) + strlen(output_flag) + strlen(shared_obj) + 50; command = (char*)malloc(size); - sprintf(command, pattern, link, shobj_flags, link_flags, extra_link_flags, - objects, output_flag, shared_obj); + sprintf(command, pattern, link, shobj_flags, link_flags, objects, + extra_link_flags, output_flag, shared_obj); chaz_MakeRule_add_command(rule, command); chaz_MakeFile_add_to_cleanup(makefile, shared_obj); @@ -4376,6 +4392,43 @@ chaz_Floats_run(void) { chaz_ConfWriter_end_module(); } +const char* +chaz_Floats_math_library_flags(void) { + static const char sqrt_code[] = + CHAZ_QUOTE( #include <math.h> ) + CHAZ_QUOTE( #include <stdio.h> ) + CHAZ_QUOTE( int main(void) { ) + CHAZ_QUOTE( printf("%p\n", sqrt); ) + CHAZ_QUOTE( return 0; ) + CHAZ_QUOTE( } ); + char *old_extra_cflags; + char *output = NULL; + size_t output_len; + + output = chaz_CC_capture_output(sqrt_code, &output_len); + if (output != NULL) { + /* Linking against libm not needed. */ + free(output); + return ""; + } + + old_extra_cflags = chaz_Util_strdup(chaz_CC_get_extra_cflags()); + chaz_CC_add_extra_cflags("-lm"); + + output = chaz_CC_capture_output(sqrt_code, &output_len); + + /* Restore extra cflags. */ + chaz_CC_set_extra_cflags(old_extra_cflags); + free(old_extra_cflags); + + if (output == NULL) { + chaz_Util_die("Don't know how to use math library."); + } + + free(output); + return "-lm"; +} + /***************************************************************************/ http://git-wip-us.apache.org/repos/asf/lucy/blob/18bc527f/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/common/charmonizer.c b/common/charmonizer.c index 326307f..7149c1f 100644 --- a/common/charmonizer.c +++ b/common/charmonizer.c @@ -87,6 +87,11 @@ chaz_CC_clean_up(void); void chaz_CC_set_warnings_as_errors(const int flag); +/* (Re)set "extra" cflags. + */ +void +chaz_CC_set_extra_cflags(const char *); + /* Concatenate onto the end of the "extra" cflags. A space will be inserted * automatically. */ @@ -918,6 +923,11 @@ void chaz_DirManip_run(void); void chaz_Floats_run(void); +/* Determine which flags are needed to link against the math library. + */ +const char* +chaz_Floats_math_library_flags(void); + #endif /* H_CHAZ_FLOATS */ @@ -1641,6 +1651,12 @@ chaz_CC_capture_output(const char *source, size_t *output_len) { } void +chaz_CC_set_extra_cflags(const char *flags) { + free(chaz_CC.extra_cflags); + chaz_CC.extra_cflags = chaz_Util_strdup(flags); +} + +void chaz_CC_add_extra_cflags(const char *flags) { if (!strlen(chaz_CC.extra_cflags)) { free(chaz_CC.extra_cflags); @@ -3107,13 +3123,13 @@ chaz_MakeFile_add_exe(chaz_MakeFile *makefile, const char *exe, size = strlen(pattern) + strlen(link) + strlen(link_flags) - + strlen(extra_link_flags) + strlen(objects) + + strlen(extra_link_flags) + strlen(output_flag) + strlen(exe) + 50; command = (char*)malloc(size); - sprintf(command, pattern, link, link_flags, extra_link_flags, objects, + sprintf(command, pattern, link, link_flags, objects, extra_link_flags, output_flag, exe); chaz_MakeRule_add_command(rule, command); @@ -3141,14 +3157,14 @@ chaz_MakeFile_add_shared_obj(chaz_MakeFile *makefile, const char *shared_obj, + strlen(link) + strlen(shobj_flags) + strlen(link_flags) - + strlen(extra_link_flags) + strlen(objects) + + strlen(extra_link_flags) + strlen(output_flag) + strlen(shared_obj) + 50; command = (char*)malloc(size); - sprintf(command, pattern, link, shobj_flags, link_flags, extra_link_flags, - objects, output_flag, shared_obj); + sprintf(command, pattern, link, shobj_flags, link_flags, objects, + extra_link_flags, output_flag, shared_obj); chaz_MakeRule_add_command(rule, command); chaz_MakeFile_add_to_cleanup(makefile, shared_obj); @@ -4376,6 +4392,43 @@ chaz_Floats_run(void) { chaz_ConfWriter_end_module(); } +const char* +chaz_Floats_math_library_flags(void) { + static const char sqrt_code[] = + CHAZ_QUOTE( #include <math.h> ) + CHAZ_QUOTE( #include <stdio.h> ) + CHAZ_QUOTE( int main(void) { ) + CHAZ_QUOTE( printf("%p\n", sqrt); ) + CHAZ_QUOTE( return 0; ) + CHAZ_QUOTE( } ); + char *old_extra_cflags; + char *output = NULL; + size_t output_len; + + output = chaz_CC_capture_output(sqrt_code, &output_len); + if (output != NULL) { + /* Linking against libm not needed. */ + free(output); + return ""; + } + + old_extra_cflags = chaz_Util_strdup(chaz_CC_get_extra_cflags()); + chaz_CC_add_extra_cflags("-lm"); + + output = chaz_CC_capture_output(sqrt_code, &output_len); + + /* Restore extra cflags. */ + chaz_CC_set_extra_cflags(old_extra_cflags); + free(old_extra_cflags); + + if (output == NULL) { + chaz_Util_die("Don't know how to use math library."); + } + + free(output); + return "-lm"; +} + /***************************************************************************/ @@ -6025,12 +6078,18 @@ S_write_makefile() { /* C compiler */ + const char *math_link_flags = chaz_Floats_math_library_flags(); + chaz_MakeFile_add_var(makefile, "CC", chaz_CC_get_cc()); if (chaz_CC_msvc_version_num()) { chaz_CC_add_extra_cflags("/nologo"); } chaz_CC_set_optimization_level("2"); + + /* TODO: This makes extra_cflags and subsequent probes unusable. Find a + * better way to get flags for include dirs. + */ chaz_CC_add_include_dir("."); chaz_CC_add_include_dir("$(SRC_DIR)"); chaz_CC_add_include_dir("$(CORE_DIR)"); @@ -6123,16 +6182,26 @@ S_write_makefile() { chaz_MakeRule_add_command(rule, scratch); free(scratch); + /* Needed for parallel builds. */ + rule = chaz_MakeFile_add_rule(makefile, "$(AUTOGEN_DIR)" DIR_SEP "source" + DIR_SEP "parcel.c", "$(AUTOGEN_DIR)"); + rule = chaz_MakeFile_add_rule(makefile, "$(LUCY_OBJS)", NULL); chaz_MakeRule_add_prereq(rule, json_parser_c); chaz_MakeRule_add_prereq(rule, "$(AUTOGEN_DIR)"); - const char *link_flags = ""; + const char *pcre_link_flags = ""; if (chaz_HeadCheck_check_header("pcre.h")) { - link_flags = "-lpcre"; + pcre_link_flags = "-lpcre"; } + size_t link_flags_size = strlen(math_link_flags) + + strlen(pcre_link_flags) + + 20; + char *link_flags = (char*)malloc(link_flags_size); + sprintf(link_flags, "%s %s", math_link_flags, pcre_link_flags); chaz_MakeFile_add_shared_obj(makefile, "$(LUCY_SHOBJ)", "$(LUCY_OBJS)", link_flags); + free(link_flags); chaz_MakeFile_add_rule(makefile, "$(TEST_LUCY_OBJS)", "$(AUTOGEN_DIR)"); @@ -6141,7 +6210,11 @@ S_write_makefile() { chaz_MakeRule_add_prereq(rule, "$(LUCY_SHOBJ)"); rule = chaz_MakeFile_add_rule(makefile, "test", "$(TEST_LUCY_EXE)"); - chaz_MakeRule_add_command(rule, "$(TEST_LUCY_EXE)"); + const char *test_command = "$(TEST_LUCY_EXE)"; + if (strcmp(chaz_OS_shared_obj_ext(), ".so") == 0) { + test_command = "LD_LIBRARY_PATH=. $(TEST_LUCY_EXE)"; + } + chaz_MakeRule_add_command(rule, test_command); chaz_MakeFile_add_to_cleanup(makefile, "$(TEST_LUCY_OBJS)"); chaz_MakeFile_add_to_cleanup(makefile, "$(LUCY_OBJS)");
