makefile中导入shell脚本中export的环境变量

发布时间 2023-09-11 14:27:28作者: jest549

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}