I wouldn't recommend trying this - by moving the 'tup init' down into the build directory, tup would not be saving dependencies on files outside of that tree by default. You could set the tup option updater.full_deps to 1 to track those now "external" dependencies on your source code (where "external" means they are somewhere outside of the subtree where .tup exists), but in addition to the system links it adds another level of wonkyness.
Another option is to try to roll your own variants. Depending on how complicated your project is and your familiarity with Lua, this could be pretty easy or very difficult. Here's a tiny example to see what I mean:
project_root/
Tupdefault.lua
Tuprules.lua
core_sources/
foo.c
bar.c
sub/
coresub.c
Tuprules.lua:
-- PROJECT_ROOT is a relative directory always pointing to the root of the project
PROJECT_ROOT = tup.getcwd()
-- BUILD_ROOT is similar, it points to where variants should go
BUILD_ROOT = PROJECT_ROOT .. '/build/'
Tupdefault.lua
-- Our list of variants (presumably each one would have different CCFLAGS or whatever)
variants = {'build1', 'build2', 'build3'}
-- This variable lets us keep the source structure in the builddir (ie: core_sources/foo.c becomes build/variant/core_sources/foo.o)
subdir = tup.getrelativedir(PROJECT_ROOT)
-- Build each variant - most of the wonkyness is in the path construction of the output file, since normally tup expects you to write to an output alongside the Tupfile.
local k, v
for k, v in ipairs(variants) do
tup.foreach_rule('*.c', 'gcc -c %f -o %o', BUILD_ROOT .. v .. '/' .. subdir .. '/%B.o')
end
This results in the following structure in build:
build/build3
build/build3/core_sources
build/build3/core_sources/foo.o
build/build3/core_sources/bar.o
build/build3/core_sources/sub
build/build3/core_sources/sub/subcore.o
build/build2
build/build2/core_sources
build/build2/core_sources/foo.o
build/build2/core_sources/bar.o
build/build2/core_sources/sub
build/build2/core_sources/sub/subcore.o
build/build1
build/build1/core_sources
build/build1/core_sources/foo.o
build/build1/core_sources/bar.o
build/build1/core_sources/sub
build/build1/core_sources/sub/subcore.o
Hope that helps,
-Mike