【问题标题】:Portable make clean rule便携式清洁规则
【发布时间】:2012-04-05 07:39:39
【问题描述】:

我正在编写一个小的 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@ 模式。但这依赖于测试环境的冗长配置代码。

【问题讨论】:

  • rm -f myprog myprog.exe *.o 有什么问题?
  • 曾经试过在 Linux 上执行它吗?不起作用...问题是指可饮用性;该规则在 mingw 上运行良好。
  • 是的,我有,它适用于我的版本 (2.6.18-194.8.1.el5)。你的错误是什么? (你为什么要喝它?)
  • 除了当我生成myprog,然后尝试删除myprog.exe 会得到一个不错的No such file or directory.

标签: makefile mingw porting


【解决方案1】:

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

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)

并使用此宏代替硬编码名称

【讨论】:

  • 我认为这是正确方向的一半;但我认为这是矫枉过正。 (特别是因为我实际上有两个程序......)我想我可以对 uname 的结果进行测试。
【解决方案2】:

如果通过以下方式解决:

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

clean:
    rm *.o myprog$(EXEEXT)

它很好地解决了这个问题。虽然它不是完全 100% 可移植的,但它适用于最常见的情况。

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2011-02-20
    • 2016-06-20
    • 2011-03-06
    • 2013-11-24
    相关资源
    最近更新 更多