2010-11-04 112 views
18

我有一个makefile,它对于Linux(x86_64)和OS X Intel(x86_64)透明地工作。这使用64位特定的GCC选项。如何为32位和64位创建单个生成文件?

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

回答

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 ... 
+5

-1,没有回答这个问题(如何区分pcc到x86) – u0b34a0f6ae 2013-01-07 20:38:29

+0

如果有人知道如何在没有MSYS的MinGW(Windows)下执行此操作,请在此处添加评论并标记我。 – 2015-07-04 19:02:55

1

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

+2

我会说,如果你的项目很小,并且你没有很多的库依赖性来处理不同的平台,那么就要远离自动工具,因为它的地狱要维护。如果它是一个小型(ish)项目,并且您对这些tragets会是什么样子有所了解,那么对于一些经过调整的makefile,您就可以完成。 – gilligan 2010-11-04 13:12:16

+1

我会说,即使你的项目很小,随着自动工具。它比CMake和现代automake好得多,使用'AM_SILENT_RULES'看起来几乎一样好。地狱保持?不是真的。 – 2010-11-04 22:45:07

+1

那么,计算机程序的可用性一直是观察者眼中的:-)还有另一种选择,它具有相当温和的学习曲线:来自Trolltech的tmake。不支持,但有效。比替代品简单得多。 – ssegvic 2010-11-05 17:21:11

2

尝试文件包含。这不是标准Makefile语法(Single Unix v3规范中的一种)的一部分,但得到广泛支持。随着GNU做,这看起来是这样的:

include otherfile 

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

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

和PowerPC的Makefile文件:

ARCHFLAGS = -mcpu=g3 
include common.mk 

和大头的编译规则将在一个文件中(common.mk),必要时使用$(ARCHFLAGS)

+0

我使用这种方法的代码库必须建立在5个不同的Unix变体上 – Spaceghost 2011-01-11 03:19:21

+0

这非常有用。有许多不同的标准,相对较少的操作系统似乎完全符合每个标准......您是否必须阅读每个目标操作系统的标准和合规性信息,或者是否有更简单的方法来找出哪些系统支持每个功能?对于自动生成依赖关系,我做得很好,但这取决于'include',我认为这得到了普遍支持。 – 2016-07-21 00:23:18

1

的一种方式是:

  • 具有生成文件片段对每个体系结构(可能累积):posixwin32win32-gcc
  • 有运行并确定为什么片段是一个脚本适合主机
  • 将那些makefile碎片包含到主makefile中
  • 允许使用环境变量进行手动覆盖(因为事情有时可能很复杂;例如,想一想交叉编译器)

我已经在中小型项目中使用过这个(2或3个人在代码上工作了几年),它很适合这个法案。

+0

只需添加:某些项目中的'。/ configure'步骤,可以做类似的事情。 – anishsane 2014-08-27 07:14:52