llvm/tools/llvm-shlib/Makefile
Sylvestre Ledru ba62f2f1bf The build system is currently miss-identifying GNU/kFreeBSD as FreeBSD.
This kind of simplification is sometimes useful, but in general it's not correct. 

As GNU/kFreeBSD is an hybrid system, for kernel-related issues we want to match the
build definitions used for FreeBSD, whereas for userland-related issues we want to
match the definitions used for other systems with Glibc.

The current modification adjusts the build system so that they can be distinguished,
and explicitly adds GNU/kFreeBSD to the build checks in which it belongs.

Fixes bug #16444.

Patch by Robert Millan in the context of Debian.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185311 91177308-0d34-0410-b5e6-96231b3b80d8
2013-07-01 08:07:52 +00:00

126 lines
4.3 KiB
Makefile

##===- tools/shlib/Makefile --------------------------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
LEVEL := ../..
LIBRARYNAME = LLVM-$(LLVMVersion)
NO_BUILD_ARCHIVE := 1
LINK_LIBS_IN_SHARED := 1
SHARED_LIBRARY := 1
include $(LEVEL)/Makefile.config
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
EXPORTED_SYMBOL_FILE = $(ObjDir)/$(LIBRARYNAME).exports
ifeq (1,$(ENABLE_EMBED_STDCXX))
# It is needed to force static-stdc++.a linked.
SHLIB_FRAG_NAMES += stdc++.a.o
endif
endif
include $(LEVEL)/Makefile.common
# Include all archives in libLLVM.(so|dylib) except the ones that have
# their own dynamic libraries and TableGen.
Archives := $(wildcard $(LibDir)/libLLVM*.a)
SharedLibraries := $(wildcard $(LibDir)/libLLVM*$(SHLIBEXT))
ExcludeFromLibLlvm := $(basename $(SharedLibraries)).a %/libLLVMTableGen.a
IncludeInLibLlvm := $(filter-out $(ExcludeFromLibLlvm), $(Archives))
LLVMLibsOptions := $(IncludeInLibLlvm:$(LibDir)/lib%.a=-l%)
LLVMLibsPaths := $(IncludeInLibLlvm)
$(LibName.SO): $(LLVMLibsPaths)
ifeq ($(HOST_OS),Darwin)
# set dylib internal version number to llvmCore submission number
ifdef LLVM_SUBMIT_VERSION
LLVMLibsOptions := $(LLVMLibsOptions) -Wl,-current_version \
-Wl,$(LLVM_SUBMIT_VERSION).$(LLVM_SUBMIT_SUBVERSION) \
-Wl,-compatibility_version -Wl,1
endif
# Include everything from the .a's into the shared library.
LLVMLibsOptions := $(LLVMLibsOptions) -all_load
# extra options to override libtool defaults
LLVMLibsOptions := $(LLVMLibsOptions) \
-Wl,-dead_strip
# Mac OS X 10.4 and earlier tools do not allow a second -install_name on command line
DARWIN_VERS := $(shell echo $(TARGET_TRIPLE) | sed 's/.*darwin\([0-9]*\).*/\1/')
ifneq ($(DARWIN_VERS),8)
LLVMLibsOptions := $(LLVMLibsOptions) \
-Wl,-install_name \
-Wl,"@executable_path/../lib/lib$(LIBRARYNAME)$(SHLIBEXT)"
endif
endif
ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux FreeBSD GNU/kFreeBSD OpenBSD GNU Bitrig))
# Include everything from the .a's into the shared library.
LLVMLibsOptions := -Wl,--whole-archive $(LLVMLibsOptions) \
-Wl,--no-whole-archive
endif
ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux FreeBSD GNU/kFreeBSD GNU))
# Add soname to the library.
LLVMLibsOptions += -Wl,--soname,lib$(LIBRARYNAME)$(SHLIBEXT)
endif
ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux GNU GNU/kFreeBSD))
# Don't allow unresolved symbols.
LLVMLibsOptions += -Wl,--no-undefined
endif
ifeq ($(HOST_OS),SunOS)
# add -z allextract ahead of other libraries on Solaris
LLVMLibsOptions := -Wl,-z -Wl,allextract $(LLVMLibsOptions)
endif
ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
SHLIB_STUBS := $(addprefix $(ObjDir)/, $(SHLIB_FRAG_NAMES))
SHLIB_FRAGS := $(patsubst %.a.o, $(ObjDir)/%.syms.txt, $(LIBRARYNAME).a.o $(SHLIB_FRAG_NAMES))
LLVMLibsOptions := $(SHLIB_STUBS) $(LLVMLibsOptions)
$(LibName.SO): $(SHLIB_STUBS)
%.syms.txt: %.a.o
$(Echo) Collecting global symbols of $(notdir $*)
$(Verb) $(NM_PATH) -g $< > $@
$(ObjDir)/$(LIBRARYNAME).exports: $(SHLIB_FRAGS) $(ObjDir)/.dir
$(Echo) Generating exports for $(LIBRARYNAME)
$(Verb) ($(SED) -n \
-e "s/^.* T _\([^.][^.]*\)$$/\1/p" \
-e "s/^.* [BDR] _\([^.][^.]*\)$$/\1 DATA/p" \
$(SHLIB_FRAGS) \
| sort -u) > $@
$(ObjDir)/$(LIBRARYNAME).a.o: $(LLVMLibsPaths) $(ObjDir)/.dir
$(Echo) Linking all LLVMLibs together for $(LIBRARYNAME)
$(Verb) $(Link) -nostartfiles -Wl,-r -nodefaultlibs -o $@ \
-Wl,--whole-archive $(LLVMLibsPaths) \
-Wl,--no-whole-archive
$(ObjDir)/stdc++.a.o: $(ObjDir)/.dir
$(Echo) Linking all libs together for static libstdc++.a
$(Verb) $(Link) -nostartfiles -Wl,-r -nodefaultlibs -o $@ \
-Wl,--whole-archive -lstdc++ \
-Wl,--no-whole-archive
# FIXME: workaround to invalidate -lstdc++
$(Echo) Making dummy -lstdc++ to lib
$(Verb) $(AR) rc $(ToolDir)/libstdc++.dll.a
# FIXME: Is install-local needed?
clean-local::
$(Verb) $(RM) -f $(ToolDir)/libstdc++.dll.a
endif