我刚开始制作和制作文件,遇到了一个可能非常简单的问题。
我已经开始学习XUL学校的教程,当我开始使用komodo编辑器,cygwin和make时,我卡住了。
我的实际问题是安装部分,如果makefile脚本。我将把makefile脚本压缩到显示问题的最小大小:
...
# The target location of the build and build files.
bin_dir := ../bin
...
# The temporary location where the extension tree will be copied and built.
build_dir := $(bin_dir)/build
...# The sources for the XPI file.
xpi_built := install.rdf
chrome.manifest
$(wildcard content/*.js)
$(wildcard content/*.xul)
$(wildcard content/*.xml)
$(wildcard content/*.css)
$(wildcard skin/*.css)
$(wildcard skin/*.png)
$(wildcard locale/*/*.dtd)
$(wildcard locale/*/*.properties)
...
.PHONY: install
install: $(build_dir) $(xpi_built)
@echo "Installing in profile folder: $(profile_location)"
@cp -Rf $(build_dir)/* $(profile_location)
@echo "Installing in profile folder. Done!"
...
问题在这里:
。假:安装安装:$(build_dir) $(xpi_build)
就我对这个脚本的理解而言,这行代码应该将xpi_built中提到的所有文件复制到build_dir文件夹中。build_dir文件夹应该相对于makefile所在的文件夹。
问题是运行脚本后构建文件夹仍然是空的(运行命令'bash -c "export OSTYPE;Make install from komodo
当我手动将任何文件放入构建文件夹时,它们被成功地复制到$(profile_location),这意味着命令"@cp -Rf $(build_dir)/* $(profile_location)"工作正常。
总之,我的问题是:为什么从$(xpi_build)的文件不复制到$(build_dir)文件夹?
编辑:链接到完整的Makefile
.PHONY: install
install: $(build_dir) $(xpi_built)
@echo "Installing in profile folder: $(profile_location)"
@cp -Rf $(build_dir)/* $(profile_location)
@echo "Installing in profile folder. Done!"
你似乎没有理解这几行字的意思。
第一行是对make
的指令。它告诉make
, install
是一个假目标,即。install
不是文件,它只是make
可能执行的某些任务的名称,因此您可以调用make install
和make
将完成该任务。虚假的目标"总是过时的"。
下一行是规则。它表示假目标install
依赖于$(build_dir)
扩展到的先决条件列表,并且$(xpi_built)
扩展到的任何先决条件列表。所以让假目标install
, make
将首先使每件事x
在这些组合列表,如果x
不存在或是相对于它自己的先决条件来说已经过时了。
你说你相信规则指示make
将所有$(xpi_built)
文件复制到$(build_dir)
。我害怕它根本不做这种事。规则不是命令。它只是表达了目标和它们之间的依赖关系先决条件。
接下来的三行,即缩进的行,是一个配方。菜谱的每一行都是make
将执行的命令如果食谱的目标是过时的。配方中每个命令的@
前缀指示make
不是要回显命令本身,只需执行。
配方的第一个和最后一个命令在控制台上打印明显的消息。第二个命令复制文件和子目录,递归地和强制地,从$(build_dir)/*
扩展到的目录中$(profile_location)
展开为。(请注意,您发布的压缩makefile没有给 $(profile_location)
赋值)
install
配方中没有将$(xpi_built)
复制到$(build_dir)
的命令,也没有install
所依赖的目标具有完成此操作的配方。所以它没有完成。
如果您希望在install
配方中完成它,然后在配方中添加适当的复制命令:
install: $(build_dir) $(xpi_built)
@echo "Installing in profile folder: $(profile_location)"
@cp -Rf $(xpi_built) $(build_dir)
@cp -Rf $(build_dir)/* $(profile_location)
@echo "Installing in profile folder. Done!"
我不清楚,然而,从发布的makefile,为什么$(xpi_built)
文件应该复制到$(build_dir)
仅仅是为了将它们从那里复制到$(profile_location)
中,而不是直接复制到$(profile_location)
。你省略的细节可能是有原因的。
在cygwin下,我猜你使用的是GNU make
。我建议您研究一下介绍性文档
如果你给我们一个浓缩版的makefile提供给你的正确,可能有一个错误,在你省略的部分,或者一个错别字在这些部分,如果它来自网页;或者您可能通过编辑它引入了一个错误。
继续查看完整的makefile
您链接到的makefile不包含创建或填充$(build_dir)
扩展到的目录的目标。install
目标前面的注释:
如果"构建一切"被解释为"填充",这将构建除实际XPI之外的所有内容,然后将其复制到指定的配置文件目录,允许不需要安装的快速更新。
为假$(build_dir)
.
如果makefile包含一个以$(build_dir)
为目标的规则和一个确保$(build_dir)
存在并填充了它应该包含的最新内容的配方,这个注释甚至不会成立。在这种情况下,如果$(build_dir)
不存在,install
对$(build_dir)
的依赖将导致make install
填充$(build_dir)
。但是,如果$(build_dir)
确实存在,无论它是否存在,它都不会这样做内容是最新的东西。$(build_dir)
被删除,使用这个makefile,只有通过显式调用make clean
。
要么你正在学习的教程材料是废话-陌生的东西发生了—或者这个makefile属于您没有的更大的图片抓住了(无论如何,这是一种误导性的评论)。