У меня есть довольно большой make-файл, который на лету создает несколько целей, вычисляя имена из переменных. (например, foo $ (VAR): $ (PREREQS)). Есть ли способ убедить gnu make выдать список целей после расширения этих переменных?
Я хотел бы иметь возможность получать цели для произвольного make-файла. Я пытаюсь написать функцию завершения для своей оболочки.
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
.-r
Удаляет скрытые правила.Взято из завершения make arg, которое работает как шарм.
источник
~/bin
а не использовал псевдоним. Прекрасно работает; Спасибо!alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
который сэкономит вам 2 минуты цитирования игр :-)| sort -u
выглядит полезнее :)Я не уверен, что это только gnu make, но это хорошо работает:
make help
источник
Несколько респондентов предложили использовать
make -pn
, который распечатает базу данных правил, но ничего не выполнит - более или менее. Проблема с этим подходом заключается в том, что-n
он по-прежнему вызывает все рекурсивные make, и он по-прежнему выполняет гораздо больше работы, чем необходимо, потому что он распечатывает каждую команду, которую он вызвал бы в обычной сборке. Более эффективным решением было бы создание тривиального make-файла dummy.mk с таким содержимым:Теперь вызываем make as
make -p -f Makefile -f dummy.mk __all_targets__
. При любой существенной сборке разница в объеме вывода, генерируемого make, значительна. Например:Время выполнения также было значительно лучше - 2,063 с для первой версии, 0,059 с для второй.
источник
time make -pn | wc -l
":1338738 real 0m47.754s.
"time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l
":938621 real 0m40.219s
.make
кажется, предлагает нечто похожее, но дружелюбное, а именноmake -p -f/dev/null
-f /dev/null
предотвратитmake
синтаксический анализ обычных make-файлов, поэтому вы получите распечатку только встроенных правил. Вот почему мое решение указывает-f Makefile -f dummy.mk
. Но и этого недостаточно, потому что with-n
,make
продолжит выполнение и также фактически начнет выполнять правила в make-файле. К сожалению, мне не известны какие-либо модификации, которые могут упростить решение в том виде, в котором оно было представлено изначально.-n
...»Проверьте завершение bash для make на GitHub.
источник
Изменить: к вашему сведению, репозиторий git завершения debian bash в другом ответе теперь включает расширенную версию этого сценария, адаптированную для случаев использования завершения bash.
Это гораздо более полный сценарий, чем сценарий завершения debian bash, потому что он предоставляет результаты для сгенерированных правил, о которых и спрашивает вопрос, а ответ, получивший наибольшее количество голосов (сценарий завершения debian bash на сервере debian git), не подходит.
Это не исходный сценарий, на который я ссылался, но он намного проще и работает на несколько шагов быстрее.
источник
Это код для псевдонима на основе решения Тодда Ходса.
источник
Это даст хороший результат:
источник
Здесь есть очень хорошее решение с магией sed и egrep: https://gist.github.com/pvdb/777954
источник
Думаю, я немного опоздал на эту вечеринку, но если вы ищете конкретную команду, вы можете попробовать
Это в основном работает, хотя может включать некоторые нецелевые вещи, такие как
vpath
директивы. Если вы не зависите отmake
встроенных правил, вы можете использовать ихmake -qpR
как первую команду в конвейере.источник
Рубиновый раствор:
источник
Я работаю над Solaris 10 и Turbo C. Данное решение не работает для моего проекта makefile. даже после изменения синтаксиса командной строки выше на tcsh. Однако я обнаружил, что вы можете получить простое решение, используя
переделанная версия:
является
и некоторые другие неважные данные о версии
источник
Я искал тот же вопрос и придумал такой вариант:
Это удаляет все строки комментариев, правила шаблонов (строки, начинающиеся с табуляции), все встроенные функции (пример
.c.o
и%.o: %.c
шаблоны).источник
Нашел это решение в другом потоке:
Вы также можете добавить его в свой
Makefile
:И выполнить
make list
.источник
Конечно, но когда вы хотите, чтобы он их выплюнул?
Чтобы сообщить имя цели при выполнении правила, поместите строку в правило:
Чтобы выплюнуть их всех сразу, вы можете создать отдельную цель PHONY:
И это можно сделать предпосылкой для вашей цели по умолчанию:
EDIT:
вам нужен способ показать все возможные цели произвольного make-файла, что, как я полагаю, означает ненавязчиво. Хорошо...
Чтобы сделать это точно и иметь возможность справляться со сложными make-файлами, например, с использованием правил, построенных с помощью
eval
операторов, вам нужно будет написать что-то похожее на эмулятор Make. Непрактично.Чтобы увидеть цели простых правил, вы можете написать make-файл, который будет действовать как сканер make-файла, работая с произвольным make-файлом:
Это была бы впечатляющая работа. Вы уверены, что цель стоит затраченных усилий?
источник
источник
:=
).