linux - 设置临时环境($PATH)

标签 linux bash gcc

我可能会在这个问题上陷入 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...

我觉得这很丑陋我想在添加新路径之前删除旧路径。

总结:

  1. 使用环境而不是自定义 makefile 来设置构建配置是否更好?
  2. 如何正确调整已有的环境变量?

最佳答案

当我有多个变量要设置时,我会编写一个包装器 脚本,然后将其用作要修改的命令的前缀。这让我可以使用前缀

  • 应用于单个命令,例如make,或
  • 初始化 shell,以便后续命令使用更改后的设置。

我使用包装器

  • 设置编译器选项(例如 clang,设置 CC 变量,使配置脚本“将其视为”所选编译器),
  • 设置语言环境变量,以使用 POSIX Cen_USen_US.UTF-8 等进行测试
  • 在简化的环境中进行测试,例如在 cron 中。

每个包装器都执行识别正确的 PATHLD_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-mingw32cfg-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/

相关文章:

c++ - 使用 -fno-elide-constructors 的临时对象

bash while 语句

python - uwsgi 进程死于 "libgcc_s.so.1 must be installed for pthread_cancel to work"

linux - 将输出重定向到命令结果给出的文件名

ruby - 无法在redhat上安装ruby版本

linux - 完成使用后如何终止端口转发

linux - rpmbuild 使用 .spec 文件删除构建目录

bash - 如何使用bash重命名ubuntu中子文件夹中的所有文件?

linux - 使用 $1 在 bash 脚本中使用 awk 提取一些文本

linux - 使用 GCC 命令提示符