Перечислите цели / задачи в GNU make, которые содержат переменные в своем определении - PullRequest
99 голосов
/ 17 июня 2010

У меня довольно большой make-файл, который на лету создает несколько целей, вычисляя имена из переменных. (например, foo $ (VAR): $ (PREREQS)). Есть ли способ убедить gnu make выпустить список целей после расширения этих переменных?

Я бы хотел иметь возможность получить цели для сборочного файла. Я пытаюсь написать функцию завершения для моей оболочки.

Ответы [ 16 ]

1 голос
/ 20 сентября 2015

Я работаю над солярисом 10 и турбо С оболочкой. Данное решение не работает для моего проекта makefile. даже после изменения командной строки выше синтаксиса tcsh. Тем не менее, я узнал, что вы можете получить простое решение, используя

remake --tasks | grep -v "clean some static output or just grep tabs on start of line" | awk ´{print $1}´

римейк версия:

remake --version

есть

GNU Make 3.82+dbg0.8
Built for sparc-sun-sparc2-9

и некоторые другие неважные данные версии

1 голос
/ 09 ноября 2012

Рубиновый раствор:

`make -qp`.split("\n").select{|l| l =~ /^\w/ && l !~ /=/}.map{|l| l.sub(/:.*/,'')}
0 голосов
/ 03 декабря 2017

Нашел это решение в другой ветке:

sh -c "cat Makefile | egrep \"^[[:alnum:][:punct:]]{0,}:[[:space:]]{0,}[[:alnum:][:punct:][:space:]]{0,}$\""

Вы также можете добавить его к своему Makefile:

list:
    sh -c "cat Makefile | egrep \"^[[:alnum:][:punct:]]{0,}:[[:space:]]{0,}[[:alnum:][:punct:][:space:]]{0,}$\\""

И выполнить make list.

0 голосов
/ 20 декабря 2011
grep ^[a-z].*\:$ Makefile | sed s,:,,g
0 голосов
/ 12 сентября 2011

Я искал тот же вопрос и придумал этот вариант:

make -pn | sed -rn '/^[^# \t\.%].*:/p'

При этом удаляются все строки комментариев, правила шаблона (строки, начинающиеся с табуляции), все внутренние компоненты (пример .c.o%.o: %.c шаблонов).

0 голосов
/ 17 июня 2010

Конечно, но когда вы хотите, чтобы он их выплевывал?

Чтобы сообщить имя цели при запуске правила, вставьте в правило строку:

foo$(VAR): $(PREREQS)
    @echo now making the foo target: $@
    do_other_stuff...

Чтобы выплюнуть их всех сразу, вы можете сделать отдельную цель PHONY:

.PHONY: show_vars
show_vars:
    @echo foo$(VAR)
    @echo bar$(PARAM) blah$(FLAG)
    # and so on

И это может быть предварительным условием вашей цели по умолчанию:

all: show_vars
    ...

РЕДАКТИРОВАТЬ:
Вы хотите, чтобы показать все возможные цели произвольного make-файла, что, я полагаю, означает не навязчиво.Ну ...

Чтобы сделать это точно и уметь справляться со сложными make-файлами, например, с использованием правил, созданных с помощью операторов eval, вам нужно написать что-то похожее на эмулятор Make.Непрактично.

Чтобы увидеть цели простых правил, вы можете написать make-файл, который будет действовать как сканер make-файлов, работающий с произвольным make-файлом:

  1. Получить все имена целейиз make-файла, используя sed.
  2. `include` make-файл, чтобы использовать его для расширения переменных.
  3. Использовать `show_%:;эхо $$ * `напечатать все цели

Это было бы впечатляющим произведением.Вы уверены, что цель стоит усилий?

...