Przeglądaj źródła

- generic build libs fixes
- untested darwin support for automatically setting the library path /
rebuilding the lib on changed install path (on darwin
the library install path is stored in the library itself and from there it
is copied in the linked object => if the library path is changed we have to
re-link the library instead of re-linking the object that links it)

Andrei Pelinescu-Onciul 18 lat temu
rodzic
commit
da33ba737c
3 zmienionych plików z 95 dodań i 7 usunięć
  1. 47 4
      Makefile.libs
  2. 4 1
      Makefile.modules
  3. 44 2
      Makefile.rules

+ 47 - 4
Makefile.libs

@@ -7,11 +7,17 @@
 # History:
 # --------
 #  2007-03-16  created by andrei
+#  2007-05-19  rebuild on changed install name on darwin  (andrei)
 
 # NAME, MAJOR_VER and MINOR_VER should be pre-defined in the library 
 # makefile
 #
 
+ifneq	(,$(filter install% %install install, $(MAKECMDGOALS)))
+compile_for_install:=yes
+$(warning install mode => compile_for_install=$(compile_for_install))
+endif
+
 ifeq ($(NAME),)
 $(error NAME, MAJOR_VER and MINOR_VER must be defined in the library Makefile)
 endif
@@ -25,20 +31,33 @@ ifeq ($(BUGFIX_VER),)
 	BUGFIX_VER:=0
 endif
 
+ifeq	($(strip $(compile_for_install)),yes)
+	LIB_INSTALL_NAME:=$(lib_target)/$(LIB_RUNTIME_NAME)
+else
+	LIB_INSTALL_NAME:=$(shell pwd)/$(LIB_RUNTIME_NAME)
+endif
+
 ifeq ($(OS), darwin)
 	LIB_NAME:= \
 	$(LIB_PREFIX)$(NAME).$(MAJOR_VER).$(MINOR_VER).$(BUGFIX_VER)$(LIB_SUFFIX)
 	LIB_RUNTIME_NAME:=$(LIB_PREFIX)$(NAME).$(MAJOR_VER)$(LIB_SUFFIX)
 	LIB_LINK_NAME:=$(LIB_PREFIX)$(NAME)$(LIB_SUFFIX)
+	# on darwin we add an extra dependency on a file containing the install 
+	# name (we want to rebuild the library if the install path changed)
+	# this is needed because instead of a rpath link option, on darwin the
+	# path to a linked library is taken from the library itself (the path
+	# is built-in the library)
+	LIBINAME_F:=libiname.lst
 	NAME_LD_FLAGS:= -compatibility_version $(MAJOR_VER).$(MINOR_VER) \
 					-current_version $(MAJOR_VER).$(MINOR_VER).$(BUGFIX_VER) \
-					-install_name $(lib_target)/$(LIB_RUNTIME_NAME)
+					-install_name $(LIB_INSTALL_NAME)
 
 else
 	LIB_NAME:=$(LIB_PREFIX)$(NAME)$(LIB_SUFFIX).$(MAJOR_VER).$(MINOR_VER)
 	LIB_RUNTIME_NAME:=$(LIB_PREFIX)$(NAME)$(LIB_SUFFIX).$(MAJOR_VER)
 	LIB_LINK_NAME:=$(LIB_PREFIX)$(NAME)$(LIB_SUFFIX)
 	NAME_LD_FLAGS:= $(LIB_SONAME)$(LIB_RUNTIME_NAME)
+	LIBINAME_F:=
 endif
 
 
@@ -71,7 +90,16 @@ NAME:=$(LIB_NAME)
 
 include $(COREPATH)/Makefile.rules
 
-$(NAME): $(LIB_RUNTIME_NAME) $(LIB_LINK_NAME)
+ifeq	(,$(filter clean %clean clean% proper %proper proper%, $(MAKECMDGOALS)))
+ifneq ($(strip $(LIBINAME_F)),)
+-include $(LIBINAME_F)
+ifneq ($(strip $(LIB_INSTALL_NAME)), $(strip $(COMPILED_INAME)))
+$(shell rm -f $(LIBINAME_F))
+endif
+endif
+endif
+
+$(NAME): $(LIB_RUNTIME_NAME) $(LIB_LINK_NAME) $(LIBINAME_F)
 
 $(LIB_RUNTIME_NAME):
 	-@ln -s $(LIB_NAME) $(LIB_RUNTIME_NAME)
@@ -86,11 +114,20 @@ link_clean:
 
 clean: link_clean
 
+ifneq ($(strip $(LIBINAME_F)),)
+.PHONY: libiname_clean
+
+libiname_clean:
+	-@rm -f "$(LIBINAME_F)"
+
+clean: libiname_clean
+endif
+
 $(lib_prefix)/$(lib_dir):
 	mkdir -p $(lib_prefix)/$(lib_dir)
 
 .PHONY: install
-install: $(LIB_NAME) $(lib_prefix)/$(lib_dir)
+install: $(LIB_NAME) $(lib_prefix)/$(lib_dir) $(LIBINAME_F)
 	$(INSTALL_TOUCH) $(lib_prefix)/$(lib_dir)/$(LIB_NAME)
 	$(INSTALL_LIB) $(LIB_NAME) $(lib_prefix)/$(lib_dir)
 	rm -f $(lib_prefix)/$(lib_dir)/$(LIB_RUNTIME_NAME) \
@@ -104,5 +141,11 @@ install: $(LIB_NAME) $(lib_prefix)/$(lib_dir)
 .PHONY:install-if-newer
 install-if-newer: $(lib_prefix)/$(lib_dir)/$(LIB_RUNTIME_NAME) 
 
-$(lib_prefix)/$(lib_dir)/$(LIB_RUNTIME_NAME): $(LIB_NAME)
+$(lib_prefix)/$(lib_dir)/$(LIB_RUNTIME_NAME): $(LIB_NAME) $(LIBINAME_F)
 	@$(MAKE) install
+
+
+ifneq ($(strip $(LIBINAME_F)),)
+$(LIBINAME_F): $(ALLDEP)
+	@echo "COMPILED_INAME:=$(LIB_INSTALL_NAME)" > $(LIBINAME_F)
+endif

+ 4 - 1
Makefile.modules

@@ -59,9 +59,12 @@ $(modules_prefix)/$(modules_dir):
 
 
 .PHONY: install
-install: $(NAME) $(modules_prefix)/$(modules_dir)
+.PHONY: install-libs
+install: install-libs $(NAME) $(modules_prefix)/$(modules_dir)
 	$(INSTALL_TOUCH) $(modules_prefix)/$(modules_dir)/$(NAME)
 	$(INSTALL_MODULES)  $(NAME)  $(modules_prefix)/$(modules_dir)
+
+install-libs:
 	@for lib in $(dir $(SER_LIBS)); do \
 		$(MAKE) -C "$${lib}" install-if-newer ;\
 	done

+ 44 - 2
Makefile.rules

@@ -35,8 +35,18 @@
 # on some ser libs)
 
 ifneq	($(SER_LIBS),)
+# realpath doesn't seem to work on darwin
+SER_LIBS_DIRS:=$(abspath $(dir $(SER_LIBS)))
+ifneq	(,$(filter install install% %install, $(MAKECMDGOALS)))
+lib_compile_for_install=yes
+expected_lib_ipath=$(lib_target)
+else
+lib_compile_for_install=no
+# function: expected_lib_ipath ser_lib_dir
+expected_lib_ipath=$(1)
+endif
 ifneq	($(LD_RPATH),)
-ifneq	(,$(filter install, $(MAKECMDGOALS)))
+ifneq	(,$(filter install install% %install, $(MAKECMDGOALS)))
 SER_RPATH_LST:=$(lib_target)
 else
 SER_RPATH_LST:=$(realpath $(dir $(SER_LIBS)))
@@ -45,15 +55,21 @@ ifneq	($(strip $(SER_RPATH_LST)),)
 SER_RPATH:=$(addprefix $(LD_RPATH),$(SER_RPATH_LST))
 endif
 endif
+ifeq ($(OS), darwin)
+SER_IPATH_LST:=$(addsuffix /libiname.lst,$(SER_LIBS_DIRS))
+#$(warning $(NAME) DARWIN, SER_LIBS=$(SER_LIBS), $(SER_LIBS_DIRS), ipath_lst=$(SER_IPATH_LST))
+endif
 endif
 
 ALL_LIBS=$(LIBS)
 
+ifeq	(,$(filter clean %clean clean% proper %proper proper%, $(MAKECMDGOALS)))
 ifneq ($(SER_LIBS),)
 -include librpath.lst
 ifneq ($(SER_RPATH_LST), $(LIB_RPATH_LST))
 $(shell rm -f librpath.lst)
 endif
+endif
 
 SER_LIBS_DEPS:= \
 	$(foreach l, $(SER_LIBS), $(dir $l)$(LIB_PREFIX)$(notdir $l)$(LIB_SUFFIX))
@@ -62,7 +78,33 @@ ALL_LIBS+=$(foreach l, $(SER_LIBS), -L$(dir $l) -l$(notdir $l))
 $(NAME): $(SER_LIBS_DEPS) librpath.lst
 
 $(SER_LIBS_DEPS):
-	$(MAKE) -C $(dir $@)
+	$(MAKE) -C $(dir $@)  compile_for_install=$(lib_compile_for_install)
+
+
+ifneq ($(SER_IPATH_LST),)
+
+$(NAME): $(SER_IPATH_LST) 
+
+$(SER_IPATH_LST): FORCE
+	@if grep "COMPILED_INAME:=$(call expected_lib_ipath,$(@D))" $(@) \
+			1>/dev/null 2>/dev/null ; \
+	then :; \
+	else \
+		echo "re-building $(@D)" ; \
+		$(MAKE) -C $(@D) compile_for_install=$(lib_compile_for_install) ; \
+	fi
+
+.PHONY: FORCE
+FORCE:
+
+.PHONY: FORCE-BUILD-LIBS
+FORCE-BUILD-LIBS:
+	@for r in $(SER_LIBS_DIRS) ; do \
+		echo building lib $$r; \
+		$(MAKE) -C $$r compile_for_install=$(lib_compile_for_install) ; \
+	done
+
+endif
 
 endif