Make:我们可以在 GNUmakefile 中将目录作为目标吗

Make: Can we have directories as a target in GNUmakefile

我正在 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

我在这里尝试使用我上面的目标 $(TGT_LINK) 代码创建名称 tcl5.5 指向 synopsystcl5.5 的符号链接。

tcl5.5 -> synopsystcl5.5 

成功完成两个目标后:release_buid complete_test,构建不会继续为下一个目标 $(TGT_LINK) 创建符号链接。你能帮忙看看代码有什么问题吗?

我会让 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