From 0d3df507b4c4fe1dde086cd85a78179c8bcefcf9 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Mon, 29 Sep 2014 14:55:51 -0700 Subject: Support static libraries since clang is retarded --- .travis.yml | 2 +- Makefile.in | 39 +++++++++++++++++++++++++++++++++------ configure | 3 +++ include/tmwa/shared.hpp | 8 ++++++-- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9e700cc..3c3236a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,7 +49,7 @@ script: - mkdir build - cd build - git init - - ../configure --build=x86_64-linux-gnu --dev CPPFLAGS=-DQUIET `! [[ $CXX =~ clang* ]] || echo --disable-abi6` $EXTRA_CONFIGURE_ARGS + - ../configure --build=x86_64-linux-gnu --dev CPPFLAGS=-DQUIET `! [[ $CXX =~ clang* ]] || echo --disable-abi6 --disable-shared` $EXTRA_CONFIGURE_ARGS - make -R -k -j2 - make -R -k -j2 test TESTER='valgrind --error-exitcode=1 --track-fds=yes' diff --git a/Makefile.in b/Makefile.in index b057328..69cb9a9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -51,6 +51,7 @@ ENABLE_ABI6 = @ENABLE_ABI6@ ENABLE_CYGWIN_HACKS = @ENABLE_CYGWIN_HACKS@ ENABLE_DEBUG = @ENABLE_DEBUG@ ENABLE_RPATH = @ENABLE_RPATH@ +ENABLE_SHARED = @ENABLE_SHARED@ TESTER = TEST_ARGS = @@ -151,6 +152,18 @@ $(info The Road goes ever on and on ...) endif endif +include ${SRC_DIR}/version.make + +ifeq (${ENABLE_SHARED},yes) +LIB_SUFFIX_FAKE := so +LIB_SUFFIX_SHORT := ${SO_SHORT} +LIB_SUFFIX_LONG := ${SO_LONG} +else +LIB_SUFFIX_FAKE := a +LIB_SUFFIX_SHORT := a +LIB_SUFFIX_LONG := a +endif + c = @colorize 6: 2:$< 3:$@ : ifneq '$c' '' l = @colorize 6: $(patsubst %,2:%,$^) 3:$@ : @@ -198,7 +211,7 @@ MAIN_SOURCES := $(filter %/main.cpp,${SOURCES}) LIB_SOURCES := $(filter %/lib.cpp,${SOURCES}) TEST_SOURCES := $(filter %/test.cpp,${SOURCES}) BINARIES := $(patsubst src/%/main.cpp,bin/${tmwa}-%,${MAIN_SOURCES}) -LIBRARIES := $(patsubst src/%/lib.cpp,lib/lib${tmwa}-%.so,${LIB_SOURCES}) +LIBRARIES := $(patsubst src/%/lib.cpp,lib/lib${tmwa}-%.${LIB_SUFFIX_FAKE},${LIB_SOURCES}) TEST_BINARIES := $(patsubst src/%/test.cpp,bin/test-%,${TEST_SOURCES}) # tricky part @@ -214,7 +227,7 @@ TEST_BINARIES := $(patsubst src/%/test.cpp,bin/test-%,${TEST_SOURCES}) define RECURSIVE_DEPS_IMPL $(eval more_deps := $(value ${1})) $(eval more_deps := $(patsubst src/%.hpp,%,${more_deps})) -$(eval lib_deps += $(patsubst include/${tmwa}/%.hpp,lib/lib${tmwa}-%.${SO_LONG},$(filter include/${tmwa}/%.hpp,${more_deps}))) +$(eval lib_deps += $(patsubst include/${tmwa}/%.hpp,lib/lib${tmwa}-%.${LIB_SUFFIX_LONG},$(filter include/${tmwa}/%.hpp,${more_deps}))) $(eval more_deps := $(filter ${PATTERN_ROOTS},${more_deps})) $(eval more_deps := $(filter-out ${cur_deps},${more_deps})) $(eval cur_deps += ${more_deps}) @@ -303,9 +316,6 @@ else include ${DEPENDS} endif -include ${SRC_DIR}/version.make - - thisdir := $(abspath .) #$(foreach root,${PATTERN_ROOTS},$(info pre-root: ${root} := $(value ${root}))$(info )) # can't do $(filter %.hpp yet) @@ -329,6 +339,8 @@ $(foreach main,${PATTERN_MAINS},$(eval bin/${tmwa}-${main}-gdb.py : $(filter ${P $(foreach lib,${PATTERN_LIBS},$(eval lib-${lib} := $(strip $(call RECURSIVE_DEPS,${lib}/lib))) $(eval lib-${lib}-libs := ${lib_deps})) # actual rule deps +$(foreach lib,${PATTERN_LIBS},$(eval lib/lib${tmwa}-${lib}.a : $(patsubst %,obj/%.pdc.o,$(value lib-${lib})) $(filter-out lib/lib${tmwa}-${lib}.a,$(value lib-${lib}-libs)))) +# no -gdb.py for static libs $(foreach lib,${PATTERN_LIBS},$(eval lib/lib${tmwa}-${lib}.${SO_LONG} : $(patsubst %,obj/%.pic.o,$(value lib-${lib})) $(filter-out lib/lib${tmwa}-${lib}.${SO_LONG},$(value lib-${lib}-libs)))) $(foreach lib,${PATTERN_LIBS},$(eval lib/lib${tmwa}-${lib}.${SO_LONG}-gdb.py : $(filter ${PIES},$(patsubst %,src/%.py,$(value lib-${lib}))))) #$(foreach lib,${PATTERN_LIBS},$(info post-lib: lib-${lib}: $(value lib-${lib})) $(info post-lib: lib-${lib}-libs: $(value lib-${lib}-libs)) $(info )) @@ -351,7 +363,13 @@ vpath %.py ${SRC_DIR} # main goals all: bin lib bin: ${BINARIES} -lib: $(patsubst %.so,%.${SO_LONG},${LIBRARIES}) +ifeq (${ENABLE_SHARED},yes) +lib: sharedlib +else +lib: staticlib +endif +sharedlib: $(patsubst %.${LIB_SUFFIX_FAKE},%.${SO_LONG},${LIBRARIES}) +staticlib: $(patsubst %.${LIB_SUFFIX_FAKE},%.a,${LIBRARIES}) ii: ${PREPROCESSED} ll: ${IRS} bc: ${BITCODES} @@ -430,6 +448,10 @@ lib/%.${SO_LONG}: lib/%.${SO_LONG}-gdb.py $l ${CXX} -shared -Wl,-soname=$*.${SO_SHORT} ${LDFLAGS} $(filter-out lib/%-gdb.py,$^) ${LDLIBS} -o $@ $c ln -sf $*.${SO_LONG} lib/$*.${SO_SHORT} $c ln -sf $*.${SO_SHORT} lib/$*.so +lib/%.a: + $(MKDIR_FIRST) + rm -f $@ + ar cr $@ $^ #${TEST_BINARIES}: obj/gtest-all.pdc.o bin/test-tests: obj/gtest-all.pdc.o @@ -480,12 +502,17 @@ install: install-lib install-lib: @echo + Installing libraries ${install_dir} ${DESTDIR}${LIBDIR} +ifeq (${ENABLE_SHARED},yes) ${install_data} -t ${DESTDIR}${LIBDIR} \ $(patsubst %.so,%.${SO_LONG},${LIBRARIES}) for lib in $(patsubst lib/%.so,%,${LIBRARIES}); do \ ln -sf $$lib.${SO_LONG} ${DESTDIR}${LIBDIR}/$$lib.${SO_SHORT}; \ ln -sf $$lib.${SO_SHORT} ${DESTDIR}${LIBDIR}/$$lib.so; \ done +else + ${install_data} -t ${DESTDIR}${LIBDIR} \ + ${LIBRARIES} +endif uninstall: uninstall-lib uninstall-lib: @echo - Uninstalling libraries diff --git a/configure b/configure index ee3769f..dc67d49 100755 --- a/configure +++ b/configure @@ -78,6 +78,9 @@ class Configuration(Cxx, Install, ConfigHash, Templates): self.add_option('--enable-rpath', init='none', type=enum('none', 'relative', 'absolute'), check=lambda build, ENABLE_RPATH: None, help='Use rpaths to find libraries', hidden=False) + self.add_bool_feature('shared', init='yes', + check=lambda build, ENABLE_SHARED: None, + help='Build shared libraries instead of static (required for debug, DOES NOT WORK WITH CLANG)') def vars(self): super(Configuration, self).vars() diff --git a/include/tmwa/shared.hpp b/include/tmwa/shared.hpp index 95174ab..8b6bfbc 100644 --- a/include/tmwa/shared.hpp +++ b/include/tmwa/shared.hpp @@ -22,9 +22,13 @@ // TODO also make sure any exception classes are public -#pragma GCC visibility push(default) +#ifndef __clang__ +# pragma GCC visibility push(default) +#endif namespace tmwa { void check_paths(); } // namespace tmwa -#pragma GCC visibility pop +#ifndef __clang__ +# pragma GCC visibility pop +#endif -- cgit v1.2.3-70-g09d2