我有一个makefile
对 Linux ( x86_64
) 和 OS X Intel ( x86_64
) 透明的工作。这使用 64 位特定的 GCC 选项。
有没有办法调整 makefile 以便我可以为 32 位和 64 位 OS X PPC ( ppc
, ppc64
) 构建而无需维护单独的、特定于架构的 makefile — 可能类似于可以确定的预处理器指令建造前的建筑?
我有一个makefile
对 Linux ( x86_64
) 和 OS X Intel ( x86_64
) 透明的工作。这使用 64 位特定的 GCC 选项。
有没有办法调整 makefile 以便我可以为 32 位和 64 位 OS X PPC ( ppc
, ppc64
) 构建而无需维护单独的、特定于架构的 makefile — 可能类似于可以确定的预处理器指令建造前的建筑?
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 ...
尝试文件包含。这不是标准 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)
在必要时使用。
我认为您可以通过使用某种构建系统(例如 cmake 或 GNU autotools)以更少的工作(和痛苦)实现您的目标。
一种方法是:
posix
、、、win32
等等win32-gcc
。我已经在中小型项目中使用了它(2 或 3 个人从事代码工作几年),它非常符合要求。
虽然它没有明确回答 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
。