Makefile revision e33218a3ceb3a36e4d8163cf04df0c0cae530b27
1f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek##===- clang/runtime/compiler-rt/Makefile ------------------*- Makefile -*-===##
2f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#
3f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#                     The LLVM Compiler Infrastructure
4f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#
5f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# This file is distributed under the University of Illinois Open Source
6f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# License. See LICENSE.TXT for details.
7f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#
8f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek##===----------------------------------------------------------------------===##
9f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#
10f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# This file defines support for building the Clang runtime libraries (which are
11f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# implemented by compiler-rt) and placing them in the proper locations in the
12f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# Clang resources directory (i.e., where the driver expects them).
13f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#
14e6348c336fecc8da9288ea367375a1b1cd2358d2Argyrios Kyrtzidis##===----------------------------------------------------------------------===##
15f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek
16f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted KremenekCLANG_LEVEL := ../..
17802be99a6817aba6edb166b93c133da4358aa783Zhongxing Xuinclude $(CLANG_LEVEL)/Makefile
18f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek
19efceabd2380f49306bc0229583458e93b062094bDaniel DunbarCLANG_VERSION := $(word 3,$(shell grep "CLANG_VERSION " \
20efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar	$(PROJ_OBJ_DIR)/$(CLANG_LEVEL)/include/clang/Basic/Version.inc))
2127af04bcca46f8a3374586be1301477f9123f5e1Argyrios Kyrtzidis
2243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios KyrtzidisResourceDir := $(PROJ_OBJ_ROOT)/$(BuildMode)/lib/clang/$(CLANG_VERSION)
2321142581d55918beed544a757e4af3bb865b1812Ted KremenekPROJ_resources := $(DESTDIR)$(PROJ_prefix)/lib/clang/$(CLANG_VERSION)
249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek
259b663716449b618ba0390b1dbebc54fa8e971124Ted KremenekResourceLibDir := $(ResourceDir)/lib
269b663716449b618ba0390b1dbebc54fa8e971124Ted KremenekPROJ_resources_lib := $(PROJ_resources)/lib
279b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek
289b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek# Expect compiler-rt to be in llvm/projects/compiler-rt
299b663716449b618ba0390b1dbebc54fa8e971124Ted KremenekCOMPILERRT_SRC_ROOT := $(LLVM_SRC_ROOT)/projects/compiler-rt
30a7af5ea88a6c5bdf87497cca6c20831e8c546751Argyrios Kyrtzidis
31efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar# Additional flags to pass to Clang.
32efceabd2380f49306bc0229583458e93b062094bDaniel DunbarCLANG_CCFLAGS := -no-integrated-as
339b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar
34efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar# We don't currently support building runtime libraries when we are
35f8ce6991f41d55b6e8526b7a7919771428e2b181Ted Kremenek# cross-compiling. The issue is that we really want to be set up so that the
3603013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer# available compiler targets are independent of the current build.
3703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#
386cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer# Since we have to build the runtime libraries for the target, it requires we
39db09a4dee28a4515438af60f2d2b4a83e4965c31Ted Kremenek# have a cross compiler from the build machine to the target. Although in the
40f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# case where for the current build (host == target), we do have such a cross
419ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek# compiler, but not defined in a way that is easy for us to reuse. Regardless,
42f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# that also wouldn't help for other possible compiler configurations.
43c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu#
44ff944a8c481d6c0f1ad2633e4be9bf8b1dd2a09fZhongxing Xu# Thus, the simple set up we currently use is to assume that we will be using
45be1fe1eb12a1cb91c8e3a9fcc2db4dfe989def6cTed Kremenek# the just built Clang to compile the compiler-rt libraries. As we grow better
46f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek# cross compilation support inside Clang and tool support in LLVM, this makes it
47f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek# easier for us to achieve the goal of having the compiler targets be easily
48f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek# selected at configure time. However, this design does currently preclude the
49f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek# building of compiler-rt libraries when the Clang itself is being cross
50f928dca56542cf8f981a684f090d2c79bdcb2a10Argyrios Kyrtzidis# compiled.
51efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar#
52d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer# There are three possible solutions:
53d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer#  1. Require building a build-target version of Clang when cross compiling. This
54f928dca56542cf8f981a684f090d2c79bdcb2a10Argyrios Kyrtzidis#     is simplest, but als greatly increases the build time of cross builds.
55f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek#
56f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek#  2. Require cross builds have a build-target version of Clang available for
57f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek#     use. This is a reasonable compromise on #1, as the compiler-rt libraries
58f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#     are simple enough that there is not a strong desire to ensure they are
59f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#     built with the exact version of Clang being used. Similarly, as Clang
60f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#     becomes a better cross compiler it is also increasingly more likely that
61f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#     the cross compiler being used will already be a version of Clang.
62f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#
63ed8afacb8118b71bcfa8017059e51da325e7691bZhongxing Xu#  3. Come up with an alternate mechanism to define all the toolchain
64ed8afacb8118b71bcfa8017059e51da325e7691bZhongxing Xu#     information that compiler-rt would need to build libraries for all the
659c378f705405d37f49795d5e915989de774fe11fTed Kremenek#     requested targets. This might be a simple short term solution, but is
661d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek#     likely to be unwieldly and irritating to maintain in the long term.
671d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekifneq ($(LLVM_CROSS_COMPILING),1)
681d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekifneq ($(CLANG_NO_RUNTIME),1)
69d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xuifeq ($(shell test -d $(COMPILERRT_SRC_ROOT) && echo OK),OK)
701d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek
711d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# Select the compiler-rt configuration to use, and install directory.
72d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu#
731d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# FIXME: Eventually, we want some kind of configure support for this. We want to
741d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# build/install runtime libraries for as many targets as clang was configured to
75f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# support.
7643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios KyrtzidisRuntimeDirs :=
771d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekifeq ($(OS),Darwin)
78c471e7b44e63ff1b46b480e723c4130aeaef5a8aZhongxing XuRuntimeDirs += darwin
791d9cbeb76cf4c36acf5545028e2b2ac207086442Ted KremenekRuntimeLibrary.darwin.Configs := eprintf 10.4 osx ios cc_kext
801d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek
811d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# On Darwin, fake Clang into using the iOS assembler (since compiler-rt wants to
821d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# build ARM bits).
83c4a1437c15da43eb8d2601cdce13161ef41a4389Ted Kremenekifeq ($(OS),Darwin)
841d9cbeb76cf4c36acf5545028e2b2ac207086442Ted KremenekCLANG_CCFLAGS += -ccc-install-dir \
851d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek	/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
86fda7832b000ff8927386f093b52c067641679469Zhongxing Xuendif
871d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekendif
881d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek
891d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek####
901d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# The build rules below are designed to be generic and should only need to be
911d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# modified based on changes in the compiler-rt layout or build system.
92fda7832b000ff8927386f093b52c067641679469Zhongxing Xu####
931d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek
94fda7832b000ff8927386f093b52c067641679469Zhongxing Xu# Rule to build the compiler-rt libraries we need.
95fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#
96a599ae8826b01c0160a519b0fc5a4871f599bf04Argyrios Kyrtzidis# We build all the libraries in a single shot to avoid recursive make as much as
97a599ae8826b01c0160a519b0fc5a4871f599bf04Argyrios Kyrtzidis# possible.
98a599ae8826b01c0160a519b0fc5a4871f599bf04Argyrios KyrtzidisBuildRuntimeLibraries:
99a599ae8826b01c0160a519b0fc5a4871f599bf04Argyrios Kyrtzidis	$(Verb) $(MAKE) -C $(COMPILERRT_SRC_ROOT) \
1001d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek	  ProjSrcRoot=$(COMPILERRT_SRC_ROOT) \
101fda7832b000ff8927386f093b52c067641679469Zhongxing Xu	  ProjObjRoot=$(PROJ_OBJ_DIR) \
1021d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek	  CC="$(ToolDir)/clang $(CLANG_CCFLAGS)" \
1035f83d6f36a7308eef21d87104fd70c421e854448Argyrios Kyrtzidis	  $(RuntimeDirs:%=clang_%)
1045f83d6f36a7308eef21d87104fd70c421e854448Argyrios Kyrtzidis.PHONY: BuildRuntimeLibraries
1055f83d6f36a7308eef21d87104fd70c421e854448Argyrios KyrtzidisCleanRuntimeLibraries:
106fda7832b000ff8927386f093b52c067641679469Zhongxing Xu	$(Verb) $(MAKE) -C $(COMPILERRT_SRC_ROOT) \
1075f83d6f36a7308eef21d87104fd70c421e854448Argyrios Kyrtzidis	  ProjSrcRoot=$(COMPILERRT_SRC_ROOT) \
108fda7832b000ff8927386f093b52c067641679469Zhongxing Xu	  ProjObjRoot=$(PROJ_OBJ_DIR) \
1091d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek	  clean
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump.PHONY: CleanRuntimeLibraries
1115f83d6f36a7308eef21d87104fd70c421e854448Argyrios Kyrtzidis
1125f83d6f36a7308eef21d87104fd70c421e854448Argyrios Kyrtzidis$(PROJ_resources_lib):
1135f83d6f36a7308eef21d87104fd70c421e854448Argyrios Kyrtzidis	$(Verb) $(MKDIR) $@
114fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
1155f83d6f36a7308eef21d87104fd70c421e854448Argyrios Kyrtzidis# Expand rules for copying/installing each individual library. We can't use
116fda7832b000ff8927386f093b52c067641679469Zhongxing Xu# implicit rules here because we need to match against multiple things.
117fda7832b000ff8927386f093b52c067641679469Zhongxing Xudefine RuntimeLibraryTemplate
1181d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek$(PROJ_OBJ_DIR)/clang_$1/%/libcompiler_rt.a: BuildRuntimeLibraries
119f6eafcca7734274d277afa121f2c4fb025a54218Ted Kremenek	@true
1201d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek.PRECIOUS: $(PROJ_OBJ_DIR)/clang_$1/%/libcompiler_rt.a
121c4a1437c15da43eb8d2601cdce13161ef41a4389Ted Kremenek
1221d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek# Rule to copy the libraries to their resource directory location.
123f6eafcca7734274d277afa121f2c4fb025a54218Ted Kremenek$(ResourceLibDir)/$1/libclang_rt.%.a: \
124fc576514d06c46a7cac49500169411d82f38d04bTed Kremenek		$(PROJ_OBJ_DIR)/clang_$1/%/libcompiler_rt.a \
125fc576514d06c46a7cac49500169411d82f38d04bTed Kremenek		$(ResourceLibDir)/$1/.dir
126cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor	$(Echo) Copying runtime library $1/$$* to build dir
127cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor	$(Verb) cp $(PROJ_OBJ_DIR)/clang_$1/$$*/libcompiler_rt.a $$@
128fc576514d06c46a7cac49500169411d82f38d04bTed KremenekRuntimeLibrary.$1: \
129cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor		$(RuntimeLibrary.$1.Configs:%=$(ResourceLibDir)/$1/libclang_rt.%.a)
130cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor.PHONY: RuntimeLibrary.$1
131cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
132cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor$(PROJ_resources_lib)/$1: $(PROJ_resources_lib)
133cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor	$(Verb) $(MKDIR) $$@
134cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
135cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor$(PROJ_resources_lib)/$1/libclang_rt.%.a: \
136cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor		$(ResourceLibDir)/$1/libclang_rt.%.a | $(PROJ_resources_lib)/$1
137cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor	$(Echo) Installing compiler runtime library: $1/$$*
138cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor	$(Verb) $(DataInstall) $$< $(PROJ_resources_lib)/$1
139cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
140cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor# Rule to install runtime libraries.
14135fa76d0bb6fb8c86159a7506efd094a4fe376d2Ted KremenekRuntimeLibraryInstall.$1: \
1421d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek		$(RuntimeLibrary.$1.Configs:%=$(PROJ_resources_lib)/$1/libclang_rt.%.a)
1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump.PHONY: RuntimeLibraryInstall.$1
1441d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekendef
1451d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek$(foreach lib,$(RuntimeDirs), $(eval $(call RuntimeLibraryTemplate,$(lib))))
1462e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis
1472e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis# Hook into the standard Makefile rules.
1481d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekall-local:: $(RuntimeDirs:%=RuntimeLibrary.%)
1491d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekinstall-local:: $(RuntimeDirs:%=RuntimeLibraryInstall.%)
1501d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekclean-local:: CleanRuntimeLibraries
15143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
152c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xuendif
1536362b893731ccf4480a96527db9e55e04b801503Zhongxing Xuendif
1541d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenekendif
1551d9cbeb76cf4c36acf5545028e2b2ac207086442Ted Kremenek