默认情况下,从编译中停止GNU make

时间:2017-06-10 14:25:07

标签: makefile gnu-make

我只想使用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

这似乎是一个内置的食谱。

1 个答案:

答案 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 --traceremake -x来调试您的Makefile。

顺便说一下,备份只有Makefile 是没用的;写一个shell脚本。

如果您不使用任何版本控制系统(如git),我也强烈建议您使用。请注意,git有一个archive子命令,可能是一个更聪明的备份。