diff --git a/Makefile.in b/Makefile.in index 564fd5ab0baa..7c7659e607bd 100644 --- a/Makefile.in +++ b/Makefile.in @@ -196,19 +196,31 @@ COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \ # LLVM macros ###################################################################### -# Any rules that depend on LLVM should depend on LLVM_CONFIG -LLVM_CONFIG:=$(CFG_LLVM_INST_DIR)/bin/llvm-config -LLVM_VERSION=$(shell "$(LLVM_CONFIG)" --version) -LLVM_BINDIR=$(shell "$(LLVM_CONFIG)" --bindir) -LLVM_INCDIR=$(shell "$(LLVM_CONFIG)" --includedir) -LLVM_LIBDIR=$(shell "$(LLVM_CONFIG)" --libdir) -LLVM_LIBS=$(shell "$(LLVM_CONFIG)" --libs) -LLVM_LDFLAGS=$(shell "$(LLVM_CONFIG)" --ldflags) -LLVM_CXXFLAGS=$(shell "$(LLVM_CONFIG)" --cxxflags) -LLVM_HOST_TRIPLE=$(shell "$(LLVM_CONFIG)" --host-target) +define DEF_LLVM_VARS +# The configure script defines these variables with the target triples +# separated by Z. This defines new ones with the expected format. +CFG_LLVM_BUILD_DIR_$(1):=$$(CFG_LLVM_BUILD_DIR_$(subst -,_,$(1))) +CFG_LLVM_INST_DIR_$(1):=$$(CFG_LLVM_INST_DIR_$(subst -,_,$(1))) + +# Any rules that depend on LLVM should depend on LLVM_CONFIG +LLVM_CONFIG_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-config +LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version) +LLVM_BINDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --bindir) +LLVM_INCDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --includedir) +LLVM_LIBDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libdir) +LLVM_LIBS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libs) +LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags) +LLVM_CXXFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags) +LLVM_HOST_TRIPLE_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --host-target) + +LLVM_AS_$(1)=$$(LLVM_BINDIR_$(1))/llvm-as$$(X) +LLC_$(1)=$$(LLVM_BINDIR_$(1))/llc$$(X) + +endef + +$(foreach target,$(CFG_TARGET_TRIPLES), \ + $(eval $(call DEF_LLVM_VARS,$(target)))) -LLVM_AS=$(LLVM_BINDIR)/llvm-as$(X) -LLC=$(LLVM_BINDIR)/llc$(X) ###################################################################### # Exports for sub-utilities diff --git a/configure b/configure index c0625cf86013..7aad41ad126a 100755 --- a/configure +++ b/configure @@ -372,12 +372,17 @@ for i in \ nd nd/std \ dl \ test/run-pass test/run-fail test/compile-fail \ - test/bench test/perf test/pretty \ - llvm + test/bench test/perf test/pretty do make_dir $i done +make_dir llvm +for t in $CFG_TARGET_TRIPLES +do + make_dir llvm/$t +done + make_dir rustllvm for t in $CFG_TARGET_TRIPLES do @@ -446,62 +451,78 @@ msg # Configure llvm. Here we go... CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm -CFG_LLVM_BUILD_DIR=${CFG_BUILD_DIR}/llvm -# Just use LLVM straight from its build directory to avoid 'make install' time -CFG_LLVM_INST_DIR=${CFG_LLVM_BUILD_DIR}/Release+Asserts - -if [ -z $CFG_LLVM_ROOT ] -then - step_msg "configuring LLVM" - - LLVM_TARGETS="--enable-targets=x86,x86_64" - LLVM_BUILD="--build=${CFG_HOST_TRIPLE}" - LLVM_HOST="--host=${CFG_HOST_TRIPLE}" - LLVM_TARGET="--target=${CFG_HOST_TRIPLE}" - LLVM_OPTS="--enable-optimized --disable-docs" - - LLVM_CXX_32="g++ -m32" - LLVM_CC_32="gcc -m32" - LLVM_CFLAGS_32="-m32" - LLVM_CXXFLAGS_32="-m32" - LLVM_LDFLAGS_32="-m32" - - # FIXME: Need to change flags for x64 - LLVM_CXX=$LLVM_CXX_32 - LLVM_CC=$LLVM_CC_32 - LLVM_CFLAGS=$LLVM_CFLAGS_32 - LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32 - LLVM_LDFLAGS=$LLVM_LDFLAGS_32 - - CXX=$LLVM_CXX - CC=$LLVM_CC - CFLAGS=$LLVM_CFLAGS - CXXFLAGS=$LLVM_CXXFLAGS - LDFLAGS=$LLVM_LDFLAGS - - LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" - - msg "configuring LLVM with:" - msg "$LLVM_FLAGS" - - export CXX - export CC - export CFLAGS - export CXXFLAGS - export LDFLAGS - - cd $CFG_LLVM_BUILD_DIR - # FIXME: This won't work if CFG_SRC_DIR is absolute - ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS - cd $CFG_BUILD_DIR -else - # The user is using their own LLVM - CFG_LLVM_INST_DIR=$CFG_LLVM_ROOT -fi - putvar CFG_LLVM_SRC_DIR -putvar CFG_LLVM_BUILD_DIR -putvar CFG_LLVM_INST_DIR + +for t in $CFG_TARGET_TRIPLES +do + if [ -z $CFG_LLVM_ROOT ] + then + step_msg "configuring LLVM for $t" + + LLVM_BUILD_DIR=$CFG_BUILD_DIR/llvm/$t + # Just use LLVM straight from its build directory to + # avoid 'make install' time + LLVM_INST_DIR=$LLVM_BUILD_DIR/Release+Asserts + + LLVM_TARGETS="--enable-targets=x86,x86_64" + LLVM_BUILD="--build=$t" + LLVM_HOST="--host=$t" + LLVM_TARGET="--target=$t" + LLVM_OPTS="--enable-optimized --disable-docs" + + LLVM_CXX_32="g++ -m32" + LLVM_CC_32="gcc -m32" + LLVM_CFLAGS_32="-m32" + LLVM_CXXFLAGS_32="-m32" + LLVM_LDFLAGS_32="-m32" + + # FIXME: Need to change flags for x64 + LLVM_CXX=$LLVM_CXX_32 + LLVM_CC=$LLVM_CC_32 + LLVM_CFLAGS=$LLVM_CFLAGS_32 + LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32 + LLVM_LDFLAGS=$LLVM_LDFLAGS_32 + + CXX=$LLVM_CXX + CC=$LLVM_CC + CFLAGS=$LLVM_CFLAGS + CXXFLAGS=$LLVM_CXXFLAGS + LDFLAGS=$LLVM_LDFLAGS + + LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" + + msg "configuring LLVM with:" + msg "$LLVM_FLAGS" + + export CXX + export CC + export CFLAGS + export CXXFLAGS + export LDFLAGS + + cd $LLVM_BUILD_DIR + # FIXME: This won't work if CFG_SRC_DIR is absolute + ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS + cd $CFG_BUILD_DIR + else + LLVM_BUILD_DIR=bogus + # The user is using their own LLVM + LLVM_INST_DIR=$CFG_LLVM_ROOT + fi + + # Construct variables for LLVM build and install directories for + # each target. These will be named + # CFG_LLVM_BUILD_DIR_${target_triple} but all the hyphens in + # target_triple will be converted to underscore, because bash + # variables can't contain hyphens. The makefile will then have to + # convert back. + CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _) + CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _) + eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'" + eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'" + putvar $CFG_LLVM_BUILD_DIR + putvar $CFG_LLVM_INST_DIR +done # Munge any paths that appear in config.mk back to posix-y diff --git a/mk/autodep.mk b/mk/autodep.mk index 04d7a5c77e6b..dc46b540ead3 100644 --- a/mk/autodep.mk +++ b/mk/autodep.mk @@ -14,11 +14,11 @@ rt/%.d: rt/%.cpp $(MKFILES) $(Q)rm -f $@.tmp.bak $(Q)mv $@.tmp $@ -rustllvm/%.d: rustllvm/%.cpp $(MKFILES) $(LLVM_CONFIG) +rustllvm/%.d: rustllvm/%.cpp $(MKFILES) $(LLVM_CONFIG_$(CFG_HOST_TRIPLE)) @$(call E, dep: $@) $(Q)$(call CFG_DEPEND_C, $@ \ $(subst $(S)src/,,$(patsubst %.cpp, %.o, $<)), \ - $(LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $< >$@.tmp + $(LLVM_CXXFLAGS_$(CFG_HOST_TRIPLE)) $(RUSTLLVM_INCS)) $< >$@.tmp $(Q)$(CFG_PATH_MUNGE) $@.tmp $(Q)rm -f $@.tmp.bak $(Q)mv $@.tmp $@ diff --git a/mk/llvm.mk b/mk/llvm.mk index d807565e384a..bd4e2ebe5a3d 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -2,6 +2,18 @@ LLVM_DEPS:=$(wildcard $(addprefix $(CFG_LLVM_SRC_DIR)/, \ * */*h */*/*h */*/*/*h */*cpp */*/*cpp */*/*/*cpp)) -$(LLVM_CONFIG): $(LLVM_DEPS) - @$(call E, make: llvm) - $(Q)make -C $(CFG_LLVM_BUILD_DIR) \ No newline at end of file +define DEF_LLVM_RULES + +# If CFG_LLVM_ROOT is defined then we don't build LLVM ourselves +ifeq ($(CFG_LLVM_ROOT),) + +$$(LLVM_CONFIG_$(1)): $$(LLVM_DEPS_$(1)) + @$$(call E, make: llvm) + $$(Q)make -C $$(CFG_LLVM_BUILD_DIR_$(1)) + +endif + +endef + +$(foreach target,$(CFG_TARGET_TRIPLES), \ + $(eval $(call DEF_LLVM_RULES,$(target)))) \ No newline at end of file diff --git a/mk/rustllvm.mk b/mk/rustllvm.mk index 0ed9c55e6941..068c73400f5d 100644 --- a/mk/rustllvm.mk +++ b/mk/rustllvm.mk @@ -14,21 +14,21 @@ endif RUSTLLVM_DEF_$(1) := rustllvm/rustllvm$$(CFG_DEF_SUFFIX) -RUSTLLVM_INCS_$(1) := -iquote $$(LLVM_INCDIR) \ - -iquote $$(S)src/rustllvm/include +RUSTLLVM_INCS_$(1) = -iquote $$(LLVM_INCDIR_$(1)) \ + -iquote $$(S)src/rustllvm/include RUSTLLVM_OBJS_OBJS_$(1) := $$(RUSTLLVM_OBJS_CS_$(1):rustllvm/%.cpp=rustllvm/$(1)/%.o) rustllvm/$(1)/$(CFG_RUSTLLVM): $$(RUSTLLVM_OBJS_OBJS_$(1)) \ $$(MKFILES) $$(RUSTLLVM_DEF_$(1)) @$$(call E, link: $$@) $$(Q)$$(call CFG_LINK_C_$(1),$$@,$$(RUSTLLVM_OBJS_OBJS_$(1)) \ - $$(CFG_GCCISH_PRE_LIB_FLAGS) $$(LLVM_LIBS) \ + $$(CFG_GCCISH_PRE_LIB_FLAGS) $$(LLVM_LIBS_$(1)) \ $$(CFG_GCCISH_POST_LIB_FLAGS) \ - $$(LLVM_LDFLAGS),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) + $$(LLVM_LDFLAGS_$(1)),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) -rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) $$(LLVM_CONFIG) +rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) $$(LLVM_CONFIG_$(1)) @$$(call E, compile: $$@) - $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(LLVM_CXXFLAGS) $$(RUSTLLVM_INCS_$(1))) $$< + $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(LLVM_CXXFLAGS_$(1)) $$(RUSTLLVM_INCS_$(1))) $$< endef # Instantiate template for all stages diff --git a/mk/target.mk b/mk/target.mk index ad6b8cc31dbc..b2c87d9b7e8d 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -13,9 +13,9 @@ $$(TARGET_LIB$(1)$(2))/intrinsics.ll: \ $$(Q)sed s/@CFG_TARGET_TRIPLE@/$(2)/ $$< > $$@ $$(TARGET_LIB$(1)$(2))/intrinsics.bc: $$(TARGET_LIB$(1)$(2))/intrinsics.ll \ - $$(LLVM_CONFIG) + $$(LLVM_CONFIG_$(2)) @$$(call E, llvms-as: $$@) - $$(Q)$$(LLVM_AS) -o $$@ $$< + $$(Q)$$(LLVM_AS_$(2)) -o $$@ $$< $$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB): \ $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \