根据参数在Makefile中切换CC变量

时间:2013-06-03 15:05:50

标签: gcc makefile cross-compiling

我有一个C程序,我想为主机和来宾架构进行编译。

主机是i86 嘉宾是ARM

我尝试编写代码如下

CC=arm-none-linux-gnueabi-gcc

all : arm

arm :
    CC=arm-none-linux-gnueabi-gcc

host :
    CC=gcc

clean :
    rm -rf *.o
    rm bench

$(CC) src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o bench

但是当我运行make arm或make host时,我得到一个丢失的分隔符错误.. 我怎样才能实现这个功能?

修改的: 我按照接受的答案,但仍然想要一个目标来完成我的任务。 为此,我重写了我的Makefile,如下所示,

all : bench

host_helper :
    CC=gcc

arm_helper :
    CC=arm-none-linux-gnueabi-gcc

arm : arm_helper bench

host : host_helper bench

all : bench

clean :
    @rm -rf *.o
    @rm -f bench

bench : clean
    $(CC) src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o bench

这是我在运行make arm

时获得的输出
CC=arm-none-linux-gnueabi-gcc
cc src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o bench

为什么CC变量没有改变?
这是因为Makefile为每个目标做了一个分叉,因此一旦arm_helper目标完成,CC变量就会丢失吗? 是否有可能在这种方法中实现预期的目标?

1 个答案:

答案 0 :(得分:0)

最后一行不应该按原样格式化。 makefile的目的是告诉系统输入,输出及其依赖关系。因此,你应该更恰当地写一下:

bench: src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) $^ -Isrc -lrt -static -o $@

也许在bench中包含all。调用将是“make all”或“make arm bench”。

标签(实际上称为目标)并非真正从makefile中的其他目标“调用”。这需要改变思维。 Makefile不是程序性的。就其本质而言,它们是依赖树。因此,如果您希望在制作另一个目标时制作一个目标,则将其添加为依赖项;例如:

bench: arm src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) src/main.c src/cpu/cpu.c src/include/common.c -Isrc -lrt -static -o $@

如果我记得我的语法(这可能会或可能不会奏效),你可以更清楚地表达出来:

bench:: arm
bench:: src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) $^ -Isrc -lrt -static -o $@

要解决新的makefile:

首先,你有两次all。删除一个。其次,使bench依赖于clean。它是否只是在链接后删除bench?此外,您“基于目标设置变量”的方法将不起作用。请尝试类似:

all: bench-host

bench-host: CC=gcc
bench-arm: CC=arm-none-linux-gnueabi-gcc
bench-host bench-arm: src/main.c src/cpu/cpu.c src/include/common.c
    $(CC) $^ -Isrc -lrt -static -o $@

clean:
    @rm -f *.o
    @rm -f bench-*