Build 设置SCON在我的系统上全局使用的环境变量

Build 设置SCON在我的系统上全局使用的环境变量,build,environment-variables,scons,Build,Environment Variables,Scons,是否有任何方法可以为我的系统设置SCON将使用的环境变量,而不必更改SConstruct文件?例如,我希望使用Windows的Visual C++来代替我的C++构建。当然,我可以在我的SConstruct文件中执行此操作: env = Environment(tools = ['mingw']) 但如果我这样做了,那么我将在构建文件中编辑内容,使其特定于我的特定系统配置。在我看来,这违背了可移植构建系统的全部目的。如果我将其作为我的存储库的一部分上传给其他人来构建,他们可能不会使用MinGW

是否有任何方法可以为我的系统设置SCON将使用的环境变量,而不必更改SConstruct文件?例如,我希望使用Windows的Visual C++来代替我的C++构建。当然,我可以在我的SConstruct文件中执行此操作:

env = Environment(tools = ['mingw'])
但如果我这样做了,那么我将在构建文件中编辑内容,使其特定于我的特定系统配置。在我看来,这违背了可移植构建系统的全部目的。如果我将其作为我的存储库的一部分上传给其他人来构建,他们可能不会使用MinGW。他们可能想使用VC++,或Clang,我认为他们不应该为了构建程序或库而修改构建文件(或存储库中的任何其他文件)。理想情况下,任何在一个环境中都有一个函数C++工具链和sCONS安装的人应该能够在命令行上键入<代码> sCONS,并且事情应该顺利进行。这不是斯科恩的目标吗?还是我误解了它的目的


另一件事是路径。上面的行还不够,我仍然需要导入到MinGW二进制文件的路径。我已经读过这个理由。但是,我必须将更多的系统特定信息放在构建文件中,其他人可能会在所选路径不适用的情况下使用这些信息。

我认为您确实理解了SCons的目的,即它是可移植的和多平台的:)

这里的问题是,如果您的系统上有多个编译器可供选择,那么如何告诉SCons使用哪一个。默认情况下,SCON将查找并使用特定于您的系统的编译器(例如windows上的VC++或linux上的g++)

我可以想出至少两种方法告诉SCON使用哪种编译器,这两种方法都需要在构建脚本中使用额外的逻辑,但可以通过可移植的方式完成:

  • 环境变量
  • 命令行参数
  • 我会考虑始终使用系统特定的编译器,除非用户用参数/变量调用sCONs,指示它使用不同的。 如果选择使用环境变量,则只需使用标准python代码,如下所示,并进行了说明:

    或者,如果选择使用命令行参数,则可以找到所需的一切


    就个人而言,我更喜欢命令行选项,因为它比env vars更显式。使用env-vars,用户可能会由于未意识到设置了env-vars而得到不想要的结果。

    请尝试编辑以下目录之一中的文件
    site\u init.py

    %ALLUSERSPROFILE/Application Data/scons/site_scons
    %USERPROFILE%/Local Settings/Application Data/scons/site_scons
    %APPDATA%/scons/site_scons
    %HOME%/.scons/site_scons
    ./site_scons
    
    在该文件中,添加一行,如下所示:

    DefaultEnvironment(tools = ['mingw'])
    
    或者可能是这样:

    DefaultEnvironment(tools = ['default', 'mingw'])
    

    但是这不需要修改SConstruct文件吗?自从我提出这个问题以来,我已经了解了“site_init.py”文件,它允许我设置一些特定于系统的设置。但是我不知道它如何允许我为SConstuct文件创建的环境对象设置默认选项。@BenjaminLindley是的,有了这个答案,您需要修改生成脚本,但我从您的问题中了解到,您正在寻找一种可移植的方法来设置编译器,并且确实可以编辑生成脚本。如果您要编辑SITEY.IIT.PY,请考虑设置Debug环境,这里解释:不,关键是不必修改构建脚本。当我谈到“可移植构建系统”时,对我来说,这意味着,理想情况下,如果您创建一个在您的系统上构建和运行的项目(使用可移植代码),我应该能够在完全不同的系统上构建和运行该项目,而不会对您的项目(包括构建文件)进行任何更改。不幸的是,斯科斯对我做了太多的假设,这一切都行不通。我不介意告诉SCONS如何在我的系统上编译C++,但我只想做一次,我希望它能应用到所有的项目,我的或别人的。您可以在多个平台上使用相同的SCONS构建脚本和可移植的C++源代码构建。当有多个编译器可用时,您不能期望SCON(或任何其他生成系统)自动知道您需要哪个编译器。但我不需要或不希望SCON自动知道我要使用哪个编译器。我只想让编写SConscript文件的人决定使用哪种编译器,然后交给构建项目的人,即熟悉运行scons的计算机的人。
    DefaultEnvironment(tools = ['default', 'mingw'])