nmake.exe: есть ли способ исключить файл из набора файлов, указанных в макросе? - PullRequest
0 голосов
/ 11 мая 2010

Я ищу что-то вроде фильтра Исключить для msbuild, но я хочу это в make-файле, обработанном nmake.

Это возможно?

Предположим, у меня есть make-файл, который определяет этот макрос:

SOURCES=xxx.c  yyy.c  zzz.c

и я вызываю его с nmake OLD=xxx.c NEW=bbb.c

... могу ли я создать в make-файле макрос со значением вроде:

yyy.c zzz.c  bbb.c 

... в основном замена bbb.c на xxx.c?

Файлы могут появляться в любом порядке.


Это было бы довольно легко, если бы подстановка строк, которая возможна в макросах nmake, позволяла оценивать макросы.

Другими словами, я могу сделать

sources=xxx.c yyy.c zzz.c
objs=$(sources:.c=.o)

и значение $ (objs)

xxx.o yyy.o zzz.o

Но nmake не допускает макрос для значения любого аргумента для этой замены . Я не могу сделать это:

new=.o
sources=xxx.c yyy.c zzz.c
objs=$(sources:.c=$(new))

1 Ответ

1 голос
/ 11 мая 2010

Я не нашел способа сделать именно то, что хотел, но я нашел обходной путь.

Он включает в себя нечто, называемое "встроенными файлами" , которые являются файлами, которые nmake создает динамически, а затем использует в командном блоке. В моем случае я использовал трюк «встроенный файл», чтобы создать файл .cmd и запустить его. Файл .cmd выполнял логику включения / исключения, а затем запускал компилятор в зашифрованном списке исходных файлов.

Похоже на это.

  CSOURCE=Fribble.c Zambda.c Twoolie.c
         ....
  target :
          <<tmp-build-file.cmd  $(CSOURCE)
      SETLOCAL ENABLEDELAYEDEXPANSION
      for %%I in (%*) do if NOT %%I == $(EXC) (
         set filesToBuild=!filesToBuild! %%I
      )
      $(CC) $(INC) !filesToBuild!
      ENDLOCAL
  <<

Чтобы вызвать это, вы можете сделать:

nmake INC=AdditionalFile.c  EXC=Zambda.c  target

... и это правильно: компилирует Fribble.c Twoolie.c и AdditionalFile.c, но не Zambda.c.

...