diff --git a/Makefile b/Makefile index 188269d700629acdf217784239b1313bd3f26222..44a736917dc6597634e6ed9ed1bd01a66ced8f4a 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,12 @@ BUILDSYSLIBFLAGS = -dynamiclib -headerpad_max_install_names \ -install_name @executable_path/../$(BUILDSYSLIBPATH) \ -current_version $(SOCURVERSION) \ -compatibility_version $(SOCOMPATVERSION) -SYSREEXPORTFLAG = -Wl,-reexport_library,/usr/lib/libSystem.B.dylib +OSLIBDIR = /usr/lib +OSLIBNAME = System.B +OSLIBLINK = System +XLIBDIR = xlib +XLIBPATH = $(XLIBDIR)/lib$(OSLIBLINK)$(SOEXT) +SYSREEXPORTFLAG = -Wl,-reexport_library,$(OSLIBDIR)/lib$(OSLIBNAME)$(SOEXT) BUILDSLIBFLAGS = -qs POSTINSTALL = install_name_tool @@ -140,14 +145,18 @@ TESTNAMEPREFIX = $(TESTDIR)/test_ TESTRUNPREFIX = run_ TESTLDFLAGS = -L$(BUILDLIBDIR) $(ALLLDFLAGS) TESTLIBS = -l$(LIBNAME) +TESTSYSLDFLAGS = -L$(XLIBDIR) $(ALLLDFLAGS) TESTSRCS_C := $(wildcard $(TESTNAMEPREFIX)*.c) TESTOBJS_C := $(patsubst %.c,%.o,$(TESTSRCS_C)) TESTPRGS_C := $(patsubst %.c,%,$(TESTSRCS_C)) TESTSPRGS_C := $(patsubst %.c,%_static,$(TESTSRCS_C)) +TESTSYSPRGS_C := $(patsubst %.c,%_syslib,$(TESTSRCS_C)) TESTRUNS := $(patsubst \ $(TESTNAMEPREFIX)%,$(TESTRUNPREFIX)%,$(TESTPRGS_C)) TESTSRUNS := $(patsubst \ $(TESTNAMEPREFIX)%,$(TESTRUNPREFIX)%,$(TESTSPRGS_C)) +TESTSYSRUNS := $(patsubst \ + $(TESTNAMEPREFIX)%,$(TESTRUNPREFIX)%,$(TESTSYSPRGS_C)) # Tests that are only run manually MANTESTDIR = manual_tests @@ -330,12 +339,26 @@ $(BUILDSLIBPATH): $(SOBJLIST) $(BUILDLIBDIR) $(RM) $@ $(AR) $(BUILDSLIBFLAGS) $@ $$(cat $<) +# To run tests with our syslib, we want to suppress linking with the OS syslib, +# just to be certain that our replacement is an adequate substitute. +# But there doesn't seem to be any compiler option that does that correctly +# and without unwanted side effects. So instead we create a special lib +# directory containing a symlink to our replacement library, but with the +# normal OS syslib name, to fake out the implied '-lSystem'. +$(XLIBPATH): $(BUILDSYSLIBPATH) + $(MKINSTALLDIRS) $(XLIBDIR) + cd $(XLIBDIR) && ln -sf ../$< ../$@ + $(TESTOBJS_C): %.o: %.c $(ALLHEADERS) $(CC) -c -std=c99 -I$(SRCINCDIR) $(ALLCFLAGS) $< -o $@ $(TESTPRGS_C): %: %.o $(BUILDDLIBPATH) $(CC) $(TESTLDFLAGS) $< $(TESTLIBS) -o $@ +# Build tests with *only* our replacement syslib. +$(TESTSYSPRGS_C): %_syslib: %.o $(XLIBPATH) + $(CC) $(TESTSYSLDFLAGS) $< -o $@ + $(TESTSPRGS_C): %_static: %.o $(BUILDSLIBPATH) $(CC) $(ALLLDFLAGS) $< $(BUILDSLIBPATH) -o $@ @@ -405,6 +428,9 @@ $(TESTRUNS): $(TESTRUNPREFIX)%: $(TESTNAMEPREFIX)% $(TESTSRUNS): $(TESTRUNPREFIX)%: $(TESTNAMEPREFIX)% $< $(TEST_ARGS) +$(TESTSYSRUNS): $(TESTRUNPREFIX)%: $(TESTNAMEPREFIX)% + $< $(TEST_ARGS) + $(XTESTRUNS): $(XTESTRUNPREFIX)%: $(XTESTNAMEPREFIX)% $< $(TEST_ARGS) @@ -463,6 +489,10 @@ test check: $(TESTRUNS) $(XTESTRUNS) test_cmath test_faccessat_setuid_msg test_static: $(TESTSRUNS) +test_syslib: $(TESTSYSRUNS) + +test_all: test test_static test_syslib + xtest: $(XTESTRUNS) xtest_clean: @@ -472,14 +502,16 @@ $(MANRUNPREFIX)clean: $(RM) $(MANTESTDIR)/*.o $(MANTESTPRGS) test_clean: xtest_clean $(MANRUNPREFIX)clean - $(RM) $(TESTDIR)/*.o $(TESTPRGS) $(XTESTDIR)/*.o $(XTESTPRGS) + $(RM) $(TESTDIR)/*.o $(TESTPRGS) $(XTESTDIR)/*.o $(XTESTPRGS) $(XLIBPATH) + @$(RMDIR) $(XLIBDIR) clean: $(MANRUNPREFIX)clean test_clean $(RM) $(foreach D,$(SRCDIR),$D/*.o $D/*.o.* $D/*.d) $(RM) $(BUILDDLIBPATH) $(BUILDSLIBPATH) $(BUILDSYSLIBPATH) $(TESTPRGS) test/test_cmath_* test/test_faccessat_setuid @$(RMDIR) $(BUILDLIBDIR) -.PHONY: all dlib syslib slib clean check test test_cmath xtest test_static +.PHONY: all dlib syslib slib clean check test test_cmath xtest +.PHONY: test_static test_syslib test_all .PHONY: $(TESTRUNS) $(XTESTRUNS) $(MANTESTRUNS) .PHONY: $(MANRUNPREFIX)clean test_clean xtest_clean .PHONY: install install-headers install-lib install-dlib install-slib