【发布时间】:2023-01-13 23:19:47
【问题描述】:
我的Makefile 看起来像这样(删除了一些不相关的目标,例如“调试”):
release: comprel
a2ssvr: release
libtelopa.so:
cd telop/neta/lib && make && cp libtelopa.so ../../../
comprel: libtelopa.so
go build -ldflags="-s -w" .
upx --best --lzma a2ssvr
clean:
cd telop/neta/lib && make clean
git clean -fdX
distclean: clean
rm -fr a2s_*.deb
deb: a2ssvr libtelopa.so
rm -fr debian.deb
cp libtelopa.so debian/opt/a2s/bin
cp libjson/* debian/opt/a2s/bin
cp a2ssvr debian/opt/a2s/bin/a2s
dpkg-deb --build --root-owner-group debian
rm -fr a2s*.deb
dpkg-name debian.deb
如果我从 git 存储库签出一个新副本,它工作正常。但是,在我创建项目后,在项目根文件夹中生成了一个可执行文件a2ssvr,在这种情况下,如果我再次运行make deb,我希望release目标是不是叫。但是,每次我做make deb时都会调用它。奇怪的是,libtelopa.so 目标是不是如果文件已经存在则调用。
问题是什么,如果已经构建,我如何避免构建可执行文件?
【问题讨论】:
-
标记非文件目标 .PHONY。 Target 仅在其早于其依赖项时才重建。
-
deb依赖于a2ssvr,a2ssvr依赖于release。如果依赖关系不正确,它们应该是什么? -
标题中的问题似乎是关于截然相反的问题(这也是
make开箱即用的默认行为)所以这很令人困惑。 -
@tripleee,如果 a2ssvr 已经存在,它所依赖的应该无关紧要,对吧?如果我不添加
a2ssvr: release,如果 a2ssvr 不存在,make 将失败,无论如何这是初始情况。 -
这一切似乎都解决了古老的问题“我输入虚假依赖项是因为我很困惑,现在
make也是。”
标签: makefile