Tup 变体构建不正确
Tup variants not building correctly
我从 make 切换到 tup 并试图让它构建不同的变体(调试和生产)。我的源代码树如下所示:
| .tup
| bin
| build_debug
| | tup.config
| build_default
| | tup.config
| include (headers directory)
| src (source files directory)
| | runs (directory containing additional source files)
| Tupfile
还有我的Tupfile
:
preload bin
preload src
preload src/runs
COMPILER = g++
ifeq (@(DEBUG),y)
FLAGS = -Wall -std=c++17 -O0 -g
else
FLAGS = -Wall -std=c++17 -O3 -march=native -flto -pipe
endif
: foreach src/*.cc src/runs/*.cc |> $(COMPILER) -c %f -o %o $(FLAGS) |> %B.o
: src/*.o src/runs/*.o |> $(COMPILER) %f -o %o $(FLAGS) |> bin/a.out
我希望它在 src
目录中创建目标文件,并在 build*
目录中的 bin
目录中创建二进制文件。
当我 运行 tup
时,它将直接在 build*
目录中创建目标文件(因此不在 build*/src
目录中)并且不创建任何二进制文件。
我做错了什么?
编辑:
在没有任何 build*
目录的基本目录中构建时,它会创建一个二进制文件,但也会将目标文件放在基本目录中,而不是 src
.
中
所以我借助tup手册解决了。
%B 只扩展为文件名,而不是文件名包括文件相对于basedir 的路径,这就是为什么在基目录中创建目标文件而无法生成二进制文件的原因(我以为是之所以有效,是因为我还有一些使用 make 生成的旧目标文件)。
我将 Tupfile
重写为:
preload src
preload src/runs
COMPILER = g++
ifeq (@(DEBUG),y)
FLAGS = -Wall -std=c++17 -O0 -g
else
FLAGS = -Wall -std=c++17 -O3 -march=native -flto -pipe
endif
: foreach src/*.cc |> $(COMPILER) -c %f -o %o $(FLAGS) |> src/%B.o
: foreach src/runs/*.cc |> $(COMPILER) -c %f -o %o $(FLAGS) |> src/runs/%B.o
: src/*.o src/runs/*.o |> $(COMPILER) %f -o %o $(FLAGS) |> bin/a.out
我从 make 切换到 tup 并试图让它构建不同的变体(调试和生产)。我的源代码树如下所示:
| .tup
| bin
| build_debug
| | tup.config
| build_default
| | tup.config
| include (headers directory)
| src (source files directory)
| | runs (directory containing additional source files)
| Tupfile
还有我的Tupfile
:
preload bin
preload src
preload src/runs
COMPILER = g++
ifeq (@(DEBUG),y)
FLAGS = -Wall -std=c++17 -O0 -g
else
FLAGS = -Wall -std=c++17 -O3 -march=native -flto -pipe
endif
: foreach src/*.cc src/runs/*.cc |> $(COMPILER) -c %f -o %o $(FLAGS) |> %B.o
: src/*.o src/runs/*.o |> $(COMPILER) %f -o %o $(FLAGS) |> bin/a.out
我希望它在 src
目录中创建目标文件,并在 build*
目录中的 bin
目录中创建二进制文件。
当我 运行 tup
时,它将直接在 build*
目录中创建目标文件(因此不在 build*/src
目录中)并且不创建任何二进制文件。
我做错了什么?
编辑:
在没有任何 build*
目录的基本目录中构建时,它会创建一个二进制文件,但也会将目标文件放在基本目录中,而不是 src
.
所以我借助tup手册解决了。
%B 只扩展为文件名,而不是文件名包括文件相对于basedir 的路径,这就是为什么在基目录中创建目标文件而无法生成二进制文件的原因(我以为是之所以有效,是因为我还有一些使用 make 生成的旧目标文件)。
我将 Tupfile
重写为:
preload src
preload src/runs
COMPILER = g++
ifeq (@(DEBUG),y)
FLAGS = -Wall -std=c++17 -O0 -g
else
FLAGS = -Wall -std=c++17 -O3 -march=native -flto -pipe
endif
: foreach src/*.cc |> $(COMPILER) -c %f -o %o $(FLAGS) |> src/%B.o
: foreach src/runs/*.cc |> $(COMPILER) -c %f -o %o $(FLAGS) |> src/runs/%B.o
: src/*.o src/runs/*.o |> $(COMPILER) %f -o %o $(FLAGS) |> bin/a.out