Abstract the build directories further in the makefiles

This defines variables for host bin and lib directories as well as all target
bin and lib directories then uses them everywhere.
This commit is contained in:
Brian Anderson 2011-09-30 12:24:28 -07:00
parent ed106dd6ea
commit 38c67a4c8d
10 changed files with 103 additions and 95 deletions

View file

@ -169,32 +169,41 @@ LLC := $(CFG_LLVM_BINDIR)/llc$(X)
define SREQ
# Destinations of artifacts for target architectures
TARGET_ROOT$(1)$(2) = stage$(1)/lib/rustc/$(2)
TARGET_BIN$(1)$(2) = $(TARGET_ROOT$(1)$(2))/bin
TARGET_LIB$(1)$(2) = $(TARGET_ROOT$(1)$(2))/lib
HOST_ROOT$(1) = $(TARGET_ROOT$(1)$$(CFG_HOST_TRIPLE))
HOST_BIN$(1) = $(TARGET_BIN$(1)$$(CFG_HOST_TRIPLE))
HOST_LIB$(1) = $(TARGET_LIB$(1)$$(CFG_HOST_TRIPLE))
TARGET_BIN$(1)$(2) = $$(TARGET_ROOT$(1)$(2))/bin
TARGET_LIB$(1)$(2) = $$(TARGET_ROOT$(1)$(2))
# Destinations of artifacts for the host compiler
HOST_ROOT$(1) = stage$(1)
HOST_BIN$(1) = $$(HOST_ROOT$(1))/bin
HOST_LIB$(1) = $$(HOST_ROOT$(1))/lib
# The target locations of artifacts for the host architecture (used for
# promoting target binaries to host binaries)
TARGET_HOST_ROOT$(1) = $$(TARGET_ROOT$(1)$$(CFG_HOST_TRIPLE))
TARGET_HOST_BIN$(1) = $$(TARGET_BIN$(1)$$(CFG_HOST_TRIPLE))
TARGET_HOST_LIB$(1) = $$(TARGET_LIB$(1)$$(CFG_HOST_TRIPLE))
ifdef CFG_DISABLE_SHAREDSTD
SREQ$(1)$(2) = $(HOST_BIN$(1))/rustc$(X) \
$(HOST_LIB$(1))/$$(CFG_RUNTIME) \
SREQ$(1)$(2) = $$(HOST_BIN$(1))/rustc$(X) \
$$(HOST_LIB$(1))/$$(CFG_RUNTIME) \
$$(call CFG_STDLIB_DEFAULT,stage$(1),stage$(1)) \
$(HOST_LIB$(1))/$$(CFG_RUSTLLVM) \
$(TARGET_LIB$(1)$(2))/$$(CFG_RUNTIME) \
$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB) \
$(TARGET_LIB$(1)$(2))/intrinsics.bc \
$(TARGET_LIB$(1)$(2))/main.o \
$$(HOST_LIB$(1))/$$(CFG_RUSTLLVM) \
$$(TARGET_LIB$(1)$(2))/$$(CFG_RUNTIME) \
$$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB) \
$$(TARGET_LIB$(1)$(2))/intrinsics.bc \
$$(TARGET_LIB$(1)$(2))/main.o \
$$(MKFILES)
else
SREQ$(1)$(2) = $(HOST_BIN$(1))/rustc$(X) \
$(HOST_LIB$(1))/$$(CFG_RUNTIME) \
SREQ$(1)$(2) = $$(HOST_BIN$(1))/rustc$(X) \
$$(HOST_LIB$(1))/$$(CFG_RUNTIME) \
$$(call CFG_STDLIB_DEFAULT,stage$(1),stage$(1)) \
$(HOST_LIB$(1))/$$(CFG_RUSTLLVM) \
$(TARGET_LIB$(1)$(2))/$$(CFG_RUNTIME) \
$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB) \
$(TARGET_LIB$(1)$(2))/intrinsics.bc \
$(TARGET_LIB$(1)$(2))/main.o \
$$(HOST_LIB$(1))/$$(CFG_RUSTLLVM) \
$$(TARGET_LIB$(1)$(2))/$$(CFG_RUNTIME) \
$$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB) \
$$(TARGET_LIB$(1)$(2))/intrinsics.bc \
$$(TARGET_LIB$(1)$(2))/main.o \
$$(MKFILES)
endif
@ -205,17 +214,17 @@ else
CFG_VALGRIND_COMPILE$(1) = $$(CFG_VALGRIND_COMPILE)
endif
STAGE$(1) := $$(Q)$$(call CFG_RUN_TARG,stage$(1), \
$$(CFG_VALGRIND_COMPILE) stage$(1)/bin/rustc$$(X) \
STAGE$(1) := $$(Q)$$(call CFG_RUN_TARG,$(1), \
$$(CFG_VALGRIND_COMPILE) $$(HOST_BIN$(1))/rustc$$(X) \
$$(CFG_RUSTC_FLAGS) --target=$(2))
PERF_STAGE$(1) := $$(Q)$$(call CFG_RUN_TARG,stage$(1), \
$$(CFG_PERF_TOOL) stage$(1)/bin/rustc$$(X) \
PERF_STAGE$(1) := $$(Q)$$(call CFG_RUN_TARG,$(1), \
$$(CFG_PERF_TOOL) $$(HOST_BIN$(1))/rustc$$(X) \
$$(CFG_RUSTC_FLAGS) --target=$(2))
endef
FUZZ := stage1/bin/fuzzer$(X)
FUZZ := $(HOST_BIN$(1))/fuzzer$(X)
$(foreach target,$(CFG_TARGET_TRIPLES), \
$(eval $(call SREQ,0,$(target))) \

View file

@ -44,16 +44,16 @@ clean-misc:
define CLEAN_STAGE_N
clean$(1)$(2):
$(Q)rm -f stage$(1)/bin/rustc
$(Q)rm -f stage$(1)/bin/fuzzer
$(Q)rm -f stage$(1)/lib/$(CFG_RUNTIME)
$(Q)rm -f stage$(1)/lib/$(CFG_STDLIB)
$(Q)rm -f stage$(1)/lib/$(CFG_RUSTLLVM)
$(Q)rm -f stage$(1)/lib/rustc/$(2)/$(CFG_RUNTIME)
$(Q)rm -f stage$(1)/lib/rustc/$(2)/$(CFG_STDLIB)
$(Q)rm -f stage$(1)/lib/rustc/$(2)/libstd.rlib
$(Q)rm -f stage$(1)/lib/rustc/$(2)/intrinsics.bc
$(Q)rm -f stage$(1)/lib/rustc/$(2)/main.o
$(Q)rm -f $$(HOST_BIN$(1))/rustc
$(Q)rm -f $$(HOST_BIN$(1))/fuzzer
$(Q)rm -f $$(HOST_LIB$(1))/$(CFG_RUNTIME)
$(Q)rm -f $$(HOST_LIB$(1))/$(CFG_STDLIB)
$(Q)rm -f $$(HOST_LIB$(1))/$(CFG_RUSTLLVM)
$(Q)rm -f $$(TARGET_LIB$(1)$(2))/$(CFG_RUNTIME)
$(Q)rm -f $$(TARGET_LIB$(1)$(2))/$(CFG_STDLIB)
$(Q)rm -f $$(TARGET_LIB$(1)$(2))/libstd.rlib
$(Q)rm -f $$(TARGET_LIB$(1)$(2))/intrinsics.bc
$(Q)rm -f $$(TARGET_LIB$(1)$(2))/main.o
endef

View file

@ -4,13 +4,13 @@ FUZZER_INPUTS := $(wildcard $(addprefix $(S)src/fuzzer/, *.rs))
define FUZZ_STAGE_N
stage$(2)/bin/fuzzer$$(X): $$(FUZZER_CRATE) $$(FUZZER_INPUTS) \
$$(SREQ$(2)$(CFG_HOST_TRIPLE)) \
stage$(2)/lib/$$(CFG_RUNTIME) \
stage$(2)/lib/$$(CFG_RUSTLLVM) \
stage$(2)/lib/$$(CFG_STDLIB) \
stage$(2)/lib/$$(CFG_LIBRUSTC)
$$(SREQ$(2)$$(CFG_HOST_TRIPLE)) \
$$(HOST_LIB$(2))/$$(CFG_RUNTIME) \
$$(HOST_LIB$(2))/$$(CFG_RUSTLLVM) \
$$(HOST_LIB$(2))/$$(CFG_STDLIB) \
$$(HOST_LIB$(2))/$$(CFG_LIBRUSTC)
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)) -L stage1/lib -o $$@ $$<
$$(STAGE$(1)) -L $$(HOST_LIB$(2)) -o $$@ $$<
endef

View file

@ -2,7 +2,7 @@
ifdef CFG_PERF_TOOL
rustc-perf$(X): stage2/bin/rustc$(X)
@$(call E, perf compile: $@)
$(PERF_STAGE1) -L stage2 -o $@ $(COMPILER_CRATE) >rustc-perf.err 2>&1
$(PERF_STAGE1) -o $@ $(COMPILER_CRATE) >rustc-perf.err 2>&1
$(Q)rm -f $@
else
rustc-perf$(X): stage2/bin/rustc$(X)

View file

@ -98,7 +98,7 @@ ifdef CFG_UNIXY
CFG_EXE_SUFFIX :=
CFG_LDPATH :=
CFG_RUN=$(CFG_LDENV)=$(1) $(2)
CFG_RUN_TARG=$(call CFG_RUN,$(CFG_BUILD_DIR)/$(1)/lib,$(2))
CFG_RUN_TARG=$(call CFG_RUN,$(CFG_BUILD_DIR)/$(HOST_LIB$(1)),$(2))
CFG_RUN_TEST=$(call CFG_RUN,$(call CFG_TESTLIB,$(1)),\
$(CFG_VALGRIND) $(1))
CFG_LIBUV_LINK_FLAGS=-lpthread
@ -139,7 +139,7 @@ ifdef CFG_WINDOWSY
CFG_LDPATH :=$(CFG_LLVM_BINDIR)
CFG_LDPATH :=$(CFG_LDPATH):$$PATH
CFG_RUN=PATH="$(CFG_LDPATH):$(1)" $(2)
CFG_RUN_TARG=$(call CFG_RUN,$(1)/lib,$(2))
CFG_RUN_TARG=$(call CFG_RUN,$(HOST_LIB$(1)),$(2))
CFG_RUN_TEST=$(call CFG_RUN,$(call CFG_TESTLIB,$(1)),$(1))
CFG_LIBUV_LINK_FLAGS=-lWs2_32

View file

@ -12,10 +12,10 @@ else
"no-reformat\|xfail-pretty\|xfail-test")
endif
reformat: $(SREQ1)
reformat: $(SREQ1$(CFG_HOST_TRIPLE))
@$(call E, reformat [stage1]: $@)
for i in $(PP_INPUTS_FILTERED); \
do $(call CFG_RUN_TARG,stage1,stage1/rustc$(X)) \
do $(call CFG_RUN_TARG,1,stage1/rustc$(X)) \
--pretty normal $$i >$$i.tmp; \
if [ $$? -ne 0 ]; \
then echo failed to print $$i; rm $$i.tmp; \

View file

@ -1,13 +1,12 @@
snap-stage1: stage1/bin/rustc$(X) stage1/lib/$(CFG_RUNTIME) \
stage1/lib/$(CFG_RUSTLLVM) stage1/lib/$(CFG_STDLIB)
snap-stage1: $(HOST_BIN1)/rustc$(X) $(HOST_LIB1)/$(CFG_RUNTIME) \
$(HOST_LIB1)/$(CFG_RUSTLLVM) $(HOST_LIB1)/$(CFG_STDLIB)
$(S)src/etc/make-snapshot.py stage1
snap-stage2: stage2/bin/rustc$(X) stage2/lib/$(CFG_RUNTIME) \
stage2/lib/$(CFG_RUSTLLVM) stage2/lib/$(CFG_STDLIB)
$(S)src/etc/make-snapshot.py stage2
snap-stage3: stage3/bin/rustc$(X) stage3/lib/$(CFG_RUNTIME) \
stage3/lib/$(CFG_RUSTLLVM) stage3/lib/$(CFG_STDLIB)
$(S)src/etc/make-snapshot.py stage3
snap-stage1: $(HOST_BIN2)/rustc$(X) $(HOST_LIB2)/$(CFG_RUNTIME) \
$(HOST_LIB2)/$(CFG_RUSTLLVM) $(HOST_LIB2)/$(CFG_STDLIB)
$(S)src/etc/make-snapshot.py stage1
snap-stage1: $(HOST_BIN3)/rustc$(X) $(HOST_LIB3)/$(CFG_RUNTIME) \
$(HOST_LIB3)/$(CFG_RUSTLLVM) $(HOST_LIB3)/$(CFG_STDLIB)
$(S)src/etc/make-snapshot.py stage1

View file

@ -1,22 +1,22 @@
stage0/bin/rustc$(X): $(S)src/snapshots.txt $(S)src/etc/get-snapshot.py $(MKFILES)
$(HOST_BIN0)/rustc$(X): $(S)src/snapshots.txt $(S)src/etc/get-snapshot.py $(MKFILES)
@$(call E, fetch: $@)
$(Q)$(S)src/etc/get-snapshot.py
$(Q)touch $@
# Host libs will be made in the process of making rustc above.
stage0/lib/$(CFG_RUNTIME): stage0/bin/rustc$(X)
$(HOST_LIB0)/$(CFG_RUNTIME): $(HOST_BIN0)/rustc$(X)
$(Q)touch $@
stage0/lib/$(CFG_STDLIB): stage0/bin/rustc$(X)
$(HOST_LIB0)/$(CFG_STDLIB): $(HOST_BIN0)/rustc$(X)
$(Q)touch $@
stage0/lib/$(CFG_RUSTLLVM): stage0/bin/rustc$(X)
$(HOST_LIB0)/$(CFG_RUSTLLVM): $(HOST_BIN0)/rustc$(X)
$(Q)touch $@
# Instantiate template (in stageN.mk) for building
# target libraries.
SREQpre = stage0/lib/$(CFG_HOST_TRIPLE)/main.o $(MKFILES)
SREQpre = $(MKFILES)
$(eval $(call TARGET_LIBS,pre,0,$(CFG_HOST_TRIPLE)))

View file

@ -19,37 +19,37 @@ define STAGE_N
# for different directories, to handle cases where (say) a test relies on a
# compiler that relies on a .o file.
stage$(2)/bin/%.o: stage$(2)/bin/%.s
$$(HOST_BIN$(2))/%.o: $$(HOST_BIN$(2))/%.s
@$$(call E, assemble [gcc]: $$@)
$$(Q)gcc $$(CFG_GCCISH_CFLAGS) -o $$@ -c $$<
stage$(2)/lib/%.o: stage$(2)/lib/%.s
$$(HOST_LIB$(2))/%.o: $$(HOST_LIB$(2))/%.s
@$$(call E, assemble [gcc]: $$@)
$$(Q)gcc $$(CFG_GCCISH_CFLAGS) -o $$@ -c $$<
stage$(2)/bin/rustc$$(X): $$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
stage$(2)/lib/$$(CFG_RUNTIME) \
$$(HOST_BIN$(2))/rustc$$(X): $$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
$$(HOST_LIB$(2))/$$(CFG_RUNTIME) \
$$(call CFG_STDLIB_DEFAULT,stage$(1),stage$(2)) \
stage$(2)/lib/$$(CFG_RUSTLLVM) \
$$(HOST_LIB$(2))/$$(CFG_RUSTLLVM) \
$$(SREQ$(1)$(3))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)) -L stage$(2)/lib -o $$@ $$<
$$(STAGE$(1)) -L $$(HOST_LIB$(2)) -o $$@ $$<
stage$(2)/lib/$$(CFG_LIBRUSTC): \
$$(HOST_LIB$(2))/$$(CFG_LIBRUSTC): \
$$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
$$(SREQ$(2)$(3))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)) -L stage$(2)/lib --lib -o $$@ $$<
$$(STAGE$(1)) -L $$(HOST_LIB$(2)) --lib -o $$@ $$<
stage$(2)/lib/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
$$(HOST_LIB$(2))/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
@$$(call E, cp: $$@)
$$(Q)cp $$< $$@
stage$(2)/lib/$$(CFG_STDLIB): stage$(1)/lib/rustc/$$(CFG_HOST_TRIPLE)/$$(CFG_STDLIB)
$$(HOST_LIB$(2))/$$(CFG_STDLIB): $$(TARGET_HOST_LIB$(1))/$$(CFG_STDLIB)
@$$(call E, cp: $$@)
$$(Q)cp $$< $$@
stage$(2)/lib/$$(CFG_RUSTLLVM): rustllvm/$$(CFG_RUSTLLVM)
$$(HOST_LIB$(2))/$$(CFG_RUSTLLVM): rustllvm/$$(CFG_RUSTLLVM)
@$$(call E, cp: $$@)
$$(Q)cp $$< $$@
@ -66,35 +66,35 @@ define TARGET_LIBS
# using these exclusively, you should delete the non-arch-prefixed
# rules above. They're duplicates, redundant.
stage$(2)/lib/rustc/$(3)/intrinsics.bc: $$(INTRINSICS_BC)
$$(TARGET_LIB$(2)$(3))/intrinsics.bc: $$(INTRINSICS_BC)
@$$(call E, cp: $$@)
$$(Q)cp $$< $$@
stage$(2)/lib/rustc/$(3)/main.o: rt/main.o
$$(TARGET_LIB$(2)$(3))/main.o: rt/main.o
@$$(call E, cp: $$@)
$$(Q)cp $$< $$@
stage$(2)/lib/rustc/$(3)/$$(CFG_STDLIB): \
$$(TARGET_LIB$(2)$(3))/$$(CFG_STDLIB): \
$$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
stage$(2)/bin/rustc$$(X) \
stage$(2)/lib/$$(CFG_RUNTIME) \
stage$(2)/lib/$$(CFG_RUSTLLVM) \
stage$(2)/lib/rustc/$(3)/intrinsics.bc \
$$(HOST_BIN$(2))/rustc$$(X) \
$$(HOST_LIB$(2))/$$(CFG_RUNTIME) \
$$(HOST_LIB$(2))/$$(CFG_RUSTLLVM) \
$$(TARGET_LIB$(2)$(3))/intrinsics.bc \
$$(SREQ$(1)$(3))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(2)) --lib -o $$@ $$<
stage$(2)/lib/rustc/$(3)/libstd.rlib: \
$$(TARGET_LIB$(2)$(3))/libstd.rlib: \
$$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
stage$(2)/bin/rustc$$(X) \
stage$(2)/lib/$$(CFG_RUNTIME) \
stage$(2)/lib/$$(CFG_RUSTLLVM) \
stage$(2)/lib/rustc/$(3)/intrinsics.bc \
$$(HOST_BIN$(2))/rustc$$(X) \
$$(HOST_LIB$(2))/$$(CFG_RUNTIME) \
$$(HOST_LIB$(2))/$$(CFG_RUSTLLVM) \
$$(TARGET_LIB$(2)$(3))/intrinsics.bc \
$$(SREQ$(1)$(3))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(2)) --lib --static -o $$@ $$<
stage$(2)/lib/rustc/$(3)/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
$$(TARGET_LIB$(2)$(3))/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
@$$(call E, cp: $$@)
$$(Q)cp $$< $$@

View file

@ -68,7 +68,7 @@ STDTEST_INPUTS := $(wildcard $(S)src/test/stdtest/*rs)
ifdef CTEST_VALGRIND
CFG_RUN_CTEST=$(call CFG_RUN_TEST,$(2))
else
CFG_RUN_CTEST=$(call CFG_RUN,stage$(1)/lib/rustc/$(CFG_HOST_TRIPLE),$(2))
CFG_RUN_CTEST=$(call CFG_RUN,$(TARGET_HOST_LIB$(1)),$(2))
endif
######################################################################
@ -146,16 +146,16 @@ test/stdtest.stage$(2).out.tmp: test/stdtest.stage$(2)$$(X)
check-stage$(2)-rustc: test/rustctest.stage$(2).out \
test/rustctest.stage$(2)$$(X): $$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
stage$(2)/lib/$$(CFG_RUNTIME) \
$$(HOST_LIB$(2))/$$(CFG_RUNTIME) \
$$(call CFG_STDLIB_DEFAULT,stage$(1),stage$(2)) \
stage$(2)/lib/$$(CFG_RUSTLLVM) \
$$(HOST_LIB$(2))/$$(CFG_RUSTLLVM) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)) -o $$@ $$< --test
test/rustctest.stage$(2).out.tmp: test/rustctest.stage$(2)$$(X)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN,$(CFG_BUILD_DIR)/stage$(2)/lib,$$(CFG_VALGRIND) $$<) \
$$(Q)$$(call CFG_RUN,$$(HOST_LIB$(2)),$$(CFG_VALGRIND) $$<) \
$$(TESTARGS)
$$(Q)touch $$@
@ -185,9 +185,9 @@ check-stage$(2)-pretty: check-stage$(2)-pretty-rpass \
check-stage$(2)-pretty-bench \
check-stage$(2)-pretty-pretty \
CTEST_COMMON_ARGS$(2) := --compile-lib-path stage$(2)/lib \
--run-lib-path stage$(2)/lib/$$(CFG_HOST_TRIPLE) \
--rustc-path stage$(2)/bin/rustc$$(X) \
CTEST_COMMON_ARGS$(2) := --compile-lib-path $$(HOST_LIB$(2)) \
--run-lib-path $$(TARGET_LIB$(2)$$(CFG_HOST_TRIPLE)) \
--rustc-path $$(HOST_BIN$(2))/rustc$$(X) \
--stage-id stage$(2) \
--rustcflags "$$(CFG_RUSTC_FLAGS)" \
$$(CTEST_TESTARGS) \
@ -204,19 +204,19 @@ RFAIL_ARGS$(2) := $$(CTEST_COMMON_ARGS$(2)) \
$$(CTEST_RUNTOOL) \
RPASS_ARGS$(2) := $$(CTEST_COMMON_ARGS$(2)) \
--src-base $(S)src/test/run-pass/ \
--src-base $$(S)src/test/run-pass/ \
--build-base test/run-pass/ \
--mode run-pass \
$$(CTEST_RUNTOOL) \
BENCH_ARGS$(2) := $$(CTEST_COMMON_ARGS$(2)) \
--src-base $(S)src/test/bench/ \
--src-base $$(S)src/test/bench/ \
--build-base test/bench/ \
--mode run-pass \
$$(CTEST_RUNTOOL) \
PERF_ARGS$(2) := $$(CTEST_COMMON_ARGS$(2)) \
--src-base $(S)src/test/bench/ \
--src-base $$(S)src/test/bench/ \
--build-base test/perf/ \
--mode run-pass \
$$(CTEST_PERF_RUNTOOL) \
@ -324,9 +324,9 @@ stage2/lib/$(FT_LIB): test/$(FT).rc $(SREQ2$(CFG_HOST_TRIPLE))
@$(call E, compile_and_link: $@)
$(STAGE2) --lib -o $@ $<
test/$(FT_DRIVER)$(X): test/$(FT_DRIVER).rs stage2/lib/$(FT_LIB) $(SREQ2$(CFG_HOST_TRIPLE))
test/$(FT_DRIVER)$(X): test/$(FT_DRIVER).rs $(HOST_LIB2)/$(FT_LIB) $(SREQ2$(CFG_HOST_TRIPLE))
@$(call E, compile_and_link: $@)
$(STAGE2) -L stage2/lib -o $@ $<
$(STAGE2) -L $(HOST_LIB2) -o $@ $<
test/$(FT_DRIVER).out: test/$(FT_DRIVER)$(X) $(SREQ2$(CFG_HOST_TRIPLE))
$(Q)$(call CFG_RUN_TEST, $<)