Проверка наличия файла в NMake - PullRequest
4 голосов
/ 17 декабря 2010

В make-файле для GNU Make я использую эту идиому, чтобы проверить, существует ли файл:

static:
ifeq ($(wildcard $(FileName)),)
    # do something when the file doesn't exist
else
    # do something different when it does
endif

Но это не работает в NMake (fatal error U1000: syntax error : ')' missing in macro invocation). Как я могу заменить его? Было бы идеально, если бы замена работала в обеих сборочных системах.

Ответы [ 3 ]

6 голосов
/ 23 декабря 2010

Просто чтобы добавить к предложению Джека Келли, вы можете выполнить тест на существование в оболочке CMD.EXE.NMake также включает в себя возможность создавать временный файл .cmd и выполнять его.

Вот пример (n) синтаксиса make-файла, который я использую для цели «check-syntax».Он проверяет синтаксис в одном исходном файле C #, в многофайловом проекте, выполняя компиляцию.

check-syntax :
    <<flymake-build.cmd  $(CS_SOURCE)
SETLOCAL ENABLEDELAYEDEXPANSION
set errorlevel=
for %%I in (%*) do if NOT x%%I == x$(FLYMAKE_ORIGINAL) (
   set filesToBuild=!filesToBuild! %%I
)
$(_CSC) /t:module $(LIBSREF) $(FLYMAKE_CHECK) !filesToBuild!
ENDLOCAL && exit /b %errorlevel%
<<

«flymake-build.cmd» - это имя временного файла cmd, который получаетсоздано.Двойные угловые скобки (<<) обозначают начало и конец содержимого, которое входит во временный файл, до его запуска.

Материал после имени файла в первой строке - это аргументы, передаваемые в файл .cmd.В этом примере аргументы - это содержимое переменной makefile с именем CS_SOURCE.В моем случае это просто список имен файлов в проекте.Переменные make-файла будут также расширены в тексте для временного файла.Вы можете видеть, что я ссылаюсь на компилятор (_CSC) и некоторые другие символы.

Внутри кода .cmd вы можете делать для циклов if, что угодно.Это обычный файл .cmd.

Если вы хотите, чтобы nmake реагировал на ошибки (например, прервать сборку), сгенерированные командами в файле .cmd, то вам нужно использовать подход exit /b для завершения cmd.

Я нашел документацию для этого где-то в темном углу, поэтому я решил поделиться ею здесь для общего разъяснения.( РЕДАКТИРОВАТЬ : вот ссылка .)

5 голосов
/ 13 сентября 2013

Nmake может запускать директивы препроцессора:

http://msdn.microsoft.com/en-us/library/7y32zxwh.aspx

Условия могут отличаться, но Exists () является одним из них:

http://msdn.microsoft.com/en-us/library/8t2e8d78.aspx

!IF EXISTS(foo.txt)

Наконец, вы используете командную строку, http://msdn.microsoft.com/en-us/library/wkxa7sac.aspx

!IF [cmd /C IF NOT EXIST "foo.txt" exit 1]

В любом случае, это должно работать, используя любой из них! ЕСЛИ выше приведен полный пример:

!IF !EXISTS(foo.txt)
!ERROR Unable to locate foo.
!ELSE
!MESSAGE I Found foo!
!ENDIF
2 голосов
/ 20 декабря 2010

Делайте это на уровне оболочки вместо уровня Makefile. Если вы можете положиться на инструменты posix:

static:
    @if test -f $(FileName); then \
      echo something; \
    else \
      echo some other thing; \
    fi

Обратите внимание на маркеры продолжения строки везде.

Если вам нужно сделать это в CMD.EXE, то, возможно, вы можете сделать подобное, используя IF EXIST $(FileName) COMMAND ELSE COMMAND конструкцию.

...