Как передать только значение аргумента цели Makefile? - PullRequest
0 голосов
/ 09 июня 2018

Я из мира NodeJS, поэтому я считаю Makefile частью скриптов в npm package.json, что может быть неправильно (или нет?).

Так что моя идея таковаавтоматизировать повторяющиеся действия при установке новой зависимости, набрав:

make install github.com/stretchr/testify

и найти способ получить github.com/stretchr/testify параметр без необходимости использовать объявление имени-значения тяжелого параметра FOO=bar (=> make install DEP=github.com/stretchr/testify) обычно предлагается.

Итак, следуя этому ответу , я попытался это сделать:

install %:
    go get $*
    godep save ./...
    git add Godeps vendor
    git commit -m "godep: add $*"

, но безуспешно: он запускается go get без каких-либо параметров и git commit -m "godep: add".

Испытания

1 - Когда я это сделаю:

install %:
    echo $*

Я вижу мой "github.com/stretchr/testify".

2 - Когда я это делаю:

install %:
    go get ${*}

, он зацикливается дважды и первый запуск go getбез каких-либо параметров, затем запускается go get github.com/stretchr/testify (по желанию).

Похоже, что ${*} представляет «массив» параметров, разбирающих группы символов после цели, первый из которых представляет собой пробел междуinstall и github.com/stretchr/testify, а вторым является github.com/stretchr/testify.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Вы не можете использовать явные цели и шаблоны в одном правиле, поэтому ваше правило % install: не будет работать.

Вы можете сделать это с помощью GNU make, используя переменную CMDGOALS , но он очень хакерский и подвержен ошибкам, и я не рекомендую его.

ARG := $(filter-out install,$(MAKECMDGOALS))

install:
        go get $(ARG)
        godep save ./...
        git add Godeps vendor
        git commit -m "godep: add $(ARG)"

Как вы можете видеть, вам нужно будет добавить обработку для ситуаций, когда нет других аргументов или где естьбольше, чем один другой аргумент, и, конечно, вы не можете добавить больше целей, не помещая их в список filter-out и т. д.

Просто ... не очень хороший способ сделать это, IMO.

Почему бы вам не сделать что-то подобное вместо этого:

install-%:
        go get $*
        godep save ./...
        git add Godeps vendor
        git commit -m "godep: add $*"

Затем запустите:

make install-github.com/stretchr/testify
0 голосов
/ 09 июня 2018

Переменные make, вероятно, могут делать то, что вы хотите:

host> cat Makefile
install:
    go get $(P)
    godep save ./...
    git add Godeps vendor
    git commit -m "godep: add $(P)"

host> make install P=github.com/stretchr/testify

Но использование make только для этого, вероятно, излишне.Это гораздо больше, чем язык сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...