У меня есть простая программа на C (один исходный файл), которую я хочу скомпилировать для Linux и Windows с помощью make и nmake соответственно. Есть ли возможность сделать это с помощью одного make-файла?
Я подумал о чем-то вроде
ifeq($(MAKE), nmake)
// nmake code here
else
// make code here
endif
К сожалению, nmake, похоже, не понимает ifeq
, поэтому я не могу его использовать. У меня есть рабочий make-файл, но он дает очень уродливые результаты:
hello: hello.c
$(CC) hello.c
Это работает в обеих системах. Проблема в том, что результат зависит от поведения соответствующих компиляторов по умолчанию. Под Linux я получаю исполняемый файл с именем «a.out», а не «hello». Под Windows я получаю hello.exe, но есть еще hello.obj, который мне не нужен.
Есть ли альтернативный способ? Или то, что я пытаюсь сделать, совершенно невозможно?
Я хотел использовать один и тот же make-файл include для использования make и nmake. Поскольку make распознает продолжение строки в комментариях, а nmake - нет, это означает, что у нас могут быть отдельные инструкции для make и nmake. Например:
# \
!ifndef 0 # \
# nmake code here \
MV=move # \
RM=del # \
CP=copy # \
!else
# make code here
MV=mv -f
RM=rm -f
CP=cp -f
# \
!endif
Просто убедитесь, что nmake-специфичный код завершен на # \
Я просто подумал о чем-то совершенно ином.
Если вы придерживаетесь своего чрезвычайно простого Makefile, который, как вы говорите, работает, и просто помещаете «стандартные» переменные CC и CFLAGS в ваши соответствующие среды, скажите
export CC=gcc
соответственно
set CC=CL.EXE
и
export CFLAGS=-o myexecutable
соответственно
set CFLAGS=/out:myexecutable.exe
это может просто сработать.
Знайте, я не уверен, какие именно варианты использовать, вам придется самим их выяснить. Но AFAIK оба позволяют вариантам распознавать один и тот же набор флагов. Вы даже можете установить их в соответствующих командных строках (но не в make-файле, поскольку NMAKE использует другой синтаксис 'ifeq' ...)
Мое решение состоит в том, чтобы использовать два различных имен файлов. (так как приоритет поиска имени Make-файла в различных Ose не будет тем же)
Для Windows, я использую нормальный "Make-файл".
Для Linux, я использую специальный "GNUmakefile" согласно эта статья .
Так, чтобы nmake (Победа) нашел "Make-файл", и делать (Linux), найдет "GNUmakefile".