Использовать один и тот же make-файл для make (Linux) и nmake (Windows)

У меня есть простая программа на 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, который мне не нужен.

Есть ли альтернативный способ? Или то, что я пытаюсь сделать, совершенно невозможно?

20
задан Peter Mortensen 23 October 2019 в 12:32
поделиться

3 ответа

Я хотел использовать один и тот же 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-специфичный код завершен на # \

8
ответ дан 30 November 2019 в 00:22
поделиться

Я просто подумал о чем-то совершенно ином.

Если вы придерживаетесь своего чрезвычайно простого Makefile, который, как вы говорите, работает, и просто помещаете «стандартные» переменные CC и CFLAGS в ваши соответствующие среды, скажите

  export CC=gcc

соответственно

  set CC=CL.EXE

и

  export CFLAGS=-o myexecutable

соответственно

  set CFLAGS=/out:myexecutable.exe

это может просто сработать.

Знайте, я не уверен, какие именно варианты использовать, вам придется самим их выяснить. Но AFAIK оба позволяют вариантам распознавать один и тот же набор флагов. Вы даже можете установить их в соответствующих командных строках (но не в make-файле, поскольку NMAKE использует другой синтаксис 'ifeq' ...)

1
ответ дан 30 November 2019 в 00:22
поделиться

Мое решение состоит в том, чтобы использовать два различных имен файлов. (так как приоритет поиска имени Make-файла в различных Ose не будет тем же)

Для Windows, я использую нормальный "Make-файл".

Для Linux, я использую специальный "GNUmakefile" согласно эта статья .

Так, чтобы nmake (Победа) нашел "Make-файл", и делать (Linux), найдет "GNUmakefile".

0
ответ дан 30 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: