about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-11-23T19·32+0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-11-23T19·32+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 ed38e2980bf8..48baa2889404 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 1c4ada9c2ee8..0a2fcccadcc6 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