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>maint
							parent
							
								
									966c6edd31
								
							
						
					
					
						commit
						49fa65a7a8
					
				
							
								
								
									
										30
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										30
									
								
								Makefile
								
								
								
								
							|  | @ -170,6 +170,16 @@ ALL_CFLAGS = $(CFLAGS) | |||
| ALL_LDFLAGS = $(LDFLAGS) | ||||
| 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) | ||||
| bindir = $(prefix)/bin | ||||
| mandir = $(prefix)/share/man | ||||
|  | @ -205,7 +215,7 @@ GITWEB_FAVICON = git-favicon.png | |||
| GITWEB_SITE_HEADER = | ||||
| GITWEB_SITE_FOOTER = | ||||
|  | ||||
| export prefix bindir gitexecdir sharedir htmldir sysconfdir | ||||
| export prefix bindir sharedir htmldir sysconfdir | ||||
|  | ||||
| CC = gcc | ||||
| AR = ar | ||||
|  | @ -1321,22 +1331,30 @@ template_instdir = $(template_dir) | |||
| endif | ||||
| 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) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)' | ||||
| 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexecdir_SQ)' | ||||
| 	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexecdir_SQ)' | ||||
| 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_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)' | ||||
| 	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install | ||||
| 	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install | ||||
| ifndef NO_TCLTK | ||||
| 	$(MAKE) -C gitk-git install | ||||
| 	$(MAKE) -C git-gui install | ||||
| 	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install | ||||
| endif | ||||
| 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 | ||||
| 	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"; \ | ||||
| 	then \ | ||||
| 		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 *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) | ||||
| { | ||||
| 	if (!is_absolute_path(path) && argv0_path) { | ||||
|  | @ -75,7 +41,7 @@ const char *git_exec_path(void) | |||
| 		return env; | ||||
| 	} | ||||
|  | ||||
| 	return builtin_exec_path(); | ||||
| 	return system_path(GIT_EXEC_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, 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); | ||||
|  | ||||
| 	if (old_path) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Johannes Sixt
						Johannes Sixt