1c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin##===- tools/shlib/Makefile --------------------------------*- Makefile -*-===##
2c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin# 
3c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin#                     The LLVM Compiler Infrastructure
4c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin#
5c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin# This file is distributed under the University of Illinois Open Source
6c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin# License. See LICENSE.TXT for details.
7c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin# 
8c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin##===----------------------------------------------------------------------===##
9c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
108c39c9647da4f375e4f89bd417d86f5c3ff6dfa5Daniel DunbarLEVEL := ../..
11c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesLIBRARYNAME = LLVM-$(LLVM_VERSION_MAJOR).$(LLVM_VERSION_MINOR)$(LLVM_VERSION_SUFFIX)
13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesLIBRARYALIASNAME = LLVM-$(LLVMVersion)
14c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
158c39c9647da4f375e4f89bd417d86f5c3ff6dfa5Daniel DunbarNO_BUILD_ARCHIVE := 1
168c39c9647da4f375e4f89bd417d86f5c3ff6dfa5Daniel DunbarLINK_LIBS_IN_SHARED := 1
178c39c9647da4f375e4f89bd417d86f5c3ff6dfa5Daniel DunbarSHARED_LIBRARY := 1
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSHARED_ALIAS := 1
19c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
2059a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikovinclude $(LEVEL)/Makefile.config
2159a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
2259a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikovifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
238eac88621626e196db2cb76492dc60c71c7c7fbbNAKAMURA Takumi  EXPORTED_SYMBOL_FILE = $(ObjDir)/$(LIBRARYNAME).exports
2459a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
258eac88621626e196db2cb76492dc60c71c7c7fbbNAKAMURA Takumi  ifeq (1,$(ENABLE_EMBED_STDCXX))
2659a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov    # It is needed to force static-stdc++.a linked.
2759a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov    SHLIB_FRAG_NAMES += stdc++.a.o
288eac88621626e196db2cb76492dc60c71c7c7fbbNAKAMURA Takumi  endif
2959a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
3059a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikovendif
3159a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
32c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskininclude $(LEVEL)/Makefile.common
33c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
34c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin# Include all archives in libLLVM.(so|dylib) except the ones that have
35e97552e8509992f85607a669913de883592a4181Peter Collingbourne# their own dynamic libraries and TableGen.
36c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey YasskinArchives := $(wildcard $(LibDir)/libLLVM*.a)
37c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey YasskinSharedLibraries := $(wildcard $(LibDir)/libLLVM*$(SHLIBEXT))
38e97552e8509992f85607a669913de883592a4181Peter CollingbourneExcludeFromLibLlvm := $(basename $(SharedLibraries)).a %/libLLVMTableGen.a
39e97552e8509992f85607a669913de883592a4181Peter CollingbourneIncludeInLibLlvm := $(filter-out $(ExcludeFromLibLlvm), $(Archives))
40c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey YasskinLLVMLibsOptions := $(IncludeInLibLlvm:$(LibDir)/lib%.a=-l%)
41c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey YasskinLLVMLibsPaths   := $(IncludeInLibLlvm)
42c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
43c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin$(LibName.SO): $(LLVMLibsPaths)
44c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
45c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskinifeq ($(HOST_OS),Darwin)
46c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    # set dylib internal version number to llvmCore submission number
47c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    ifdef LLVM_SUBMIT_VERSION
48c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin        LLVMLibsOptions := $(LLVMLibsOptions) -Wl,-current_version \
49c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin                        -Wl,$(LLVM_SUBMIT_VERSION).$(LLVM_SUBMIT_SUBVERSION) \
50c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin                        -Wl,-compatibility_version -Wl,1
51c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    endif
52c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    # Include everything from the .a's into the shared library.
53c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    LLVMLibsOptions    := $(LLVMLibsOptions) -all_load
54c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskinendif
55c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin
5690f9b8a7bcd02b154a0c068c0589171b43ffba8dRafael Espindolaifeq ($(HOST_OS), $(filter $(HOST_OS), DragonFly Linux FreeBSD GNU/kFreeBSD OpenBSD GNU Bitrig))
57c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    # Include everything from the .a's into the shared library.
58c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    LLVMLibsOptions := -Wl,--whole-archive $(LLVMLibsOptions) \
59c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin                       -Wl,--no-whole-archive
60fa1059fd9c134e2475a693a02289d15ebd47f66eChris Lattnerendif
61fa1059fd9c134e2475a693a02289d15ebd47f66eChris Lattner
6290f9b8a7bcd02b154a0c068c0589171b43ffba8dRafael Espindolaifeq ($(HOST_OS), $(filter $(HOST_OS), DragonFly Linux FreeBSD GNU/kFreeBSD GNU))
631895fc90e01c9c3f48f40d99da6ead5ee09bcea4Anton Korobeynikov    # Add soname to the library.
641895fc90e01c9c3f48f40d99da6ead5ee09bcea4Anton Korobeynikov    LLVMLibsOptions += -Wl,--soname,lib$(LIBRARYNAME)$(SHLIBEXT)
651c48377421e2c266244fbc6275e897dc66e22bdaNAKAMURA Takumiendif
661c48377421e2c266244fbc6275e897dc66e22bdaNAKAMURA Takumi
67ba62f2f1bf267e0437d8ea62474632f2f1eae34dSylvestre Ledruifeq ($(HOST_OS), $(filter $(HOST_OS), Linux GNU GNU/kFreeBSD))
68c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    # Don't allow unresolved symbols.
69c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskin    LLVMLibsOptions += -Wl,--no-undefined
70c90171961d020d93e4ce548016d8ccb8aab00c57Jeffrey Yasskinendif
7159a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
72c55f58b1a6a3ed0c386353a88b2b04681407adbeChris Lattnerifeq ($(HOST_OS),SunOS)
73c55f58b1a6a3ed0c386353a88b2b04681407adbeChris Lattner    # add -z allextract ahead of other libraries on Solaris
74c55f58b1a6a3ed0c386353a88b2b04681407adbeChris Lattner    LLVMLibsOptions := -Wl,-z -Wl,allextract $(LLVMLibsOptions)
75c55f58b1a6a3ed0c386353a88b2b04681407adbeChris Lattnerendif
76c55f58b1a6a3ed0c386353a88b2b04681407adbeChris Lattner
7759a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikovifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
7859a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
7959a430f68f962464f0564b51741e2aea148c617cAnton KorobeynikovSHLIB_STUBS := $(addprefix $(ObjDir)/, $(SHLIB_FRAG_NAMES))
8059a430f68f962464f0564b51741e2aea148c617cAnton KorobeynikovSHLIB_FRAGS := $(patsubst %.a.o, $(ObjDir)/%.syms.txt, $(LIBRARYNAME).a.o $(SHLIB_FRAG_NAMES))
8159a430f68f962464f0564b51741e2aea148c617cAnton KorobeynikovLLVMLibsOptions := $(SHLIB_STUBS) $(LLVMLibsOptions)
8259a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
8359a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov$(LibName.SO): $(SHLIB_STUBS)
8459a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
8559a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov%.syms.txt: %.a.o
8659a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Echo) Collecting global symbols of $(notdir $*)
8759a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Verb) $(NM_PATH) -g $< > $@
8859a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
8959a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov$(ObjDir)/$(LIBRARYNAME).exports: $(SHLIB_FRAGS) $(ObjDir)/.dir
9059a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Echo) Generating exports for $(LIBRARYNAME)
9159a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Verb) ($(SED) -n \
9259a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov			-e "s/^.* T _\([^.][^.]*\)$$/\1/p" \
9359a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov			-e "s/^.* [BDR] _\([^.][^.]*\)$$/\1 DATA/p" \
9459a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov			$(SHLIB_FRAGS) \
9559a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov		 | sort -u) > $@
9659a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
9759a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov$(ObjDir)/$(LIBRARYNAME).a.o: $(LLVMLibsPaths) $(ObjDir)/.dir
9859a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Echo) Linking all LLVMLibs together for $(LIBRARYNAME)
9959a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Verb) $(Link) -nostartfiles -Wl,-r -nodefaultlibs -o $@ \
10059a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov			-Wl,--whole-archive $(LLVMLibsPaths) \
10159a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov			-Wl,--no-whole-archive
10259a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
10359a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov$(ObjDir)/stdc++.a.o: $(ObjDir)/.dir
10459a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Echo) Linking all libs together for static libstdc++.a
10559a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Verb) $(Link) -nostartfiles -Wl,-r -nodefaultlibs -o $@ \
10659a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov			-Wl,--whole-archive -lstdc++ \
10759a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov			-Wl,--no-whole-archive
10859a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov# FIXME: workaround to invalidate -lstdc++
10959a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Echo) Making dummy -lstdc++ to lib
11059a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Verb) $(AR) rc $(ToolDir)/libstdc++.dll.a
11159a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov# FIXME: Is install-local needed?
11259a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
11359a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikovclean-local::
11459a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov	$(Verb) $(RM) -f $(ToolDir)/libstdc++.dll.a
11559a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikov
11659a430f68f962464f0564b51741e2aea148c617cAnton Korobeynikovendif
117