makefile中导入shell脚本中export的环境变量
1.在makefile中,想要直接导入shell脚本的环境变量是有点麻烦,因为source命令导出的变量只在当前终端有效,而且source命令和.命令是等价的,如下:
source ./env.sh
. ./env
通常我们拿到SDK交叉编译链,都会先解压工具链,在source一下工具链中的环境变量文件,例如
source /opt/arm-64/arm-crosstool/environment-setup-linux 或者 . /opt/arm-64/arm-crosstool/environment-setup-linux
一般environment-setup-linux文件中有导出
export CC=xxxxx
export CXX=xxxxx
......
此时该终端执行输出$CC变量,将会赋值为工具链的xxxx-arm-linux-gcc
echo ${CC}
我们在此终端中执行make命令,也可以将环境的变量中$CC等待导入到makefile中,makefile可以识别出$CC变量是交叉工具链中的xxxx-arm-linux-gcc,编出来的执行文件可以放入嵌入式芯片中运行。makefile如下
#!/bin/bash -include common.mk TARGET=helloworld OBJECTS=helloworld.o ${TARGET}: ${OBJECTS} ${CC} -o $@ ${OBJECTS} %.o:%.c ${CC} -o $@ -c $< clean: rm ${TARGET} ${OBJECTS}
2.还有一种方法,在makefile中使用include或-include包含这些export 变量
可以查看下environment-setup-linux文件中
如果environment-setup-linux中全是这种export的变量,没有其他shell命令的好办 export CC=xxxxx export CXX=xxxxx ...... makefile直接include environment-setup-linux 但environment-setup-linux有其他的shell命令 export CC=xxxxx export CXX=xxxxx if [ -d "$XXX" ]; then for envfile in ${XXX}/env-setup.d/*.sh; do . $env done fi ..... 这样makefile不能直接include environment-setup-linux 因为makefile中执行shell命令有以下三种办法 xxx=${shell pwd} xxx=`pwd` all: echo pwd 直接包含相当于直接在makefile中有这样语句 if [ -d "$XXX" ]; then for envfile in ${XXX}/env-setup.d/*.sh; do . $env done fi 所以执行make会有格式错误
为了可以包含environment-setup-linux里所有导出变量,
可以这样做:
1.先在终端执行source environment-setup-linux或. source environment-setup-linux 2.再刚刚执行过的source命令的终端执行env命令,将会打印当前终端的所有环境变量 3.新建文件common.mk 4.env打印出的命令中,把有关交叉编译链的所有命令放到common.mk(如果不知道,全复制过去),然后在common.mk所有变量中最前面加上export 空格 例如 export CC=XXX export SDKTARGETSYSROOT=xxxx ...... 5.makefile中增加 -include common.mk
如下:
#!/bin/bash
-include common.mk
TARGET=test
OBJECTS=test.o
${TARGET}: ${OBJECTS}
@${CC} -o $@ ${OBJECTS} -pthread
%.o:%.c
@${CC} -o $@ -c $<
clean:
rm ${TARGET} ${OBJECTS}
后面可以把common.mk中与交叉工具链存放路径定义为一个变量,例如MY_SDK_PATH,然后把路径替换为${MY_SDK_PATH}/