Build 如何在包含版本号的路径中查找编译器?

Build 如何在包含版本号的路径中查找编译器?,build,embedded,path,scons,Build,Embedded,Path,Scons,我正在尝试为一个嵌入式系统项目设计一个SConstruct文件。我机器上的编译器位于“C:\Program Files\IAR Systems\Embedded Workbench 5.4\arm\bin”我希望构建系统尝试定位工具链,即使安装了另一个verison of Embedded Workbench,或者如果用户选择在其他地方安装它 我还对makefile或ant文件中使用的策略感兴趣,因为它们在这里可能也很有用 有哪些策略可以做到这一点?除了搜索Windows注册表或查找“C:\Pr

我正在尝试为一个嵌入式系统项目设计一个SConstruct文件。我机器上的编译器位于“C:\Program Files\IAR Systems\Embedded Workbench 5.4\arm\bin”我希望构建系统尝试定位工具链,即使安装了另一个verison of Embedded Workbench,或者如果用户选择在其他地方安装它

我还对makefile或ant文件中使用的策略感兴趣,因为它们在这里可能也很有用


有哪些策略可以做到这一点?除了搜索Windows注册表或查找“C:\Program Files\IAR Systems\Embedded Workbench*\arm\bin”之外,我还有其他选择吗?

由于不同版本的工具链可能有不同的bug和/或功能,因此,悄悄地回到不同的工具集可能是个坏主意。当我在一个项目上支持多个工具版本时,我通常会通过makefile或环境指定版本号。然后,您可以将
-D TOOLS\u VERSION=$(TOOLS\u VERSION)
传递给编译器,并使用该值为特定版本的工具确定所需的错误修复和解决方法。该系统明确了您要支持哪些工具,同时也使其他开发人员可以通过进行一次编辑来轻松切换工具版本。

最简单的解决方案是使用环境变量。您仍然需要为每个生成主机手动设置,但是生成系统只需要引用环境变量,因此可以对所有生成主机通用

例如,在您的情况下,您可能有:

EWBARM_V0504=“C:\Program Files\IAR Systems\Embedded Workbench 5.4\arm\bin”


对于安装的其他版本也类似,然后在构建系统中使用%EWBARM_V0504%代替路径。更糟糕的情况是,如果变量不存在,构建将失败,这比使用错误的编译器更可取,而且很容易修复。

SCON的好处是您可以使用所有python。因此,您可以使用win32.winreg在注册表中查找,或在路径集中查找全局,任何适合您的方法都可以。当然,您可以使用命令行选项或选项文件来覆盖自动检测。一旦你找到了你选择的工具,你基本上有两种方法让SCON使用它:或者将工具的dir前置到env['env']['PATH'](你可以使用env.PrependEnvPath),或者只使用工具的完整路径作为$CC的值(并适当地设置$LINK,$SHLINK等)


我通常制作一个TOOL_MYCOMPILER函数,它接受一个env,并将其全部设置为与编译器及其工具链(cpp、linker等)一起使用。它使您的SConstruct/SConscript中的内容更清晰。

您是否正在尝试查找路径上的安装?或者你想在机器上的任何地方找到安装?我想让它在机器上的任何地方找到安装,我知道这很神奇,不能像我希望的那样工作。大多数情况下,我都在寻求关于如何处理类似问题的建议。您可能有一点,但如果您支持遗留项目,通常会坚持使用原始工具,因为更改编译器可能需要重新验证整个项目(从模块到验收测试)。例如,这可能是团队或项目政策或安全关键或合同要求,也可能只是为了避免现场发生可怕的意外而采取的务实措施。例如,代码库可能有一个潜在的bug,它恰好与一个编译器一起工作,但与另一个编译器一起暴露;如果不重新验证整个系统,您可能不会注意到。