在制作过程中的某个时刻,我正在这样做:
@copy $(OUTPUT_HEX) $(BUILD_DIR)$(OUTPUT_NAME)_$(VARIANT_MODE)_new.hex
因为这不起作用,我在同一目录中尝试了以下命令:
copy /Y build\debug\0821_0822_CON_debug.hex build\debug\hello_new.hex
这个命令在cmd上运行,没问题。当我在 makefile 中尝试完全相同的命令时,我收到一条错误消息,提示系统找不到特定路径。
所以我的猜测是,由于未知原因,构建是从另一条路线创建的,所以在运行命令之前,我这样做:
@cd C:/Users/john/git/0821_0822/01_Control/app
@copy /Y build/debug/0821_0822_CON_debug.hex build/debug/hola_app_only.hex
相同的目录我在cmd中使用复制命令,它在那里工作,我不明白为什么它不工作。
我试过一些
@echo $(CURDIR)
执行 cd 之前和之后,目录似乎是正确的,但 cd 实际上似乎不起作用,因为如果我将其更改为另一个目录,目录仍然相同。
我真的很困惑。
顺便说一下,我在 ST32CubeIDE 中做这个,除了我必须做的之外别无选择。
谢谢!
首先,pmacfarlane 是 100% 正确的。在您的 makefile 100% 正确工作之前,使用
@
是一个坏主意。您不会尝试通过首先将所有输出重定向到 /dev/null
来调试您的程序:这是等价的。
第一个问题是这并没有按照您的想法去做:
@cd C:/Users/john/git/0821_0822/01_Control/app
@copy /Y build/debug/0821_0822_CON_debug.hex build/debug/hola_app_only.hex
makefile 配方中的每个逻辑行都在 不同的 shell 中运行,这意味着只要命令退出,对本地 shell 环境的任何更改(例如设置环境变量或更改工作目录)都会丢失。所以这里的第一个命令是空操作:它启动一个 shell,更改目录,然后退出 shell,目录更改就消失了。
第二,在 Windows 中编写 makefile 非常棘手,因为有太多不同的可能方法来做事。 Make 调用一个 shell,但它调用的是什么 shell?是在调用
cmd.exe
吗?它是在调用 Powershell 吗?它是否调用您安装的 POSIX shell(比如作为 Git for Windows 的一部分)?
这很重要,因为与 UNIX 系统不同,您在 Windows shell 中运行的许多程序都是 shell 内置的;例如,包括
copy
。这意味着如果您启动不同的 shell,则不能将它们作为独立程序运行。
所以在我看来,您的
make
版本正在您的 PATH 上找到 UNIX shell sh.exe
,因此它使用它作为 shell 来调用命令,当然这不允许 copy
工作。
解决此问题的最简单方法是显式设置要运行的 shell。例如,您可以将其添加到您的 makefile 中:
SHELL := cmd.exe