Я не знаю автоконф.Каждый опыт, который у меня был с этим, был утомительным.Проблема с решением zwol заключается в том, что в Windows mkdir возвращает ошибку, в отличие от mkdir -p
в Linux.Это может нарушить ваше правило.Обходной путь - игнорировать ошибку с флагом -
перед командой, например:
-mkdir dir
Проблема в том, что make
по-прежнему выдает уродливое предупреждение для пользователя.Обходной путь для этого состоит в том, чтобы выполнить команду «всегда истинно» после сбоя mkdir
, как описано здесь , например:
mkdir dir || true
Проблема в том, что Windows и Linuxу меня другой синтаксис для true .
В любом случае, я потратил слишком много времени на это.Я хотел файл make
, который работал бы как в POSIX-подобных средах, так и в Windows.В конце я придумал следующее:
ifeq ($(shell echo "check_quotes"),"check_quotes")
WINDOWS := yes
else
WINDOWS := no
endif
ifeq ($(WINDOWS),yes)
mkdir = mkdir $(subst /,\,$(1)) > nul 2>&1 || (exit 0)
rm = $(wordlist 2,65535,$(foreach FILE,$(subst /,\,$(1)),& del $(FILE) > nul 2>&1)) || (exit 0)
rmdir = rmdir $(subst /,\,$(1)) > nul 2>&1 || (exit 0)
echo = echo $(1)
else
mkdir = mkdir -p $(1)
rm = rm $(1) > /dev/null 2>&1 || true
rmdir = rmdir $(1) > /dev/null 2>&1 || true
echo = echo "$(1)"
endif
Функции / переменные используются следующим образом:
rule:
$(call mkdir,dir)
$(call echo, CC $@)
$(call rm,file1 file2)
$(call rmdir,dir1 dir2)
Обоснование определений:
- mkdir : исправить путь и игнорировать любые ошибки.
- del : в Windows
del
не удаляет файлы, еслиодин из файлов указан в каталоге, который не существует.Например, если вы попытаетесь удалить набор файлов, и dir/file.c
будет в списке, но dir
не существует, файлы не будут удалены.Эта реализация решает эту проблему, вызывая del
один раз для каждого файла. - rmdir : исправьте путь и игнорируйте все ошибки.
- echo : внешний вид вывода сохраняется и не показывает постороннего
""
в Windows.
Я потратил много времени на это.Возможно, мне было бы лучше потратить свое время на изучение автоконф.
См. Также:
- OS, определяющая make-файл