我想配置一个工具链环境,可以在不同的平台和不同的编译器版本上工作.我最初写了一个很长的Perl脚本,它生成只包含变量的配置Makefile.我想成为KISS所以我没有使用automake或autoconf编写任何复杂的东西.此外,我希望重新配置过程非常快.在我的情况下,我的家庭./configure在不到1秒钟内完成所有工作.我很满意.
但是我填写我可以使用更好的方法使用环境变量.而不是使用特定变量编写Makefile,我可以直接设置当前的shell环境.例如:
export cc=gcc
不幸的是,一些变量已在$PATH中声明.解决方案是在另一个前面添加新的$PATH:
export PATH=/new/toolchain/path:$PATH echo $PATH /new/toolchain/path:/old/toolchain/path:/usr/bin:/bin...
总结:
>使用环境而不是自定义makefile来设置构建配置是否更好?
>如何正确调整现有环境变量?
解决方法
>应用于单个命令,例如make,或
>初始化shell,以便后续命令使用更改的设置.
我用包装纸
>设置编译器选项(例如clang,设置CC变量,使配置脚本“看到”它作为选择的编译器),
>设置区域设置变量,使用POSIX C与en_US和en_US.UTF-8等进行测试.
>在减少的环境中进行测试,例如在cron中.
每个包装器都会执行识别正确PATH,LD_LIBRARY_PATH和类似变量所需的内容.
例如,我在大约十年前编写了这个特殊脚本来测试本地构建的python:
#!/bin/bash ver=2.4.2 export TOP=/usr/local/python-$ver export PATH=$TOP/bin:$PATH export LD_LIBRARY_PATH=`newpath -n LD_LIBRARY_PATH -bd $TOP/lib $TOP/lib/gcc/i686-pc-linux-gnu/$ver` if test -d $TOP then exec $* else echo no $TOP exit 1 fi
并将其用作-python-2.4.2 myscript.
一些包装器只是调用另一个脚本.
例如,我在configure脚本周围使用这个包装器来设置交叉编译的变量:
#!/bin/sh # $Id: cfg-mingw,v 1.7 2014/09/20 20:49:31 tom Exp $ # configure to cross-compile using mingw32 BUILD_CC=${CC:-gcc} unset CC unset CXX TARGET=`choose-mingw32` if test -n "$TARGET" then PREFIX= test -d /usr/$TARGET && PREFIX="--prefix=/usr/$TARGET" cfg-normal \ --with-build-cc=$BUILD_CC \ --host=$TARGET \ --target=$TARGET \ $PREFIX "$@" else echo "? cannot find MinGW compiler in path" exit 1 fi
其中choose-mingw32和cfg-normal是脚本,它们(a)找到交叉编译器的可用目标名称,以及(b)为configure脚本提供其他选项.
其他人可能会建议shell别名或函数.我没有为此目的使用它们,因为我的命令行shell通常是tcsh,而我从(a)其他shell脚本,(b)directory editor或(c)text-editor运行这些命令.那些使用POSIX shell(除了当然,对于需要特定功能的脚本),制作少量使用的别名或功能.