【问题标题】:Makefile with msys on Windows strange behaviour using the include directive (On linux works perfectly)使用 include 指令在 Windows 上使用 msys 的 Makefile 出现奇怪行为(在 linux 上完美运行)
【发布时间】:2021-02-26 16:14:38
【问题描述】:

在使用 msys 的 makefile 中使用 INCLUDE 指令的问题。

我在 PATH 中添加了 MSYS,直到这里都没问题:

PS C:\Users\Roxanji> Get-Command make

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     make.exe                                           0.0.0.0    C:\Program Files\msys\bin\make.exe


PS C:\Users\Roxanji> Get-Command bash

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     bash.exe                                           0.0.0.0    C:\Program Files\msys\bin\bash.exe

Makefile 示例:

-include a1

a1:
    @echo something: > a1
    

.PHONY: clean
clean:
    $(RM) a1

在 Windows cmd/powershell 上:

PS C:\Users\Roxanji\eclipse-workspace\prototype\tst> ls
  
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        15.11.2020     05:53             81 Makefile
   
PS C:\Users\Roxanji\eclipse-workspace\prototype\tst> make

make.exe": /c/Users/Roxanji/eclipse-workspace/prototype/tst/"C:/Program Files/msys/bin/make.exe": Command not found

PS C:\Users\Roxanji\eclipse-workspace\prototype\tst> ls
  
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        15.11.2020     06:03             11 a1
-a----        15.11.2020     05:53             81 Makefile

在 Windows 上使用来自 msys 的 bash:

PS C:\Users\Roxanji\eclipse-workspace\prototype\tst> bash
bash.exe"-3.1$ pwd
/c/Users/Roxanji/eclipse-workspace/prototype/tst
bash.exe"-3.1$ ls
Makefile
bash.exe"-3.1$ make
make: Nothing to be done for `something'.
bash.exe"-3.1$ ls
Makefile  a1
bash.exe"-3.1$

使用 cmd/powershell 的事实:

  • 已生成文件“a1”。
  • 找不到命令消息。

使用 msys bash 的事实:

  • -生成文件“a1”。

我认为发生了什么?

  • 我看到 windows 斜线“\”和 unix 斜线有些混合 "/"

  • 我看到在 bash 下的 make“位置”似乎与 msys 不同:

    bash.exe"-3.1$ which make
    /usr/bin/make.exe
    
  • 我看到在 msys/bash 下也有这条消息make: Nothing to be done for 'something'

认为当 make 命中 include 时,会生成另一个 make.exe 来读取这个其他文件,但从 make 内部调用,它具有不同的 make 路径,这会导致一些问题。

谁能解释一下这个现象??

编辑 1: 使用 powershell:

PS C:\Users\Roxanji\eclipse-workspace\prototype\tst> make -np | grep MAKE_COMMAND
MAKE = $(MAKE_COMMAND)
MAKE_COMMAND := /c/Users/Roxanji/eclipse-workspace/prototype/tst/"C:/Program Files/msys/bin/make.exe"

MAKE_COMMAND 变量 bee 不应该等于“make”吗? 喜欢:MAKE_COMMAND := make ?

编辑 2:

我认为问题可以归结为我无法在 C:\Program Files\ 下运行 msys.bat,因为显然“程序文件”中有空格??

【问题讨论】:

  • 我的经验是,如果你想直接从 Windows 运行 make,你应该使用 make 的本地构建(没有 cygwin,没有 msys)。这会产生更可预测的结果。
  • @raspy C:\Program Files\msys\bin\make.exe 不是 make 的原生构建吗?
  • 没有。它可能是使用 MinGW 概念的 MinGW 构建。本地人 make --version 应该说类似 Built for Windows32

标签: windows makefile msys


【解决方案1】:

如前所述,Windows 上最可靠的解决方案是原生 Windows 构建。无论make 位于有空格的目录中,我都能够使用此类本机构建直接从Powershell 运行您的Makefile 而不会出现任何错误:

> ls

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          11/26/2020  4:11 PM             86 Makefile

> & 'C:\Program Files\make\make.exe'
make: Nothing to be done for 'something'.

> ls

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          11/26/2020  4:17 PM             13 a1
-a---          11/26/2020  4:11 PM             86 Makefile

MAKE_COMMAND 看起来也不错:

> & 'C:\Program Files\make\make.exe' -np | ? { $_ -match "MAKE_COMMAND" }
MAKE = $(MAKE_COMMAND)
MAKE_COMMAND := C:/Program Files/make/make

所有测试完成:

> & 'C:\Program Files\make\make.exe' --version
GNU Make 4.2.1
Built for Windows32
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

使用 Visual Studio 直接从源代码构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多