Allow the built-in exec path to be relative to the command invocation path
If GIT_EXEC_PATH (the macro that is defined in the Makefile) is relative, it is interpreted relative to the command's invocation path, which usually is $(bindir). The Makefile rules were written with the assumption that $(gitexecdir) is an absolute path. We introduce a separate variable that names the (absolute) installation directory. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
966c6edd31
commit
49fa65a7a8
30
Makefile
30
Makefile
@ -170,6 +170,16 @@ ALL_CFLAGS = $(CFLAGS)
|
|||||||
ALL_LDFLAGS = $(LDFLAGS)
|
ALL_LDFLAGS = $(LDFLAGS)
|
||||||
STRIP ?= strip
|
STRIP ?= strip
|
||||||
|
|
||||||
|
# Among the variables below, these:
|
||||||
|
# gitexecdir
|
||||||
|
# template_dir
|
||||||
|
# htmldir
|
||||||
|
# ETC_GITCONFIG (but not sysconfdir)
|
||||||
|
# can be specified as a relative path ../some/where/else (which must begin
|
||||||
|
# with ../); this is interpreted as relative to $(bindir) and "git" at
|
||||||
|
# runtime figures out where they are based on the path to the executable.
|
||||||
|
# This can help installing the suite in a relocatable way.
|
||||||
|
|
||||||
prefix = $(HOME)
|
prefix = $(HOME)
|
||||||
bindir = $(prefix)/bin
|
bindir = $(prefix)/bin
|
||||||
mandir = $(prefix)/share/man
|
mandir = $(prefix)/share/man
|
||||||
@ -205,7 +215,7 @@ GITWEB_FAVICON = git-favicon.png
|
|||||||
GITWEB_SITE_HEADER =
|
GITWEB_SITE_HEADER =
|
||||||
GITWEB_SITE_FOOTER =
|
GITWEB_SITE_FOOTER =
|
||||||
|
|
||||||
export prefix bindir gitexecdir sharedir htmldir sysconfdir
|
export prefix bindir sharedir htmldir sysconfdir
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
AR = ar
|
AR = ar
|
||||||
@ -1321,22 +1331,30 @@ template_instdir = $(template_dir)
|
|||||||
endif
|
endif
|
||||||
export template_instdir
|
export template_instdir
|
||||||
|
|
||||||
|
ifeq ($(firstword $(subst /, ,$(gitexecdir))),..)
|
||||||
|
gitexec_instdir = $(bindir)/$(gitexecdir)
|
||||||
|
else
|
||||||
|
gitexec_instdir = $(gitexecdir)
|
||||||
|
endif
|
||||||
|
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
|
||||||
|
export gitexec_instdir
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
|
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
|
||||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
|
||||||
$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
|
||||||
$(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X '$(DESTDIR_SQ)$(bindir_SQ)'
|
$(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X '$(DESTDIR_SQ)$(bindir_SQ)'
|
||||||
$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
|
$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
|
||||||
$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
|
$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
|
||||||
ifndef NO_TCLTK
|
ifndef NO_TCLTK
|
||||||
$(MAKE) -C gitk-git install
|
$(MAKE) -C gitk-git install
|
||||||
$(MAKE) -C git-gui install
|
$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
|
||||||
endif
|
endif
|
||||||
ifneq (,$X)
|
ifneq (,$X)
|
||||||
$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), $(RM) '$(DESTDIR_SQ)$(gitexecdir_SQ)/$p';)
|
$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), $(RM) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p';)
|
||||||
endif
|
endif
|
||||||
bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
|
bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
|
||||||
execdir=$$(cd '$(DESTDIR_SQ)$(gitexecdir_SQ)' && pwd) && \
|
execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
|
||||||
if test "z$$bindir" != "z$$execdir"; \
|
if test "z$$bindir" != "z$$execdir"; \
|
||||||
then \
|
then \
|
||||||
ln -f "$$bindir/git$X" "$$execdir/git$X" || \
|
ln -f "$$bindir/git$X" "$$execdir/git$X" || \
|
||||||
|
38
exec_cmd.c
38
exec_cmd.c
@ -7,40 +7,6 @@ extern char **environ;
|
|||||||
static const char *argv_exec_path;
|
static const char *argv_exec_path;
|
||||||
static const char *argv0_path;
|
static const char *argv0_path;
|
||||||
|
|
||||||
static const char *builtin_exec_path(void)
|
|
||||||
{
|
|
||||||
#ifndef __MINGW32__
|
|
||||||
return GIT_EXEC_PATH;
|
|
||||||
#else
|
|
||||||
int len;
|
|
||||||
char *p, *q, *sl;
|
|
||||||
static char *ep;
|
|
||||||
if (ep)
|
|
||||||
return ep;
|
|
||||||
|
|
||||||
len = strlen(_pgmptr);
|
|
||||||
if (len < 2)
|
|
||||||
return ep = ".";
|
|
||||||
|
|
||||||
p = ep = xmalloc(len+1);
|
|
||||||
q = _pgmptr;
|
|
||||||
sl = NULL;
|
|
||||||
/* copy program name, turn '\\' into '/', skip last part */
|
|
||||||
while ((*p = *q)) {
|
|
||||||
if (*q == '\\' || *q == '/') {
|
|
||||||
*p = '/';
|
|
||||||
sl = p;
|
|
||||||
}
|
|
||||||
p++, q++;
|
|
||||||
}
|
|
||||||
if (sl)
|
|
||||||
*sl = '\0';
|
|
||||||
else
|
|
||||||
ep[0] = '.', ep[1] = '\0';
|
|
||||||
return ep;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *system_path(const char *path)
|
const char *system_path(const char *path)
|
||||||
{
|
{
|
||||||
if (!is_absolute_path(path) && argv0_path) {
|
if (!is_absolute_path(path) && argv0_path) {
|
||||||
@ -75,7 +41,7 @@ const char *git_exec_path(void)
|
|||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
|
|
||||||
return builtin_exec_path();
|
return system_path(GIT_EXEC_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_path(struct strbuf *out, const char *path)
|
static void add_path(struct strbuf *out, const char *path)
|
||||||
@ -99,7 +65,7 @@ void setup_path(void)
|
|||||||
|
|
||||||
add_path(&new_path, argv_exec_path);
|
add_path(&new_path, argv_exec_path);
|
||||||
add_path(&new_path, getenv(EXEC_PATH_ENVIRONMENT));
|
add_path(&new_path, getenv(EXEC_PATH_ENVIRONMENT));
|
||||||
add_path(&new_path, builtin_exec_path());
|
add_path(&new_path, system_path(GIT_EXEC_PATH));
|
||||||
add_path(&new_path, argv0_path);
|
add_path(&new_path, argv0_path);
|
||||||
|
|
||||||
if (old_path)
|
if (old_path)
|
||||||
|
Loading…
Reference in New Issue
Block a user