2012-04-05 2 views
1

Я пишу небольшую программу для удовольствия. Я решил использовать MinGW (только C), make и Notepad ++ как упражнение, не использующее причудливые IDE для изменения. Пока все так хорошо и весело.Portable make clean rule

(MinGW == Я работаю на Windows.)

Теперь, так как программа компилируется с ванильным C Я думал, что делает его полностью портативным. MinGW сделать и НКУ умна достаточно создать программу из правила:

myprog: myprog.o other.o 
    $(CC) $(CFLAGS) $(LDFLAGS) $^ -o [email protected] 

Очевидно, так как я на окнах компилятор создает myprog.exe. Это довольно разумно и делает все очень портативным.

Что касается standard targets пойдите, я хочу хотя бы реализовать clean, так как я на самом деле использую это правило. Теперь чистая цель, которая на самом деле работает на Windows, выглядит следующим образом:

clean: 
    rm myprog.exe *.o 

Это правило точно не будет работать в среде POSIX, потому что программы не имеют расширения там. (PSOIX: думаю, GNU/Linux)

Есть ли портативный способ реализовать чистый, не делая много фу?

До сих пор я не нашел действительно полезной документации по этой проблеме. Если вы посмотрите, как autoconf и automake решат проблему, они вводят шаблон @[email protected]. Но это зависит от длительной конфигурации кода, проверяющего среду.

+0

Что не так с 'rm -f myprog myprog.exe * .o'? – Beta

+0

Когда-либо пытались выполнить это на Linux? Не работает ... Вопрос касается полезности; правило отлично работает на mingw. – rioki

+0

Да, у меня есть, и он работает на моей версии (2.6.18-194.8.1.el5). Какая у вас ошибка? (И почему вы хотите его выпить?) – Beta

ответ

0

Если решить это можно следующим образом:

UNAME = $(shell uname -o) 
ifeq ($(UNAME), Msys) 
    EXEEXT = .exe 
endif 

clean: 
    rm *.o myprog$(EXEEXT) 

Это решается вопрос довольно красиво. Хотя он не полностью переносится на 100%, он работает чаще всего.

1

Определит двоичное имя в качестве переменного (необязательно выводить его из имени исходного файла, определяющий «основные()» с помощью простой команды задать расширенный):

EXE_EXT_LINUX:= 
EXE_EXT_WINDOWS:=exe 
EXE_EXT:=$(EXE_EXT_$(PLATF)) 

BINARY_NAME:=$(notdir $(basename $(shell egrep -r -l --include=*.cpp '^[ \t]*?int[ \t]*?main[ \t]*?\(')))$(EXE_EXT) 

И использовать этот макрос вместо закодированного имени

+0

Я думаю, что это половина в правильное направление; но я думаю, что это слишком много. (Тем более, что у меня на самом деле есть две программы ...) Я думаю, что я могу пройти тест на результат от uname. – rioki