我有一个makefile
透明地用于Linux(x86_64
)和OS X Intel(x86_64
)。这使用64位特定GCC选项。
有没有办法调整makefile,以便我可以构建32位和64位OS X PPC(ppc
,ppc64
),而无需维护单独的特定于arch的makefile - 或许类似于预处理器指令,可以在构建之前确定架构?
答案 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)
一种方法是:
posix
,win32
,win32-gcc
等。我在中小型项目中使用过这个项目(2到3个人在代码上工作了几年),这很符合这个要求。
答案 4 :(得分:0)
答案 5 :(得分:0)
尽管它没有明确回答CPP编译问题,但我刚刚为汇编语言创建的这种方法可以很容易地适应。
# -----------------------------------------
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.s
和helloworld-64.s
添加到项目文件夹中,并通过在文件夹中运行make
来解决所有问题。