如何为32位和64位创建单个makefile?

时间:2010-11-04 11:29:36

标签: architecture gcc makefile powerpc

我有一个makefile透明地用于Linux(x86_64)和OS X Intel(x86_64)。这使用64位特定GCC选项。

有没有办法调整makefile,以便我可以构建32位和64位OS X PPC(ppcppc64),而无需维护单独的特定于arch的makefile - 或许类似于预处理器指令,可以在构建之前确定架构?

6 个答案:

答案 0 :(得分:20)

ARCH := $(shell getconf LONG_BIT)

CPP_FLAGS_32 := -D32_BIT ...  Some 32 specific compiler flags ...
CPP_FLAGS_64 := -D64_BIT

CPP_FLAGS := $(CPP_FLAGS_$(ARCH))  ... all the other flags ...

答案 1 :(得分:2)

尝试包含文件。这不是标准Makefile语法(Single Unix v3规范中的语法)的一部分,但受到广泛支持。使用GNU make,它看起来像这样:

include otherfile

有了这个,你就可以拥有这样的x86 Makefile:

ARCHFLAGS = -m64 -mtune=core2
include common.mk

和PowerPC Makefile:

ARCHFLAGS = -mcpu=g3
include common.mk

并且大部分编译规则将在一个文件(common.mk)中,必要时使用$(ARCHFLAGS)

答案 2 :(得分:1)

我认为通过使用某种构建系统(如cmake或GNU autotools),您可以通过减少工作(和痛苦)来实现目标。

答案 3 :(得分:1)

一种方法是:

  • 为每个架构设置了makefile片段(可能是累积的):posixwin32win32-gcc等。
  • 有一个运行的脚本,并确定片段适合主机的原因
  • 将那些makefile片段包含在主makefile
  • 允许使用环境变量进行手动覆盖(因为事情有时会很复杂;例如,想到交叉编译器)

我在中小型项目中使用过这个项目(2到3个人在代码上工作了几年),这很符合这个要求。

答案 4 :(得分:0)

看看这个:

http://mad-scientist.net/make/multi-arch.html

它有些过时,但有很好的信息,对我来说可能有用。我想。

答案 5 :(得分:0)

尽管它没有明确回答CPP编译问题,但我刚刚为汇编语言创建的这种方法可以很容易地适应。

makefile

# -----------------------------------------
PROJECT = helloworld
# Expected source files: *-32.s and *-64.s
# -----------------------------------------
BITS := $(shell getconf LONG_BIT)
OBJS = $(PROJECT).o
ifdef DEBUG
    DEBUGFLGS = -g
else
    DEBUGFLGS =
endif

%.o : %-$(BITS).s
    as $(DEBUGFLGS) -o $@   $<

$(PROJECT): $(OBJS)
    ld  -o bin/$(PROJECT)   $(OBJS)

然后我将helloworld-32.shelloworld-64.s添加到项目文件夹中,并通过在文件夹中运行make来解决所有问题。