首页 > 解决方案 > 调用shell写入makefile中的文件

问题描述

这里有两个关于Makefiles 和存储持久变量的问题。我有一个脚本,用于为包含两个 MCU 的系统部署的二进制文件执行构建。来自一个 MCU 的二进制文件将被馈送到另一个 MCU 的二进制文件中,用于由第二个 MCU 启动的应用程序更新。

多个开发人员正在研究这个项目,并且为将插入主二进制文件的 MCU 构建二进制文件对于所有相关人员来说都不是必需的。此外,辅助二进制文件所需的构建的存在和位置可能会有所不同。因此,如果该辅助二进制文件可用,我需要能够找到它的构建工具。我这样做的方法是在开头运行搜索Makefile以查找 exe,然后将该位置写入文件以允许它在多次构建尝试中持续存在。

第一个问题:有没有更好的方法来保存构建工具的路径而不是写入文件而不进入和PATH外部操作(这将是一个自动构建,所以......)?

第二个问题:我正在使用以下内容(不在配方中)将值写入构建工具

$(shell echo ${IAR_EXE} > iar-path)

这需要很长时间。我可能做错了什么或者我可以做些什么来提高这个电话的效率?

编辑@kebs

为了提供上下文,以上内容位于 make 文件的序言中(即在配方之前)。不确定这是否增加了任何内容,但这是整个序言:

STM32_DIR:=../../Project-STM32
LX_PROJECT:=$(STM32_DIR)/Projects/Lx/Application/Project_file/Lx.ewp
GX_PROJECT:=$(STM32_DIR)/Projects/Gx/EWARM/Gx.ewp

IAR_EXISTS=FALSE

# Check to see if the path for the IAR build tool exists...
ifeq ("$(wildcard iar-path)", "")

$(info IAR path not available, searching now...)
IAR_EXE:="$(shell find /cygdrive/c/ -name IarBuild.exe -print -quit 2>&1 | grep -v "Permission denied")"

ifneq ($(IAR_EXE),"") 
# Path exists - push it to a file that might be _more_ persistent

$(info Pushing path into local file...)
$(shell echo ${IAR_EXE} > iar-path)
IAR_EXISTS:=TRUE

endif

else 
# Path exists - grab it from the file

$(info IAR Path file exists...)
IAR_EXE:="$(shell cat iar-path)"

ifneq ($(IAR_EXE),"")
IAR_EXISTS=TRUE
endif

endif

标签: makefile

解决方案


我不知道比文件更好的持久性方法。你观察的时间长是由于find,不是由于echo。如果你想优化这个尝试,如果有意义的话,可以将搜索空间限制为你正在寻找的目录,而不是完整的/cygdrive/c/.

小意见:

  1. 您可以删除大部分",它们是无用的(如果您只在比较的一侧忘记它们也可能成为问题):因为它们只是文本字符串中的另一个字符。例子:

    ifeq ($(wildcard iar-path),)
    

    代替:

    ifeq ("$(wildcard iar-path)", "")
    

    和:

    IAR_EXE := $(shell cat iar-path)
    ifneq ($(IAR_EXE),)
    IAR_EXISTS = TRUE
    endif
    

    代替:

    IAR_EXE:="$(shell cat iar-path)"
    ifneq ($(IAR_EXE),"")
    IAR_EXISTS=TRUE
    endif
    
  2. 您可以通过以下方式简化您的搜索命令:

    IAR_EXE := $(shell find /cygdrive/c/ -name IarBuild.exe 2> /dev/null)
    

    也许(不确定)通过以下方式对其进行一些优化:

    IAR_EXE := $(shell find /cygdrive/c/ -type f -name IarBuild.exe 2> /dev/null)
    

推荐阅读