当我尝试我的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代码。
答案 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中的第一个目标,除非您在命令行上给它特定的目标。