两个编译器的一个makefile

时间:2012-11-13 09:20:10

标签: c++ c g++ cross-compiling gnu-make

我有两个makefile,用于本机和交叉编译。它们之间唯一的区别是编译器名称:

# makefile
CC = g++
...
# makefile-cc
CC = arm-linux-gnueabihf-g++
...

要进行本机编译,我执行make,进行交叉编译,执行make -f makefile-cc。我希望有一个makefile,它应该使用make执行本机编译,而make cross执行交叉编译。正确的语法是什么,例如:

# makefile (C-like pseudo-code)
if cross
    CC = arm-linux-gnueabihf-g++
else
    CC = g++

4 个答案:

答案 0 :(得分:17)

您可以在一行中使用语法 target:assignment assign/append variables for specific targets。这是一个例子:

native: CC=cc
native:
    echo $(CC)

cross: CC=arm-linux-gnueabihf-g++
cross:
    echo $(CC)

调用

make native

(或仅make,此处)打印

echo cc
cc

并致电

make cross

打印

echo arm-linux-gnueabihf-g++
arm-linux-gnueabihf-g++

因此,您可以使用通常的编译行与$(CC)

答案 1 :(得分:8)

您可以传递参数来制作 例如make TARGET=nativemake TARGET=cross然后使用此

ifeq ($(TARGET),cross)
        CC = arm-linux-gnueabihf-g++
else
        CC = g++
endif

答案 2 :(得分:0)

不完全是您想要的,但您可以将CC视为环境变量。请考虑以下Makefile

all:
        echo $(CC)

您可以使用CC=g++ make来调用它,它可以为您提供:

echo g++
g++

或者通过CC=arm-linux-gnueabihf-g++ make调用它,它会为您提供:

echo arm-linux-gnueabihf-g++
arm-linux-gnueabihf-g++

最好的部分是,您可以将这些内容分别放在~/.bashrc export CC=g++export CC=arm-linux-gnueabihf-g++中,并仅使用make进行调用。

答案 3 :(得分:0)

另一种比gnu make ifeq方式更便携的方法就是这样:

CROSS包含arm-linux-gnueabihf-或为空。

CC=$(CROSS)g++

CC将包含扩展结果。