我只想使用GNU make来压缩一些文件。 所以我按如下方式编写了Makefile:
lib.tar.lzma: $(shell find ~/lib -name "*")
rm -f lib.tar.lzma
tar -cavf lib.tar.lzma -C ~/ lib/
但是,在运行make之后,它会自动编译该目录中的c ++源代码。
如何阻止它们编译?我只想压缩它们。
更新
我收到以下错误:
<builtin>: recipe for target '/home/xxx/lib/app' failed
这似乎是一个内置的食谱。
答案 0 :(得分:2)
(我们不知道你的整个 Makefile
和你的完整的文件树,所以这只是一个猜测;我假设你有向我们展示了你更大的Makefile
)
但是,在运行make之后,它会自动编译该目录中的c ++源代码。
可能会发生这种情况,因为您的$(shell find ~/lib -name "*")
已扩展为包含目标文件的内容。由于它们位于依赖项中,因此如果它更新,则会重新编译它们的源文件。顺便说一句,你可能想要使用$(shell cd .. ; find lib -name "*")
或lib
没有子目录$(wildcard ../lib/*)
你可能不需要对lib.tar.lzma
目标有任何依赖,所以只需:
lib.tar.lzma:
rm -f lib.tar.lzma
tar -cavf lib.tar.lzma -C ~/ lib/
顺便说一下,-C ~/
可能应-C $$HOME
,因为make
使用/bin/sh
来运行命令,并且POSIX shell不了解~
{1}};或许-C ..
可能会更好......
也许你可以编写一些shell脚本make-backup.sh
来做一个更聪明的tar
,然后你会编码
lib.tar.lzma: make-backup.sh
./make-backup.sh $@
但是,也许你做有依赖关系(例如,如果你需要存档一些生成的文件)。然后你需要明确而明智地列出它们(你当然不想依赖所有文件;也许只有源文件)。此外,如果您有一些(但是YMMV),您可能不需要归档任何目标文件*.o
。
我建议使用make --trace
或remake
-x
来调试您的Makefile。
顺便说一下,备份只有Makefile
是没用的;写一个shell脚本。
如果您不使用任何版本控制系统(如git),我也强烈建议您使用。请注意,git
有一个archive
子命令,可能是一个更聪明的备份。