我可能会在这个问题上陷入 X-Y 问题,如果我错了,我鼓励大家纠正我。
我想配置一个可以在不同平台和编译器版本上工作的工具链环境。我最初编写了一个长的 Perl 脚本,它生成一个仅包含变量的配置 Makefile。我想变得简单,所以我没有使用 automake 或 autoconf 编写任何复杂的东西。此外,我希望重新配置过程非常快。在我的例子中,我自己编写的 ./configure
在不到一秒钟的时间内完成了所有事情。我对此感到非常高兴。
但是我觉得我可以使用使用环境变量的更好方法。我可以直接设置当前的 shell 环境,而不用编写带有特定变量的 Makefile。例如:
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
并将其用作 with-python-2.4.2
myscript。
一些包装器只是调用另一个脚本。 例如,我在配置脚本周围使用这个包装器来为交叉编译设置变量:
#!/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) 为配置脚本。
其他人可能会建议 shell 别名 或函数。我不将它们用于此目的,因为我的命令行 shell 通常是 tcsh
,而我从 (a) 其他 shell 脚本运行这些命令,(b) directory editor , 或 (c) text-editor .那些使用 POSIX shell(当然,对于需要特定功能的脚本除外),使得别名或函数用处不大。
关于linux - 设置临时环境($PATH),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30297760/