我正在GNUmake上通过解析整个目录来创建指向特定文件的符号链接,该目录具有一个需要链接的文件夹。
这是我的makefile代码段。
TGT_LINK = /lan/test/workspace/build/tools
all_target: release_buid complete_test $(TGT_LINK)
$(TGT_LINK):
if [ ! -d $@ ]; then mkdir -p $@; fi
cd $@; \
tar_ln=`\ls -d synopsystcl* | sed 's/synopsys//'`; \
sour_dir=`\ls -d synopsystcl*`; \
if ! [ -e $tar_ln ]; then \
ln -s $sour_dir $tar_ln; \
fi
目录:/ lan / test / workspace / build / tools其中包含以下内容
polaris.so link.a dynamic.so kbuild.so README.txt license.txt synopsystcl5.5 build.json
在这里,我尝试使用上面的目标tcl5.5
代码创建名称为synopsystcl5.5
指向$(TGT_LINK)
的符号链接。
tcl5.5 -> synopsystcl5.5
在成功完成两个目标release_buid complete_test
之后,构建不会继续进行下一个目标$(TGT_LINK)
来创建符号链接。您能帮忙解决代码中的错误吗?
答案 0 :(得分:1)
我会让make
本身检查并根据需要重新创建符号链接,即:
TGT_LINK = /lan/test/workspace/build/tools
all_target: release_buid complete_test symlink
.PHONY: symlink
symlink: $(patsubst $(TGT_LINK)/tcl%, $(TGT_LINK)/synopsystcl%, $(wildcard $(TGT_LINK)/tcl*))
$(TGT_LINK)/synopsystcl%: $(TGT_LINK)/tcl%
set -e; \
cd $(@D); \
rm -f $(@F); \
ln -s $(<F) $(@F)
如果确实存在依赖关系,我还将考虑对目标进行重新排序。永远不要以为从属列表是从左到右处理的。涉及并行构建(-j
)时,也会导致错误。如果您有依赖关系,认为某些事情应该先于其他事情发生,则应明确声明,例如:
all_target: symlink
symlink: complete_test
complete_test: release_buid