aboutsummaryrefslogtreecommitdiff
path: root/Makefile.lib
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 /Makefile.lib
parent611868a90904ac233d8476682a4618fdd8c78c50 (diff)
Support installation of dynamically linked programs
Here we need to re-link programs so that their RPATH refers to the installed libraries.
Diffstat (limited to 'Makefile.lib')
-rw-r--r--Makefile.lib42
1 files changed, 37 insertions, 5 deletions
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