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
.....
这样makefile不能直接include environment-setup-linux
因为makefile中执行shell命令有以下三种办法
xxx=${shell pwd}
xxx=`pwd`
echo pwd
直接包含相当于直接在makefile中有这样语句
if [ -d "$XXX" ]; then
for envfile in ${XXX}/env-setup.d/*.sh; do
. $env
所以执行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}