调用Shell写入Makefile中的文件

时间:2019-04-09 18:12:55

标签: makefile

这里有两个关于Makefile和存储持久变量的问题。我有一个脚本,用于为二进制文件执行构建,该脚本将部署到包含两个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

1 个答案:

答案 0 :(得分:1)

我不知道持久性比文件更好的方法。您观察到的时间较长是由于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)