aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-11-23 20:32:20 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-11-23 20:32:20 +0100
commit14772783e66a6e67726872926834c0e9f7210e6d (patch)
tree0201d5c435ec467d4e527a0fac57ab78317953d5
parent611868a90904ac233d8476682a4618fdd8c78c50 (diff)
Support installation of dynamically linked programs
Here we need to re-link programs so that their RPATH refers to the installed libraries.
-rw-r--r--Makefile.config.in2
-rw-r--r--Makefile.lib42
2 files changed, 39 insertions, 5 deletions
diff --git a/Makefile.config.in b/Makefile.config.in
index ed38e2980..48baa2889 100644
--- a/Makefile.config.in
+++ b/Makefile.config.in
@@ -12,8 +12,10 @@ bindir = @bindir@
datadir = @datadir@
datarootdir = @datarootdir@
exec_prefix = @exec_prefix@
+libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
+pkglibdir = $(libdir)/$(PACKAGE_NAME)
prefix = @prefix@
storedir = @storedir@
sysconfdir = @sysconfdir@
diff --git a/Makefile.lib b/Makefile.lib
index 1c4ada9c2..0a2fcccad 100644
--- a/Makefile.lib
+++ b/Makefile.lib
@@ -55,20 +55,40 @@ define LIBS_template =
_objs := $$(addsuffix .o, $$(basename $$(_srcs)))
$(1)_LDFLAGS_USE :=
+ $(1)_LDFLAGS_USE_INSTALLED :=
ifeq ($(BUILD_SHARED_LIBS), 1)
+
_lib := $$(_d)/$(1).so
$$(_lib): $$(_objs)
$(QUIET) $(CC) -o $$@ -shared $$^ $$($(1)_LDFLAGS)
+
$(1)_LDFLAGS_USE += -L$$(_d) -Wl,-rpath,$$(abspath $$(_d)) -l$$(patsubst lib%,%,$$(strip $(1)))
+
+ $(1)_INSTALL_DIR := $$(pkglibdir)
+
+ $(1)_INSTALL_PATH := $$($(1)_INSTALL_DIR)/$(1).so
+
+ $$($(1)_INSTALL_PATH): $$(_objs)
+ install -d $$($(1)_INSTALL_DIR)
+ $(QUIET) $(CC) -o $$@ -shared $$^ $$($(1)_LDFLAGS)
+
+ $(1)_LDFLAGS_USE_INSTALLED += -L$$($(1)_INSTALL_DIR) -Wl,-rpath,$$($(1)_INSTALL_DIR) -l$$(patsubst lib%,%,$$(strip $(1)))
+
else
+
_lib := $$(_d)/$(1).a
$$(_lib): $$(_objs)
$(QUIET) ar crs $$@ $$?
+
$(1)_LDFLAGS_USE += $$(_lib) $$($(1)_LDFLAGS)
+
+ $(1)_INSTALL_PATH := $$(pkglibdir)/$(1).a
+
endif
$(1)_LDFLAGS_USE += $$($(1)_LDFLAGS_PROPAGATED)
+ $(1)_LDFLAGS_USE_INSTALLED += $$($(1)_LDFLAGS_PROPAGATED)
$(1)_NAME := $$(_lib)
# Propagate CXXFLAGS to the individual object files.
@@ -99,19 +119,31 @@ define PROGRAMS_template =
$(1)_INSTALL_PATH := $$(bindir)/$(1)
- $$($(1)_INSTALL_PATH): $$($(1)_PATH)
- mkdir -p $$(dir $$@)
+ install:: $$($(1)_INSTALL_PATH)
+
+ ifeq ($(BUILD_SHARED_LIBS), 1)
+
+ _libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH))
+
+ $$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final)
+ install -d $$(dir $$($(1)_INSTALL_PATH))
+ $(QUIET) $(CXX) -o $$($(1)_INSTALL_PATH) -Wl,--no-copy-dt-needed-entries $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED))
+
+ else
+
+ $$($(1)_INSTALL_PATH): $$($(1)_PATH)
+ install -d $$(dir $$($(1)_INSTALL_PATH))
cp $$< $$@
- install:: $$($(1)_INSTALL_PATH)
+ endif
# Propagate CXXFLAGS to the individual object files.
$$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj)_CXXFLAGS=$$($(1)_CXXFLAGS)))
include $$(wildcard $$(_d)/*.dep)
- programs_list += $$(_prog)
- clean_list += $$(_prog) $$(_d)/*.o $$(_d)/*.dep
+ programs_list += $$($(1)_PATH)
+ clean_list += $$($(1)_PATH) $$(_d)/*.o $$(_d)/*.dep
dist_files += $$(_srcs)
endef