Makefile: windows下的路径问题



我刚开始制作和制作文件,遇到了一个可能非常简单的问题。

我已经开始学习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 installmake将完成该任务。虚假的目标"总是过时的"。

下一行是规则。它表示假目标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属于您没有的更大的图片抓住了(无论如何,这是一种误导性的评论)。

最新更新