Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 设置临时环境($PATH)_Linux_Bash_Gcc - Fatal编程技术网

Linux 设置临时环境($PATH)

Linux 设置临时环境($PATH),linux,bash,gcc,Linux,Bash,Gcc,我可能会在这个问题上遇到X-Y问题,如果我错了,我鼓励你们纠正我 我想配置一个可以在不同平台和编译器版本上工作的工具链环境。我最初编写了一个长Perl脚本,生成一个只包含变量的配置Makefile。我想简单一点,所以我没有用automake或autoconf写任何复杂的东西。此外,我希望重新配置过程非常快。在我的例子中,我自己编写的/configure在不到一秒钟的时间内完成所有工作。我对此感到非常高兴 不过,我觉得我可以使用更好的方法使用环境变量。我可以直接设置当前的shell环境,而不是编写

我可能会在这个问题上遇到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...
我觉得这很难看,我想在添加新路径之前删除旧路径

总结如下:

  • 使用环境而不是自定义makefiles来设置生成配置是否更好
  • 如何正确调整现有的环境变量

  • 我认为在调用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个变量要设置(产品类型、架构、编译器、版本等)。我对阿尔瓦来说会有点适得其反