-1

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

我的项目结构:

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

我的生成文件:

 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.

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

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

谢谢。

更新:

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

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

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

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

4

1 回答 1

2

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

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

如果您在更高的层次上描述您想做什么,我们可以为您提供一些关于如何去做的想法。

预计到达时间:

如果您只是希望您的all目标也构建一个子目录,那么就不需要所有这些复杂的 GNU make 高级功能。仅当您创建大师级别的 makefile 时才需要这些东西。简单的“在另一个目标完成后构建一个目标”正是 make 设计要做的事情:没有什么特别需要做的。

例如:

.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

这仍然是一个非常非标准的设置,但我认为它会按照您想要的方式工作。请记住,您必须将all目标向上移动到 makefile 中的第一个目标,或者您必须make all显式运行:make 仅构建 makefile 中的第一个目标,除非您在命令行上为其指定特定目标。

于 2013-07-16T16:10:20.233 回答