Как вы получаете список целей в make-файле? - PullRequest
164 голосов
/ 18 ноября 2010

Я немного использовал rake (программа Ruby make), и у него есть возможность получить список всех доступных целей, например

> rake --tasks
rake db:charset      # retrieve the charset for your data...
rake db:collation    # retrieve the collation for your da...
rake db:create       # Creates the databases defined in y...
rake db:drop         # Drops the database for your curren...
...

но, похоже, нет возможности сделать это в GNU make.

Видимо, код почти готов для этого, по состоянию на 2007 год - http://www.mail-archive.com/help-make@gnu.org/msg06434.html.

В любом случае, я немного взломал, чтобы извлечь цели из make-файла, который можно включить в make-файл.

list:
    @grep '^[^#[:space:]].*:' Makefile

Это даст вам список определенных целей. Это только начало - оно не фильтрует зависимости, например.

> make list
list:
copy:
run:
plot:
turnin:

Ответы [ 13 ]

1 голос
/ 08 сентября 2017

Это было полезно для меня, потому что я хотел увидеть цели сборки, требуемые (и их зависимости) целью make.Я знаю, что создание целей не может начинаться с "."персонаж.Я не знаю, какие языки поддерживаются, поэтому я использовал скобочные выражения egrep.

cat Makefile | egrep "^[[:alnum:][:punct:]]{0,}:[[:space:]]{0,}[[:alnum:][:punct:][:space:]]{0,}$"
0 голосов
/ 14 апреля 2019

Еще один дополнительный ответ на вопрос выше.

протестировано на MacOSX с использованием только cat и awk на терминале

cat Makefile | awk '!/SHELL/ && /^[A-z]/ {print $1}' | awk '{print substr($0, 1, length($0)-1)}'

выведет файл make, как показано ниже:

target1

target2

target3

в Makefile, это должен быть тот же оператор, убедитесь, что вы экранируете переменные, используя переменную $$, а не переменную $.

Объяснение

кошка - выплевывает содержимое

| - труба анализирует вывод на следующий awk

awk - выполняет регулярное выражение, исключая "shell" и принимая только строки "A-z", а затем печатает первый столбец $ 1

awk - еще раз удаляет последний символ ":" из списка

это грубый вывод, и вы можете делать более интересные вещи с помощью всего лишь AWK. Старайтесь избегать sed, поскольку он не так согласован в вариантах BSD, то есть некоторые работают на * nix, но не работают на BSD, таких как MacOSX.

Подробнее

Вы можете добавить это (с изменениями) в файл для make , в папку завершения bash по умолчанию /usr/local/etc/bash-completion.d / это означает, что когда вы "делаете вкладка вкладка " .. она выполнит цели на основе одного скрипта лайнера.

0 голосов
/ 16 октября 2014

не уверен, почему предыдущий ответ был таким сложным:

list:
    cat Makefile | grep "^[A-z]" | awk '{print $$1}' | sed "s/://g" 
...