Move computation of absolute paths from Makefile to runtime (in preparation for RUNTIME_PREFIX)
This commit prepares the Makefile for relocatable binaries (called RUNTIME_PREFIX). Such binaries will be able to be moved together with the system configuration files to a different directory, requiring to compute the prefix at runtime. In a first step, we make all paths relative in the Makefile and teach system_path() to add the prefix instead. We used to compute absolute paths in the Makefile and passed them to C as defines. We now pass relative paths to C and call system_path() to add the prefix at runtime. Signed-off-by: Steffen Prohaska <prohaska@zib.de> Acked-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a83c88525e
commit
026fa0d5ad
42
Makefile
42
Makefile
@ -179,28 +179,32 @@ STRIP ?= strip
|
|||||||
# Among the variables below, these:
|
# Among the variables below, these:
|
||||||
# gitexecdir
|
# gitexecdir
|
||||||
# template_dir
|
# template_dir
|
||||||
|
# mandir
|
||||||
|
# infodir
|
||||||
# htmldir
|
# htmldir
|
||||||
# ETC_GITCONFIG (but not sysconfdir)
|
# ETC_GITCONFIG (but not sysconfdir)
|
||||||
# can be specified as a relative path ../some/where/else (which must begin
|
# can be specified as a relative path some/where/else;
|
||||||
# with ../); this is interpreted as relative to $(bindir) and "git" at
|
# this is interpreted as relative to $(prefix) and "git" at
|
||||||
# runtime figures out where they are based on the path to the executable.
|
# runtime figures out where they are based on the path to the executable.
|
||||||
# This can help installing the suite in a relocatable way.
|
# This can help installing the suite in a relocatable way.
|
||||||
|
|
||||||
prefix = $(HOME)
|
prefix = $(HOME)
|
||||||
bindir = $(prefix)/bin
|
bindir_relative = bin
|
||||||
mandir = $(prefix)/share/man
|
bindir = $(prefix)/$(bindir_relative)
|
||||||
infodir = $(prefix)/share/info
|
mandir = share/man
|
||||||
gitexecdir = $(prefix)/libexec/git-core
|
infodir = share/info
|
||||||
|
gitexecdir = libexec/git-core
|
||||||
sharedir = $(prefix)/share
|
sharedir = $(prefix)/share
|
||||||
template_dir = $(sharedir)/git-core/templates
|
template_dir = share/git-core/templates
|
||||||
htmldir=$(sharedir)/doc/git-doc
|
htmldir = share/doc/git-doc
|
||||||
ifeq ($(prefix),/usr)
|
ifeq ($(prefix),/usr)
|
||||||
sysconfdir = /etc
|
sysconfdir = /etc
|
||||||
|
ETC_GITCONFIG = $(sysconfdir)/gitconfig
|
||||||
else
|
else
|
||||||
sysconfdir = $(prefix)/etc
|
sysconfdir = $(prefix)/etc
|
||||||
|
ETC_GITCONFIG = etc/gitconfig
|
||||||
endif
|
endif
|
||||||
lib = lib
|
lib = lib
|
||||||
ETC_GITCONFIG = $(sysconfdir)/gitconfig
|
|
||||||
# DESTDIR=
|
# DESTDIR=
|
||||||
|
|
||||||
# default configuration for gitweb
|
# default configuration for gitweb
|
||||||
@ -1086,6 +1090,7 @@ ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
|
|||||||
|
|
||||||
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
|
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
|
||||||
bindir_SQ = $(subst ','\'',$(bindir))
|
bindir_SQ = $(subst ','\'',$(bindir))
|
||||||
|
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
|
||||||
mandir_SQ = $(subst ','\'',$(mandir))
|
mandir_SQ = $(subst ','\'',$(mandir))
|
||||||
infodir_SQ = $(subst ','\'',$(infodir))
|
infodir_SQ = $(subst ','\'',$(infodir))
|
||||||
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
|
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
|
||||||
@ -1251,7 +1256,12 @@ git.o git.spec \
|
|||||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
|
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
|
||||||
|
|
||||||
exec_cmd.o: exec_cmd.c GIT-CFLAGS
|
exec_cmd.o: exec_cmd.c GIT-CFLAGS
|
||||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
|
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) \
|
||||||
|
'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
|
||||||
|
'-DBINDIR="$(bindir_relative_SQ)"' \
|
||||||
|
'-DPREFIX="$(prefix_SQ)"' \
|
||||||
|
$<
|
||||||
|
|
||||||
builtin-init-db.o: builtin-init-db.c GIT-CFLAGS
|
builtin-init-db.o: builtin-init-db.c GIT-CFLAGS
|
||||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
|
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
|
||||||
|
|
||||||
@ -1407,17 +1417,17 @@ remove-dashes:
|
|||||||
|
|
||||||
### Installation rules
|
### Installation rules
|
||||||
|
|
||||||
ifeq ($(firstword $(subst /, ,$(template_dir))),..)
|
ifeq ($(abspath $(template_dir)),$(template_dir))
|
||||||
template_instdir = $(bindir)/$(template_dir)
|
|
||||||
else
|
|
||||||
template_instdir = $(template_dir)
|
template_instdir = $(template_dir)
|
||||||
|
else
|
||||||
|
template_instdir = $(prefix)/$(template_dir)
|
||||||
endif
|
endif
|
||||||
export template_instdir
|
export template_instdir
|
||||||
|
|
||||||
ifeq ($(firstword $(subst /, ,$(gitexecdir))),..)
|
ifeq ($(abspath $(gitexecdir)),$(gitexecdir))
|
||||||
gitexec_instdir = $(bindir)/$(gitexecdir)
|
|
||||||
else
|
|
||||||
gitexec_instdir = $(gitexecdir)
|
gitexec_instdir = $(gitexecdir)
|
||||||
|
else
|
||||||
|
gitexec_instdir = $(prefix)/$(gitexecdir)
|
||||||
endif
|
endif
|
||||||
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
|
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
|
||||||
export gitexec_instdir
|
export gitexec_instdir
|
||||||
|
@ -329,7 +329,7 @@ static void setup_man_path(void)
|
|||||||
* old_path, the ':' at the end will let 'man' to try
|
* old_path, the ':' at the end will let 'man' to try
|
||||||
* system-wide paths after ours to find the manual page. If
|
* system-wide paths after ours to find the manual page. If
|
||||||
* there is old_path, we need ':' as delimiter. */
|
* there is old_path, we need ':' as delimiter. */
|
||||||
strbuf_addstr(&new_path, GIT_MAN_PATH);
|
strbuf_addstr(&new_path, system_path(GIT_MAN_PATH));
|
||||||
strbuf_addch(&new_path, ':');
|
strbuf_addch(&new_path, ':');
|
||||||
if (old_path)
|
if (old_path)
|
||||||
strbuf_addstr(&new_path, old_path);
|
strbuf_addstr(&new_path, old_path);
|
||||||
@ -375,7 +375,7 @@ static void show_man_page(const char *git_cmd)
|
|||||||
static void show_info_page(const char *git_cmd)
|
static void show_info_page(const char *git_cmd)
|
||||||
{
|
{
|
||||||
const char *page = cmd_to_page(git_cmd);
|
const char *page = cmd_to_page(git_cmd);
|
||||||
setenv("INFOPATH", GIT_INFO_PATH, 1);
|
setenv("INFOPATH", system_path(GIT_INFO_PATH), 1);
|
||||||
execlp("info", "info", "gitman", page, NULL);
|
execlp("info", "info", "gitman", page, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
exec_cmd.c
13
exec_cmd.c
@ -9,11 +9,14 @@ static const char *argv0_path;
|
|||||||
|
|
||||||
const char *system_path(const char *path)
|
const char *system_path(const char *path)
|
||||||
{
|
{
|
||||||
if (!is_absolute_path(path) && argv0_path) {
|
static const char *prefix = PREFIX;
|
||||||
struct strbuf d = STRBUF_INIT;
|
struct strbuf d = STRBUF_INIT;
|
||||||
strbuf_addf(&d, "%s/%s", argv0_path, path);
|
|
||||||
path = strbuf_detach(&d, NULL);
|
if (is_absolute_path(path))
|
||||||
}
|
return path;
|
||||||
|
|
||||||
|
strbuf_addf(&d, "%s/%s", prefix, path);
|
||||||
|
path = strbuf_detach(&d, NULL);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user