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

时间:2019-10-10 13:01:03

标签: gcc makefile gnu-make

我正在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)来创建符号链接。您能帮忙解决代码中的错误吗?

1 个答案:

答案 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