我是制作和制作文件的新手,并且得到了一个 - 可能 - 非常简单的问题。
我已经开始研究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)文件夹中?
答案 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 install
和make
将执行该任务。虚假的目标总是过时的"。
下一行是一条规则。它表示假目标install
取决于$(build_dir)
扩展到的先决条件列表,以及
在$(xpi_built)
扩展到的任何先决条件列表中。所以制作假目标install
,make
如果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属于你没有的更大的图片 掌握(无论如何,误导性地评论)。