调用shell在makefile中写入文件

问题描述 投票:0回答:1

这里有两个关于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
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.