Linux 设置临时环境($PATH)
我可能会在这个问题上遇到X-Y问题,如果我错了,我鼓励你们纠正我 我想配置一个可以在不同平台和编译器版本上工作的工具链环境。我最初编写了一个长Perl脚本,生成一个只包含变量的配置Makefile。我想简单一点,所以我没有用automake或autoconf写任何复杂的东西。此外,我希望重新配置过程非常快。在我的例子中,我自己编写的Linux 设置临时环境($PATH),linux,bash,gcc,Linux,Bash,Gcc,我可能会在这个问题上遇到X-Y问题,如果我错了,我鼓励你们纠正我 我想配置一个可以在不同平台和编译器版本上工作的工具链环境。我最初编写了一个长Perl脚本,生成一个只包含变量的配置Makefile。我想简单一点,所以我没有用automake或autoconf写任何复杂的东西。此外,我希望重新配置过程非常快。在我的例子中,我自己编写的/configure在不到一秒钟的时间内完成所有工作。我对此感到非常高兴 不过,我觉得我可以使用更好的方法使用环境变量。我可以直接设置当前的shell环境,而不是编写
/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 FOO=bar target
其中FOO
是要使用值bar
设置的变量
请注意,在这种情况下,它优先于环境定义!因此,您可以轻松重写PATH变量
有关更多信息,请查看此详细主题:
使用环境而不是自定义makefiles来设置生成配置是否更好
构建系统的最佳实践是完全不依赖于任何环境变量。因此,构建项目所需的只是:
git clone ... my_project
make -C my_project
必须设置环境变量容易出错,并可能导致不一致的构建
如何正确调整现有的环境变量
您可能根本不需要调整这些。通过使用编译器等工具的完整路径,可以将构建系统从环境中分离出来。当我要设置多个变量时,我会编写一个包装器脚本,然后将其用作要修改的命令的前缀。这让我也可以使用前缀
- 应用于单个命令,如
,或make
- 初始化shell,以便后续命令使用更改的设置
- 设置编译器选项(如
,设置clang
变量,使配置脚本“看到”它作为所选编译器)CC
- 设置区域设置变量,以使用POSIX
与C
与en_-US
等进行测试en_-US.UTF-8
- 使用精简的环境进行测试,例如在
中cron
路径
、LD\u库路径
和类似变量所需的操作
例如,大约十年前,我编写了这个临时脚本,用本地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一起使用
一些包装器只是调用另一个脚本。
例如,我在配置脚本周围使用此包装器来设置交叉编译的变量:
#!/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)或(c)运行这些命令。它们使用POSIX外壳(当然,需要特定功能的脚本除外),使别名或函数没有什么用处。众所周知,最好集成标准工具来完成构建产品之类的任务,而不是创建自己的方法。从长远来看,这种努力通常是有回报的
也就是说,一种简单的方法是为不同的产品定义不同的环境文件(例如,build phone.env
)设置工作目录、PATH
、CC
等,并根据需要以交互方式获取环境文件:
. /path/to/build-phone.env
[your build commands]
. /path/to/build-watch.env
[your build commands]
您可以为特定命令调用创建个性化环境:
VAR1=val1 VAR2=val2 VAR3=val3 make
我发现这比做以下事情更干净:
export VAR1=val1
export VAR2=val2
export VAR3=val3
make
除非你在一个包装器脚本中,甚至可能和
VAR1=val1 VAR2=val2 VAR3=val3 make
变量将是make调用之前的任何变量(包括但不限于未报告和不存在)
长线不是问题,您始终可以将其拆分为多行:
VAR1=val1\
VAR2=val2\
VAR3=val3\
make
您可以为任何Unix命令设置这样的环境变量。
贝壳会把它装好的。
一些应用程序(如
make
或rake
)将基于看起来像变量定义的参数修改其环境(请参见prodev_paris的答案),但这取决于应用程序。您是否尝试过使用高级构建系统,如SCons、CMake、autoconf,CMake使用make,我想让事情尽可能简单。所以在我的情况下,make会更好。Autoconf看起来很复杂,我真的应该找到一个好的教程。我仍然迷恋它。我真的应该看看烤饼。我不知道。只是一句话:你发布的导出命令没有指向你发布的路径(缺少$
符号)。@MichaelJaros对,我修复了它。Rake
或tup
也很好。除了最基本的东西,任何东西都很糟糕。很好的解决方案,但在我的例子中,我有大约10个变量要设置(产品类型、架构、编译器、版本等)。我对阿尔瓦来说会有点适得其反