【问题标题】:No rule to make target `/Makefile', needed by `Makefile'没有规则来制作目标“/Makefile”,这是“Makefile”所需要的
【发布时间】:2011-01-21 20:18:46
【问题描述】:

我正在尝试使用一个非常简单的 makefile 来“制作”。我的 makefile 被命名为“Makefile”,所以我只是使用命令“make”。

我收到这个奇怪的错误:
make: *** No rule to make target `/Makefile', needed by `Makefile'. Stop.

但是,如果我使用 make -f "full-path-to-makefile" 它确实运行了(有奇怪的后果......)。当然,我应该说我是从 Makefile 所在的目录运行所有这些的。

我正在使用 tcsh 在 Mac OSX 上工作。

编辑:

我在 LLVM 框架中工作,试图编译一个 pass 函数,这是关联的 makefile:

电平 = ../../../ 库名 = 函数名 加载模块 = 1 包括 $(LEVEL)/Makefile.common

任何想法将不胜感激:)

【问题讨论】:

  • 发布你的makefile(至少部分),然后我们也许可以看到。
  • 我的猜测是您的一个目标中有一个变量替换;但为了让人们提供真正的答案,您需要发布有问题的 Makefile。

标签: macos makefile llvm gnu-make


【解决方案1】:

我在尝试为 LLVM 编写新通行证时遇到了同样的问题,我按照这些说明尝试制作 HelloB(因为 Hello 已经存在)http://llvm.org/docs/WritingAnLLVMPass.html#quickstart

我要做的是再次执行 ./configure,然后从基本目录生成。

【讨论】:

  • 只是为了更清楚。在LLVM_SRC_ROOT 中再次执行./configure。然后在$LLVM_SRC_ROOT/lib/Transforms/Hello 中运行make。这对我有用
【解决方案2】:

我会冒险出去:你有一个额外的斜线。尝试省略 $(LEVEL) 中的最后一个斜杠。

【讨论】:

  • 生成的双斜杠会默默地折叠并因此起作用,但是 Make 中的字符串处理肯定会出错。 Make 已经过了过期日期——重要的空白 FTL。
【解决方案3】:

我找到了答案,有点:

问题在于 LLVM 的安装过程。似乎如果您以一种顺序而不是另一种顺序进行安装,则可能会导致此错误。这对我来说没有任何意义,但是在我正确安装它之后,一切都编译得很好(相同的代码,相同的 Makefile,相同的 make 程序)。

我真的不知道为什么会这样,但我知道如何解决它:)

您要做的是再次 ./configure 然后从 基本目录 制作(与网站说明中的说明相反)。这对我有用。

顺便说一句 - 我在 Ubuntu 上运行时得到了相同的结果(具有相同的修复)。

【讨论】:

    【解决方案4】:

    只是在这里添加一些信息(因为这是在查找错误时出现在 Google 上的第一个命中) - 我遇到了同样的问题,它突然出现在 OSX 上的(以前工作的)LLVM 设置上,并跟踪回到 make 中 realpath 命令的行为。

    具体来说,发生的事情是我有一个名为“LLVM/llvm-2.9-build”的目录,但由于某种原因,在 Makefile.config 顶部解析 PROJECT_OBJ_ROOT 的尝试会决定这个目录实际上被称为“llvm/llvm-2.9-build”。由于 OSX 默认情况下不区分大小写,因此这不会立即导致问题,除非随后将 LLVM_SRC_ROOT 设置为“LLVM/llvm-2.9-build”。这意味着使用 patsubst 创建 PROJ_SRC_DIR 来替换对象目录将导致路径不存在(因为不匹配的情况意味着不会发生模式替换),而这又会被 realpath 解析为 /。

    将 PROJ_SRC_DIR 设置为 /,这会导致 Makefile.rules 中的 makefile 复制规则决定源 makefile 位于 $(PROJ_SRC_DIR)/Makefile(即 /Makefile),并描述错误消息。

    似乎只有 Makefile.config 中 realpath 的内置实现(在我的例子中是 GNU Make 3.81)具有这种行为,因为从 Makefile.config 顶部强制使用 realpath 的宏版本可以解决问题。但是,这不是一个好的长期修复,因为您必须手动修补每个 LLVM makefile。

    最后,我看不到 realpath 会从哪里获得小写的“llvm”,但我认为它可能是一个工件,从我引用的某个时间点开始缓存名称使用其小写名称的目录。因此,我尝试转到该目录并将其 mv-ing 为一个完全不同的名称,然后在进入并再次构建之前返回“LLVM”,这似乎已经解决了问题。

    我希望这对遇到这种特殊情况的其他人有所帮助!

    【讨论】:

    • 您能发布为您解决此问题的修复程序吗?
    【解决方案5】:

    这不是一个完整的答案,但您看到的是 gmake 没有找到它被告知包含的 Makefile,因此它试图重新制作它并失败,因为它也找不到它的配方。

    但是,您发布的 Makefile sn-p 不会产生您所看到的错误消息,因此我认为问题出在 Makefile.common 文件中。查找引用 $(一些变量扩展)/Makefile 的包含语句并从那里向后工作。您也可以尝试使用 -d 选项运行 gmake,然后根据输出进行处理。

    【讨论】:

      【解决方案6】:

      由于您的包含行显示为:

      include $(LEVEL)/Makefile.common
      

      令人费解的是,您没有收到关于 /Makefile.common 的错误。如果你是,那么我建议你在 LEVEL 的定义之后有一个尾随空格。

      Makefile.common 中是否有一行本身包含 $(SOMEMACRO)/Makefile 而您没有设置 SOMEMACRO 的值?

      【讨论】:

        【解决方案7】:

        这是我对这个问题的修复:(https://github.com/rust-lang/rust/issues/24887#issuecomment-99391849)

        在运行 ./configure 之前更新 src/llvm/Makefile.config.in

        或在 make 之前更新 x86_64-apple-darwin/llvm/Makefile.config

        第 59 行:

        PROJ_SRC_DIR    := $(LLVM_SRC_ROOT)$(patsubst $(PROJ_OBJ_ROOT)%,%,$(PROJ_OBJ_DIR))
        

        更新到

        PROJ_SRC_DIR    := $(patsubst $(PROJ_OBJ_ROOT)%,$(LLVM_SRC_ROOT)%,$(PROJ_OBJ_DIR))
        

        第 86 行:

        PROJ_SRC_DIR := $(call realpath, $(PROJ_SRC_ROOT)/$(patsubst $(PROJ_OBJ_ROOT)%,%,$(PROJ_OBJ_DIR)))
        

        更新到

        PROJ_SRC_DIR := $(call realpath, $(patsubst $(PROJ_OBJ_ROOT)%,$(PROJ_SRC_ROOT)%,$(PROJ_OBJ_DIR)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-11
          • 2019-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多