У меня есть Make-файл GNU, который собирает информацию о версии через переменные среды. Теперь я хочу сделать «что-то» глобально, прежде чем любая цель будет построена с использованием синтаксиса gnumake. В качестве псевдокода это означает:
- когда указанный файл существует, удалите его
- запустить массив строк и поместить их значение в указанный файл
Я пробовал это:
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))
это дает мне ошибку:
C:\temp\Makefile.mak:72: *** missing separator. Stop.
где строка 72 - это строка $(shell ...
. Если я помещу это в define
раздел:
define foobar
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))
endef
и назовите это для цели, она работает нормально:
$(products)$test.o : test.c $(commons)
$(call foobar)
$(cc) $(cflags_m) test.c -o$@
и делает то, что должно ... но как только я хочу вызвать его изнутри другого define
, он снова выходит из строя с отсутствующим разделителем.
Что это значит и как я могу это исправить?
Компиляция происходит на платформе Win32 и не обязательно должна быть мультиплатформенной.