We already insert the values of some make variables into files in MAKE/*. We can therefore build a simple pattern rule for converting such a value into a C string in a header file, which can then be included and used as normal. The new system is demonstrated on version.c, where it can replace the use of "-D" on the command-line. Note that we still have to manually specify a dependency in the Makefile. In an ideal world, we would auto-detect the header dependency; however, there are two holdups: 1. We cannot rely on having automatic header dependency generation on all platforms. 2. Even when we do generate the dependencies, we rely on being able to compile the file once, which means our system cannot handle generated headers without a manual dependency to bootstrap it. Signed-off-by: Jeff King <peff@xxxxxxxx> --- This is a technique that I have used in other projects with great success, as the make variable dependencies are represented as file dependencies (which is the only type of dependency make knows about). _But_ it ends up a lot less nice here because of the way we do auto-dependencies. I'm totally open to revamping the way we handle our header dependencies, but I didn't do that in this series. Makefile | 11 +++++++---- script/mkcstring | 18 ++++++++++++++++++ version.c | 6 ++++-- 3 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 script/mkcstring diff --git a/Makefile b/Makefile index cd07a70..203171d 100644 --- a/Makefile +++ b/Makefile @@ -1593,6 +1593,11 @@ MAKE/$1: FORCE fi endef +MAKE/%-string.h: MAKE/% script/mkcstring + $(QUIET_GEN)$(SHELL_PATH) script/mkcstring \ + $(subst -,_,$*) <$< >$@+ && \ + mv $@+ $@ + LIBS = $(GITLIBS) $(EXTLIBS) BASIC_CFLAGS += -DSHA1_HEADER=$(call sq,$(SHA1_HEADER)) \ @@ -1614,6 +1619,7 @@ BASIC_CFLAGS += -DSHELL_PATH=$(call scq,$(SHELL_PATH)) endif $(eval $(call make-var,USER-AGENT,user agent string,$(GIT_USER_AGENT))) +$(eval $(call make-var,VERSION,version,$(GIT_VERSION))) ifdef DEFAULT_HELP_FORMAT BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"' @@ -1713,10 +1719,7 @@ builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \ -DGIT_MAN_PATH=$(call scq,$(mandir_relative)) \ -DGIT_INFO_PATH=$(call scq,$(infodir_relative)) -version.sp version.s version.o: GIT-VERSION-FILE MAKE/USER-AGENT -version.sp version.s version.o: EXTRA_CPPFLAGS = \ - -DGIT_VERSION=$(call scq,$(GIT_VERSION)) \ - -DGIT_USER_AGENT=$(call scq,$(GIT_USER_AGENT)) +version.sp version.s version.o: MAKE/VERSION-string.h MAKE/USER-AGENT-string.h $(BUILT_INS): git$X $(QUIET_BUILT_IN)$(RM) $@ && \ diff --git a/script/mkcstring b/script/mkcstring new file mode 100644 index 0000000..c01f430 --- /dev/null +++ b/script/mkcstring @@ -0,0 +1,18 @@ +#!/bin/sh + +name=$1; shift + +c_quote() { + sed 's/\\/\\\\/g; s/"/\\"/' +} + +cat <<-EOF +#ifndef MAKE_${name}_H +#define MAKE_${name}_H + +/* Auto-generated by mkcstring */ + +#define MAKE_${name} "$(c_quote)" + +#endif /* MAKE_${name}_H */ +EOF diff --git a/version.c b/version.c index 6106a80..f68a93b 100644 --- a/version.c +++ b/version.c @@ -1,8 +1,10 @@ #include "git-compat-util.h" #include "version.h" #include "strbuf.h" +#include "MAKE/USER-AGENT-string.h" +#include "MAKE/VERSION-string.h" -const char git_version_string[] = GIT_VERSION; +const char git_version_string[] = MAKE_VERSION; const char *git_user_agent(void) { @@ -11,7 +13,7 @@ const char *git_user_agent(void) if (!agent) { agent = getenv("GIT_USER_AGENT"); if (!agent) - agent = GIT_USER_AGENT; + agent = MAKE_USER_AGENT; } return agent; -- 1.8.5.2.500.g8060133 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html