В вашем MAKEFILE:
hello:
cl hello.c
Правило для создания цели hello
не имеет явных зависимостей и не соответствует никаким правилам вывода (см. Ниже). NMAKE будет воспринимать его как псевдо-цель . Поскольку он является псевдотаргетингом и не имеет зависимостей, он всегда считается актуальным, поэтому командный блок cl hello.c
запускаться не будет.
В этом случае для создания файла .exe из один файл. c, вам не нужно явное правило, вы можете использовать встроенное в NMAKE .c.exe
правило вывода (правило вывода - это специальное правило вида .from .to где от и до - это расширения имени файла):
# (You do not need to add this to your MAKEFILE. It is a built-in rule of NMAKE.)
.c.exe:
$(CC) $(CFLAGS) $<
Макрос CC
предопределен как cl
и CFLAGS
макрос не предопределен, поэтому он пуст. $<
- это специальный макрос имени файла, который расширяется до зависимого файла с более поздней отметкой времени, чем цель. ($<
допустимо только при использовании в правиле вывода.)
Попробуйте следующий MAKEFILE:
hello.exe:
Здесь hello.exe
- первая цель в MAKEFILE, и поэтому это цель по умолчанию , которая будет построена.
Правило MAKEFILE для цели hello.exe
не содержит командного блока, но поскольку файл hello.c
существует, он соответствует встроенному в NMAKE. .c.exe
правило вывода (как описано выше). При применении к цели hello.exe
это правило вывода делает hello.c
неявной зависимой от цели, и специальный макрос $<
расширяется до этой неявной зависимой, то есть $<
расширяется до hello.c
. Поскольку $(CFLAGS)
пусто, правило вывода приведет к выполнению следующей команды, когда зависимый hello.c
новее, чем целевой hello.exe
:
cl hello.c