这里有两个关于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
答案 0 :(得分:1)
我不知道持久性比文件更好的方法。您观察到的时间较长是由于find
,而不是echo
。如果您想优化此方法,可以尝试将搜索空间限制为仅查找您可能要查找的目录,而不是完整的/cygdrive/c/
。
次要评论:
您可以删除大部分"
,它们是无用的(如果您仅在比较的一侧忘记了它们,也可能会成为问题):因为使它们只是字符中的另一个字符文字字串。示例:
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
您可以使用以下方法简化搜索命令:
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)