便携式制造清洁规则

时间:2012-04-05 07:39:39

标签: makefile mingw porting

我正在写一个小C程序以获得乐趣。我决定只使用MinGW(只有C),make和Notepad ++作为练习,不使用花哨的IDE进行更改。到目前为止一切都很好玩。

(MinGW ==我在Windows上工作。)

现在,由于程序编译反对vanilla C,我想让它完全可移植。 MinGW make和gcc足够聪明,可以根据规则创建一个程序:

myprog: myprog.o other.o
    $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

显然,由于我在Windows上,编译器会创建myprog.exe。这非常聪明,使整个过程非常便携。

standard targets而言,我希望至少实现clean,因为我实际上使用了该规则。现在,实际在Windows上运行的干净目标如下所示:

clean:
   rm myprog.exe *.o

此规则肯定不适用于POSIX环境,因为程序在那里没有扩展。 (PSOIX:想想GNU / Linux)

是否有一种便携式方式可以实现干净而不需要多付费?

到目前为止,我还没有找到任何有关此问题的实用文档。如果你看一下autoconf和automake如何解决这个问题,他们会介绍模式@EXEEXT@。但这依赖于冗长的配置代码测试环境。

2 个答案:

答案 0 :(得分:1)

将二进制名称定义为变量(可选择使用简单的egrep命令从定义“main()”的源文件的名称中推导出来):

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)

并使用此宏而不是硬编码名称

答案 1 :(得分:1)

如果按以下方式解决:

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

clean:
    rm *.o myprog$(EXEEXT)

它很好地解决了这个问题。虽然它不是完全100%便携,但它最常见的情况。