Make:为什么我会收到错误说“没有这样的文件或目录”

时间:2013-07-16 15:52:38

标签: makefile

当我尝试我的makefile时,我收到错误,说没有这样的文件或目录,但我的目录就在那里,我做错了什么?谢谢。

我的项目结构:

dev |--- ev
    |--- display
    |--- install ( makefile is here, try to call makefiles in ev and display folder)

我的makefile:

 MODULES :=ev display 
 SRC_DIR   :=$(addprefix ../, $(MODULES))
 BUILD_DIR:=$(addsuffix /build, $(SRC_DIR))
 x:=../ev                               ------> add temporarily just for test, 
                                        ------> the same error if x:=$(HOME)/dev/ev

 INSTALL_DIR:=EX Frameworks Add-ons
 INSTALL_DIR:=$(addprefix $(HOME)/EX/, $(INSTALL_DIR))


 vpath %.cpp %.java $(SRC_DIR)

 .PHONY: all clean

 checkdirs: $(INSTALL_DIR)

 $(INSTALL_DIR):
      @echo "INSTALL DIR"
      @mkdir -p $@ 


 define make-goal
 $1:
      @echo "start building each part"
      cd $@ && make -f Makefile_new.osx clean
      cd $@ && make -f Makefile_new.osx package
 endef


 clean:
     @echo "clean up"

     @echo "BUILD_DIR IS $(BUILD_DIR)"
     @rm -rf $(BUILD_DIR)


   all:
     @echo "start build subdirectory"
     @echo "SRC_DIR IS $(SRC_DIR)"

     @echo "x is $(x)"
     $(call make-goal, $(x)))   ----> when it comes to here, I got error message

错误消息:

x is ../ev
../x:
make: ../ev:: No such file or directory.

我想这是关于相对路径,因为我从Install文件夹调用这个makefile,然后在Install文件夹中找不到$(x),但是当我尝试创建一个名为ev(Install / ev)的文件夹时,我仍然有同样的错误。

我认为这一定是我在这里错过的基本内容,但它是什么。

感谢。

更新:

我正在尝试建立一个包含多个子项目的项目。结构是:

dev |---- ev
    |---- edf
    |----- dt
    |------af 
    |------Install

在安装内部,我有一个makefile,它位于顶层。 Install文件夹中的makefile将在其他文件夹中调用makefile以构建不同的主题,

理想情况下,我想在不触及源的情况下构建每个子项目。我的来源包括c ++和java代码。

1 个答案:

答案 0 :(得分:2)

目前尚不清楚你要做什么。另外由于一些缩进打嗝,我无法确定,但您似乎正在定义一个变量make-goal,其中包含一个make规则的模板,然后在$(call ...)的配方中使用它{ {1}}目标。这不起作用:你不能在另一个制定规则的配方中创建一个制作规则!

失败的原因是all正在扩展到添加到$(call ...)目标的配方中的内容,因此它不是创建新的make规则而是将结果视为shell脚本。第一行是all,您传入$1:,因此make正在尝试运行命令../ev,就像错误显示的那样。

如果您在更高级别描述您想要做的事情,我们可以为您提供一些如何做的建议。

ETA:

如果您只是希望您的../ev:目标也构建一个子目录,则不需要所有这些复杂的GNU make高级功能。只有当你进入guru级别的makefile创建时才需要这些东西。简单的“在另一个目标完成之后构建一个目标”就是设计要做的确切事情:没有什么特别需要做到这一点。

例如:

all

这仍然是一个非常非标准的设置,但我认为它将以您想要的方式工作。请记住,您必须将.PHONY: all $(SRC_DIR) all: $(SRC_DIR) $(SRC_DIR): @echo "start building $@" cd $@ && $(MAKE) -f Makefile_new.osx clean cd $@ && $(MAKE) -f Makefile_new.osx package 目标移动到makefile中的第一个目标,或者您必须显式运行all:make只构建makefile中的第一个目标,除非您在命令行上给它特定的目标。