Использовать NMAKE, чтобы сделать все исходники в каталоге?

Возможно ли, используя nmake, чтобы makefile автоматически создавал все файлы .cpp в текущем каталоге, не указывая их по отдельности?

Итак, вместо чего-то вроде:

O = $(OBJ_DIR)/main.obj
{$(SOURCE_DIR)}.cpp{$(OBJ_DIR)}.obj:
    ---COMPILE $< HERE---

Я хотел бы избежать необходимости указывать каждый объект, который нужно сделать. Можно ли это сделать?


person Community    schedule 08.05.2009    source источник
comment
Я думаю, что это можно сделать с помощью подстановочных знаков в GNU make (и IIRC вы можете запустить его в Windows). Кроме того, извините, но я не знаю nmake.   -  person BCS    schedule 09.05.2009


Ответы (5)


Просто

main.exe: *.c resource.RES
    @$(MAKE) $(**:.c=.obj)
    link $(**:.c=.obj) /OUT:$@

и больше ничего добавлять не нужно! Каждый раз, когда вы nmake, все *.c будут проверяться, скомпилированы они или нет.

Подробности:

  • $** для зависимостей
  • $@ для цели
  • $(**:.c=.obj) — это замена строки, заменяющая суффикс .c на .obj. А когда дело доходит до resource.RES, он ничем не заменит.

Обратите внимание, что есть рекурсивный вызов, и это самый элегантный подход. В противном случае необходимо получить все *.c имен файлов с манерами, подобными скрипту.

person mika    schedule 08.08.2020
comment
Спасибо, это, вероятно, должен быть принятый ответ. - person Slaven Glumac; 15.03.2021

.cpp.obj:
    $(CC) $(CFLAGS) $*.cpp

правило по умолчанию, которое автоматически разрешает зависимости .obj от файлов .cpp...

person John Weldon    schedule 08.05.2009
comment
Ну нет. Он просто объясняет, как это сделать, но не заставляет это делать. - person reinierpost; 07.01.2011
comment
@reinierpost да, технически вы правы. Это верно для всего make-файла; он описывает действия, необходимые для разрешения зависимостей и создания выходных данных. - person John Weldon; 07.01.2011
comment
Что ж, я думаю, вы отвечаете на вопрос, отличный от того, который хотел задать один анон, но, поскольку другие дают тот же ответ, я думаю, что ошибаюсь. - person reinierpost; 10.01.2011
comment
@reinierpost, возможно, вы правы - он не принял ни одного ответа, и его вопрос сформулирован так, что данные ответы могут не относиться к его вопросу. Я не вижу ответа от вас? Может быть, вам стоит попотеть? - person John Weldon; 10.01.2011

Вы можете использовать такое правило:

{src\mystuff}.c{tmp\src\mystuff}.obj::
    $(CC) /nologo $(CFLAGS) /c /Fotmp\src\mystuff\ $<

который найдет и скомпилирует все файлы .c в src\mystuff и поместит объектные файлы в tmp\src\mystuff. Замените .cpp на .c в вашем случае.

Обратите внимание, что первым символом во второй строке должен быть символ табуляции, а не пробел.

Кроме того, nmake предопределяет $(CC) как cl, и вы можете добавить любые флаги компилятора, которые вам нужны, к $(CFLAGS), жестко закодировать их в правиле или добавить туда другую переменную, как вы предпочитаете.

person Don McCaughey    schedule 08.05.2009

Одна из возможностей — обернуть make в скрипт.

Либо используйте цикл for, вызывая make для каждого файла .cpp, либо создавайте список файлов cpp и используйте его в качестве параметра makefile.

person Michael J    schedule 06.06.2009

Вы можете запустить команду оболочки во время предварительной обработки nmakefile, а затем !include вывести результат. Естественно, вывод должен быть в формате nmake. Что-то типа:

!if [bash -c "echo O = *.cpp" >sources.mak]
!error Failed to generate source list
!endif
!include sources.mak

all: $(O:.cpp=.obj)

.cpp.obj:
    ---COMPILE $< HERE---

Я подозреваю, что большинство людей не стали бы использовать bash для создания sources.mak, но вы поняли.

person bobbogo    schedule 07.01.2011