Makefile для Windows и Cygwin - PullRequest
2 голосов
/ 18 июня 2010

Мне нужно иметь makefile работу под Windows и Cygwin. У меня возникли проблемы с make-файлом, который правильно определяет ОС и устанавливает соответствующие переменные.

Цель состоит в том, чтобы установить переменные для следующих команд, а затем вызвать команды в правилах, используя переменные:

  • Удалить файл: rm в Cygwin, del в Windows.
  • Удалить каталог: rmdir (другой параметры в Cygwin и Windows)
  • Копировать файл: cp в Cygwin, copy в Окна.
  • Тестирование на наличие файлов: test в Cygwin, IF EXIST в Windows.
  • Вывод содержимого файла: cat in Cygwin, type в Windows.

Вот моя попытка, в которой всегда используется предложение else:

OS_KIND = $(OSTYPE) #OSTYPE is an environment variable set by Cygwin.
ifeq ($(OS_KIND), cygwin)
 ENV_OS = Cygwin
 RM = rm -f
 RMDIR = rmdir -r
 CP = cp
 REN = mv
 IF_EXIST = test -a
 IF_NOT_EXIST = ! test -a
 LIST_FILE = cat
else
 ENV_OS = Win_Cmd
 RM = del -f -Q
 RMDIR = rmdir /S /Q
 IF_EXIST = if exist
 IF_NOT_EXIST = if not exist
 LIST_FILE = type
endif

Я использую символ косой черты, '/', в качестве разделителя каталогов. Это проблема с командой Windows, так как она интерпретирует ее как аргумент программы, а не как разделитель. Кто-нибудь знает, как решить эту проблему?

Я использую make с Mingw как в консоли Windows, так и в Cygwin.

Ответы [ 3 ]

3 голосов
/ 18 июня 2010

Я настоятельно рекомендую вам перейти на CMake для автоматической генерации ваших Makefile. Все эти проблемы были решены, и он поддерживает MingW, MSYS и Cygwin.

RM:           file(REMOVE [file1 ...])
RMDIR:        file(REMOVE_RECURSE [file1 ...]) # (not quite the same functionality; deletes files, too)
CP:           file(COPY files... DESTINATION...)
REN:          file(RENAME <oldname> <newname>)
IF_EXIST:     if(EXISTS file-name)
IF_NOT_EXIST: if(NOT EXISTS file-name)
LIST_FILE:    file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])

Все ваши пути автоматически преобразуются в стиль DOS, если вы генерируете файлы MakeGile MinGW. Это прекрасная вещь.

И, наконец, это делает все остальное в вашем Makefile намного проще.

1 голос
/ 19 июня 2010

CMake , предложенный Мэттом Б., является одним из правильных ответов на этот вопрос. Другие правильные ответы: SCons , Jam и Bakefile .

Поскольку вы используете Cygwin, Autoconf + Automake также предоставляет вам инструменты для решения вашей проблемы. Однако это скорее инструментарий для решения проблемы, чем готовое решение.

Главной целью является перемещение на уровень абстракции, чтобы вы могли поддерживать множество систем сборки только из одного источника.

0 голосов
/ 28 августа 2018

Точное определение платформы сборки - сложная часть. Вот как я это делаю.

ifeq '$(findstring ;,$(PATH))' ';'
    UNAME := Windows
else
    UNAME := $(shell uname 2>/dev/null || echo Unknown)
    UNAME := $(patsubst CYGWIN%,Cygwin,$(UNAME))  # CYGWIN_NT-10.0 -> Cygwin
endif

Переменная UNAME установлена ​​в Linux, Cygwin, Windows, FreeBSD, NetBSD (или предположительно Solaris, Darwin, OpenBSD, AIX, HP-UX) или Unknown. Затем его можно сравнить в оставшейся части файла Makefile, чтобы отделить любые чувствительные к ОС переменные и команды.

Я обсуждаю это далее в другой теме

...