使用Makefile终端参数实现跨平台编译控制

最近做的项目经常需要在x86和arm两个平台上测试,需要使用两套编译器,一套系统自带,一套来自于交叉编译环境。这时就需要为两个平台分别编写Makefile,但颇为不便。查阅资料后得知可以使用make configure调整编译选项,又显牛刀杀鸡。
一种较为简便的方式是在使用make指令时,添加额外参数以改变脚本中某变量的值,配合Makefile中的条件语句ifeq来控制编译过程。

CFLAGS+=-Werror -O2
ifeq ($(arm),true)
    CXX=arm-hisiv300-linux-uclibcgnueabi-g++
    CC=arm-hisiv300-linux-uclibcgnueabi-gcc
    TARGETNAME=sockcli_arm
else
    CXX=g++
    CC=gcc
    TARGETNAME=sockcli
endif

$(TARGETNAME):main.o send_proc.o recv_proc.o main_proc.o
    $(CXX) $(CFLAGS) -o  $(TARGETNAME)  main.o send_proc.o recv_proc.o main_proc.o 
main.o:main.cpp send_proc.h recv_proc.h main_proc.h
    $(CXX) $(CFLAGS) -c  main.cpp
main_proc.o:main_proc.cpp main_proc.h send_proc.h recv_proc.h
    $(CXX) $(CFLAGS) -c  main_proc.cpp 
send_proc.o:send_proc.cpp send_proc.h
    $(CXX) $(CFLAGS) -c  send_proc.cpp
recv_proc.o:recv_proc.cpp recv_proc.h
    $(CXX) $(CFLAGS) -c  recv_proc.cpp

clean:
    rm -f $(TARGETNAME) main.o main_proc.o recv_proc.o send_proc.o

编译时,若需编译arm平台程序,使用命令make arm=true即可调用交叉编译器;若编译x86平台程序,直接使用make命令即可。
需要注意的是,第二行的ifeq和括号之间必须有一个空格。否则,make会报错:

Makefile:2: *** 遗漏分隔符 。 停止。

网上绝大多数解答都是将TAB误写为空格,而此处错误实为缺少空格。不得不说Makefile这个解释性语言很让人恼火,语法严苛,错误提示又不清晰。

你可能感兴趣的:(嵌入式,makefile,arm,交叉编译)