Make: Можем ли мы иметь каталоги в качестве цели в GNUmakefile - PullRequest
0 голосов
/ 10 октября 2019

Я работаю над 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 Ответ

1 голос
/ 17 октября 2019

Я бы позволил 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
...