Repository: lucy-charmonizer Updated Branches: refs/heads/master 1fbb61f42 -> 79216ae87
Implement chaz_MakeRule_add_command_with_libpath Adds a command to a rule that executes with a special runtime library path. Project: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/commit/aa559ff0 Tree: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/tree/aa559ff0 Diff: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/diff/aa559ff0 Branch: refs/heads/master Commit: aa559ff0c36619f833de51b15c7a3033c90c846c Parents: 1fbb61f Author: Nick Wellnhofer <[email protected]> Authored: Tue Jun 2 18:33:00 2015 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Wed Jun 3 13:40:15 2015 +0200 ---------------------------------------------------------------------- src/Charmonizer/Core/Make.c | 36 ++++++++++++++++++++++++++++++++++++ src/Charmonizer/Core/Make.h | 10 ++++++++++ src/Charmonizer/Core/Util.c | 23 +++++++++++++++++++++-- src/Charmonizer/Core/Util.h | 5 +++++ 4 files changed, 72 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/blob/aa559ff0/src/Charmonizer/Core/Make.c ---------------------------------------------------------------------- diff --git a/src/Charmonizer/Core/Make.c b/src/Charmonizer/Core/Make.c index d1ba159..ffb6ce6 100644 --- a/src/Charmonizer/Core/Make.c +++ b/src/Charmonizer/Core/Make.c @@ -647,6 +647,42 @@ chaz_MakeRule_add_command(chaz_MakeRule *rule, const char *command) { } void +chaz_MakeRule_add_command_with_libpath(chaz_MakeRule *rule, + const char *command, ...) { + va_list args; + char *path = NULL; + char *lib_command = NULL; + + if (strcmp(chaz_OS_shared_lib_ext(), ".so") == 0) { + va_start(args, command); + path = chaz_Util_vjoin(":", args); + va_end(args); + + lib_command = chaz_Util_join("", "LD_LIBRARY_PATH=", path, + ":$$LD_LIBRARY_PATH ", command, NULL); + + free(path); + } + else if (strcmp(chaz_OS_shared_lib_ext(), ".dll") == 0) { + va_start(args, command); + path = chaz_Util_vjoin(";", args); + va_end(args); + + lib_command = chaz_Util_join("", "path ", path, ";%path% && ", command, + NULL); + } + else { + /* Assume that library paths are compiled into the executable on + * Darwin. + */ + lib_command = chaz_Util_strdup(command); + } + + chaz_MakeRule_add_command(rule, lib_command); + free(lib_command); +} + +void chaz_MakeRule_add_rm_command(chaz_MakeRule *rule, const char *files) { char *command; http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/blob/aa559ff0/src/Charmonizer/Core/Make.h ---------------------------------------------------------------------- diff --git a/src/Charmonizer/Core/Make.h b/src/Charmonizer/Core/Make.h index 2d43f32..e00a83e 100644 --- a/src/Charmonizer/Core/Make.h +++ b/src/Charmonizer/Core/Make.h @@ -221,6 +221,16 @@ chaz_MakeRule_add_prereq(chaz_MakeRule *rule, const char *prereq); void chaz_MakeRule_add_command(chaz_MakeRule *rule, const char *command); +/** Add a command to be executed with a special runtime library path. + * + * @param rule The rule. + * @param command The additional command. + * @param ... NULL-terminated list of library directories. + */ +void +chaz_MakeRule_add_command_with_libpath(chaz_MakeRule *rule, + const char *command, ...); + /** Add a command to remove one or more files. * * @param rule The rule. http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/blob/aa559ff0/src/Charmonizer/Core/Util.c ---------------------------------------------------------------------- diff --git a/src/Charmonizer/Core/Util.c b/src/Charmonizer/Core/Util.c index 2c494ef..0d0cc47 100644 --- a/src/Charmonizer/Core/Util.c +++ b/src/Charmonizer/Core/Util.c @@ -21,6 +21,13 @@ #include "Charmonizer/Core/Util.h" #include "Charmonizer/Core/OperatingSystem.h" +/* va_copy is not part of C89. Assume that simple assignment works if it + * isn't defined. + */ +#ifndef va_copy + #define va_copy(dst, src) ((dst) = (src)) +#endif + /* Global verbosity setting. */ int chaz_Util_verbosity = 1; @@ -120,6 +127,18 @@ chaz_Util_strdup(const char *string) { char* chaz_Util_join(const char *sep, ...) { va_list args; + char *result; + + va_start(args, sep); + result = chaz_Util_vjoin(sep, args); + va_end(args); + + return result; +} + +char* +chaz_Util_vjoin(const char *sep, va_list orig_args) { + va_list args; const char *string; char *result, *p; size_t sep_len = strlen(sep); @@ -127,7 +146,7 @@ chaz_Util_join(const char *sep, ...) { int i; /* Determine result size. */ - va_start(args, sep); + va_copy(args, orig_args); size = 1; string = va_arg(args, const char*); for (i = 0; string; ++i) { @@ -140,7 +159,7 @@ chaz_Util_join(const char *sep, ...) { result = (char*)malloc(size); /* Create result string. */ - va_start(args, sep); + va_copy(args, orig_args); p = result; string = va_arg(args, const char*); for (i = 0; string; ++i) { http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/blob/aa559ff0/src/Charmonizer/Core/Util.h ---------------------------------------------------------------------- diff --git a/src/Charmonizer/Core/Util.h b/src/Charmonizer/Core/Util.h index cde04d0..67f6dad 100644 --- a/src/Charmonizer/Core/Util.h +++ b/src/Charmonizer/Core/Util.h @@ -51,6 +51,11 @@ chaz_Util_strdup(const char *string); char* chaz_Util_join(const char *sep, ...); +/* Join a NULL-terminated list of strings using a separator. + */ +char* +chaz_Util_vjoin(const char *sep, va_list args); + /* Get the length of a file (may overshoot on text files under DOS). */ long
