makefile:windows下的路径问题

时间:2014-05-14 10:25:19

标签: windows makefile

我是制作和制作文件的新手,并且得到了一个 - 可能 - 非常简单的问题。

我已经开始研究XUL School tutorial了,当你开始使用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!"
...

问题在于:

.PHONY:安装 安装:$(build_dir)$(xpi_built)

据我了解这个脚本,这行代码应该将xpi_built中提到的所有文件复制到build_dir文件夹中。 build_dir文件夹应该与makefile所在的文件夹相关。

问题是构建文件夹在运行脚本后仍然为空(运行命令'bash -c“export OSTYPE; make install”'from komodo)

当我手动将任何文件放入build文件夹时,它们被成功复制到$(profile_location),这意味着命令“@cp -Rf $(build_dir)/ * $(profile_location)”工作正常。

所以简而言之,我的问题是: 为什么$(xpi_built)中的文件没有复制到$(build_dir)文件夹中?

编辑:Link to the complete Makefile

1 个答案:

答案 0 :(得分:1)

.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)扩展到的任何先决条件列表中。所以制作假目标installmake 如果x不存在或者是x,那么首先必须在这些组合列表中生成make 关于其自身先决条件已过时。

您说您认为该规则指示$(xpi_built)将所有$(build_dir)个文件复制到make。我很害怕 它什么都不做。规则不是命令。它只是表达了目标与它们之间的依赖关系 先决条件。

接下来的三行是缩进的,是一个食谱。配方的每一行都是@将执行的命令 如果食谱的目标是过时的。配方中每个命令的make前缀不指示$(build_dir)/* 要回应命令本身,就这样做。

配方的第一个和最后一个命令在控制台上打印明显的消息。第二个命令复制 文件和子目录,递归地和强制地,从$(profile_location)扩展到的目录到 $(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!" 配方中完成,请将相应的复制命令添加到配方中:

$(xpi_built)

但我不清楚,从发布的makefile中,为什么要将$(build_dir)个文件复制到$(profile_location) 只是为了将它们从那里再次复制到$(profile_location),而不是直接将它们复制到。{1}} make。您遗漏的细节可能有某些原因。

在cygwin下,我猜你正在使用GNU $(build_dir)。我建议你学习introductory documentation

如果您向我们提供了正确提供给您的生成文件的精简版本,则您遗漏的部分可能存在错误,或者如果它们出现错误,则会出现错误关闭网页;或者您可能通过编辑它来引入错误。

继续看到完整的makefile

您链接到的makefile不包含用于创建或填充install展开的目录的目标。 $(build_dir)目标之前的评论:

  

这将构建除实际XPI之外的所有内容,然后将其复制到   指定的配置文件目录,允许快速更新,无需安装。

如果"构建一切"

是错误的。被解释为意味着它填充 $(build_dir)

如果makefile包含一个以$(build_dir)为目标的规则,并且确保install存在并且填充了最新的内容,则此注释甚至不会成立。应该包含。在这种情况下,如果$(build_dir)不存在,则make install$(build_dir)的依赖会导致$(build_dir)填充$(build_dir)。但如果$(build_dir) 确实存在,它就不会这样做,无论它是否存在 内容是最新的东西。只有明确调用make clean

,才会使用此makefile删除{{1}}

你正在学习的教程材料都是下铺 - 陌生人的东西 发生了 - 或者这个makefile属于你没有的更大的图片 掌握(无论如何,误导性地评论)。