Use -Lpath -llib for libraries

Avoid referencing libraries by absolute path, which is not very portable
This commit is contained in:
Christophe de Dinechin 2017-11-08 16:10:51 +01:00
parent d2cc85ba6c
commit e209890343
5 changed files with 47 additions and 20 deletions

View File

@ -53,4 +53,4 @@ BENCHMARKS=product
include $(BUILD)rules.mk
count-characters.test:
@echo Output has `$(OBJPRODUCTS) | wc -c` characters, should be 35
@echo Output has `$(TEST_ENV) $(OBJPRODUCTS) | wc -c` characters, should be 35

View File

@ -62,6 +62,9 @@ LIB_EXT= .a
EXE_EXT=
DLL_EXT= .so
EXE_PFX=
LIB_PFX= lib
DLL_PFX= lib
#------------------------------------------------------------------------------
# Build rules
@ -71,9 +74,13 @@ MAKE_CC= $(CC) $(CFLAGS) $(CPPFLAGS_$*) $(CFLAGS_$*) -c $< -o $@ $(
MAKE_CXX= $(CXX) $(CXXFLAGS) $(CPPFLAGS_$*) $(CXXFLAGS_$*) -c $< -o $@ $(DEPFLAGS)
MAKE_AS= $(CC) $(CFLAGS) $(CPPFLAGS_$*) $(CFLAGS_$*) -c $< -o $@ $(DEPFLAGS)
MAKE_OBJDIR= mkdir -p $* && touch $@
MAKE_LIB= $(AR) $@ $(LINK_INPUTS)&& $(RANLIB) $@
MAKE_DLL= $(LD) -shared $(LINK_INPUTS) -o $@
MAKE_EXE= $(LD) -o $@ $(LINK_INPUTS) $(LDFLAGS) $(LDFLAGS_$*)
MAKE_LIB= $(AR) $@ $(LDFLAGS_$*) $(LINK_INPUTS)&& $(RANLIB) $@
MAKE_DLL= $(LD) -shared $(LDFLAGS_$*) $(LINK_CMDLINE) -o $@
MAKE_EXE= $(LD) $(LDFLAGS_$*) $(LINK_CMDLINE) -o $@
LINK_DIR_OPT= -L
LINK_LIB_OPT= -l
LINK_DLL_OPT= -l
#------------------------------------------------------------------------------
@ -85,6 +92,13 @@ CXX_DEPEND= $(CXX) $(CPPFLAGS) $(CPPFLAGS_$*) -MM -MP -MF $@ -MT $(@:.d=) $<
AS_DEPEND= $(CC) $(CPPFLAGS) $(CPPFLAGS_$*) -MM -MP -MF $@ -MT $(@:.d=) $<
#------------------------------------------------------------------------------
# Test environment
#------------------------------------------------------------------------------
TEST_ENV= LD_LIBRARY_PATH=$(OBJROOT)
#------------------------------------------------------------------------------
# Configuration checks
#------------------------------------------------------------------------------

View File

@ -28,8 +28,8 @@ include $(BUILD)config.gnu.mk
CFLAGS_ssev4= -msse4
DLL_EXT= .dylib
MAKE_LIB= $(LIBTOOL) -static $(LINK_INPUTS) -o $@
MAKE_DLL= $(LD) -shared $(LINK_INPUTS) -o $(shell pwd)/$@
MAKE_LIB= $(LIBTOOL) -static $(LINK_INPUTS) -o $@
MAKE_DLL= $(LD) -shared $(LINK_INPUTS) -o $(shell pwd)/$@
# On MacOSX, we will use basic frameworks e.g. for string and filesystem functions

View File

@ -97,6 +97,14 @@ LIB_EXT=.lib
EXE_EXT=.exe
DLL_EXT=.dll
EXE_PFX=
LIB_PFX=lib
DLL_PFX=lib
LINK_DIR_OPT=-L:
LINK_LIB_OPT=-l:
LINK_DLL_OPT=-l:
#------------------------------------------------------------------------------
# Build rules
@ -111,9 +119,9 @@ DLL_EXT=.dll
MAKE_CC= $(CC) $(CFLAGS) $(CPPFLAGS_$*) $(CFLAGS_$*) -c -Fo$@ $<
MAKE_CXX= $(CXX) $(CXXFLAGS) $(CPPFLAGS_$*) $(CXXFLAGS_$*) -c -Fo$@ $<
MAKE_OBJDIR= mkdir -p $* && touch $@
MAKE_LIB= $(MSLIB) $(LINK_INPUTS) -out:$@
MAKE_DLL= $(LD) $(LDFLAGS) $(LDFLAGS_$*) $(LINK_INPUTS) -dll -out:$@
MAKE_EXE= $(LD) $(LDFLAGS) $(LDFLAGS_$*) $(LINK_INPUTS) -out:$@
MAKE_LIB= $(MSLIB) $(LINK_INPUTS) -out:$@
MAKE_DLL= $(LD) $(LDFLAGS) $(LDFLAGS_$*) $(LINK_CMDLINE)-dll -out:$@
MAKE_EXE= $(LD) $(LDFLAGS) $(LDFLAGS_$*) $(LINK_CMDLINE) -out:$@
#------------------------------------------------------------------------------

View File

@ -56,9 +56,9 @@ PRODUCTS_EXE:= $(patsubst %.exe,%$(EXE_EXT),$(filter %.exe,$(PRODUCTS)))
PRODUCTS_LIB:= $(patsubst %.lib,%$(LIB_EXT),$(filter %.lib,$(PRODUCTS)))
PRODUCTS_DLL:= $(patsubst %.dll,%$(DLL_EXT),$(filter %.dll,$(PRODUCTS)))
PRODUCTS_OTHER:=$(filter-out %.exe %.lib %.dll %$(EXE_EXT) %$(LIB_EXT) %$(DLL_EXT), $(PRODUCTS))
OBJROOT_EXE:= $(PRODUCTS_EXE:%=$(OBJROOT)/%)
OBJROOT_LIB:= $(PRODUCTS_LIB:%=$(OBJROOT)/%)
OBJROOT_DLL:= $(PRODUCTS_DLL:%=$(OBJROOT)/%)
OBJROOT_EXE:= $(PRODUCTS_EXE:%=$(OBJROOT)/$(EXE_PFX)%)
OBJROOT_LIB:= $(PRODUCTS_LIB:%=$(OBJROOT)/$(LIB_PFX)%)
OBJROOT_DLL:= $(PRODUCTS_DLL:%=$(OBJROOT)/$(DLL_PFX)%)
OBJROOT_OTHER:= $(PRODUCTS_OTHER:%=$(OBJROOT)/%)
OBJPRODUCTS:= $(OBJROOT_EXE) $(OBJROOT_LIB) $(OBJROOT_DLL) $(OBJROOT_OTHER)
@ -76,9 +76,14 @@ endif
LIBNAMES:= $(filter %.lib, $(notdir $(LIBRARIES)))
DLLNAMES:= $(filter %.dll, $(notdir $(LIBRARIES)))
OBJLIBS:= $(LIBNAMES:%.lib=$(OBJROOT)/%$(LIB_EXT))
OBJDLLS:= $(DLLNAMES:%.dll=$(OBJROOT)/%$(DLL_EXT))
LINK_INPUTS:= $(OBJECTS) $(LINK_LIBS) $(OBJLIBS) $(OBJDLLS)
OBJLIBS:= $(LIBNAMES:%.lib=$(OBJROOT)/$(LIB_PFX)%$(LIB_EXT))
OBJDLLS:= $(DLLNAMES:%.dll=$(OBJROOT)/$(DLL_PFX)%$(DLL_EXT))
LINK_PATHS:= $(OBJROOT:%=$(LINK_DIR_OPT)%)
LINK_LIBS:= $(LINK_LIBS) \
$(LIBNAMES:%.lib=$(LINK_LIB_OPT)%) \
$(DLLNAMES:%.dll=$(LINK_DLL_OPT)%)
LINK_INPUTS:= $(OBJECTS) $(OBJLIBS) $(OBJDLLS)
LINK_CMDLINE:= $(OBJECTS) $(LINK_PATHS) $(LINK_LIBS)
ifneq ($(words $(LINK_INPUTS)),0)
LINK_WINPUTS= $(patsubst %,"%", $(shell cygpath -aw $(LINK_INPUTS)))
endif
@ -181,15 +186,15 @@ postbuild:
# Run the test (in the object directory)
product.test: product .ALWAYS
$(PRINT_TEST) $(OBJROOT_EXE) $(PRODUCTS_OPTS)
$(PRINT_TEST) $(TEST_ENV) $(OBJROOT_EXE) $(PRODUCTS_OPTS)
# Run a test from a C or C++ file to link against current library
%.c.test: $(OBJROOT_LIB) .ALWAYS
$(PRINT_BUILD) $(MAKE) SOURCES=$*.c LINK_LIBS=$(OBJROOT_LIB) PRODUCTS=$*.exe $(TARGET)
$(PRINT_TEST) $(TEST_CMD_$*) $(OBJROOT)/$*$(EXE_EXT) $(TEST_ARGS_$*)
$(PRINT_TEST) $(TEST_ENV) $(TEST_CMD_$*) $(OBJROOT)/$*$(EXE_EXT) $(TEST_ARGS_$*)
%.cpp.test: $(OBJROOT_LIB) .ALWAYS
$(PRINT_BUILD) $(MAKE) SOURCES=$*.cpp LINK_LIBS=$(OBJROOT_LIB) PRODUCTS=$*.exe $(TARGET)
$(PRINT_TEST) $(TEST_CMD_$*) $(OBJROOT)/$*$(EXE_EXT) $(TEST_ARGS_$*)
$(PRINT_TEST) $(TEST_ENV) $(TEST_CMD_$*) $(OBJROOT)/$*$(EXE_EXT) $(TEST_ARGS_$*)
# Installing the product: always need to build it first
%.install_exe: $(PREFIX_BIN).mkdir
@ -266,9 +271,9 @@ else
endif
# If LIBRARIES=foo/bar, go to directory foo/bar, which should build bar.a
$(OBJROOT)/%$(LIB_EXT): $(DEEP_BUILD)
$(OBJROOT)/$(LIB_PFX)%$(LIB_EXT): $(DEEP_BUILD)
+$(PRINT_COMMAND) cd $(filter %$*, $(LIBRARIES:.lib=) $(SUBDIRS)) && $(RECURSE_CMD)
$(OBJROOT)/%$(DLL_EXT): $(DEEP_BUILD)
$(OBJROOT)/$(DLL_PFX)%$(DLL_EXT): $(DEEP_BUILD)
+$(PRINT_COMMAND) cd $(filter %$*, $(LIBRARIES:.dll=) $(SUBDIRS)) && $(RECURSE_CMD)
%/.test:
+$(PRINT_TEST) cd $* && $(MAKE) TARGET=$(TARGET) test