【问题标题】:Cygwin make always processing targetCygwin 使始终处理目标
【发布时间】:2010-05-04 14:32:43
【问题描述】:

但是,它只发生在 Windows 7 上。在 Windows XP 上,一旦构建并完好无损,就不再构建。 我将问题缩小到一个先决条件 - $(jar_target_dir)

这是部分代码

# The location where the JAR file will be created.
jar_target_dir := $(build_dir)/chrome

# The main chrome JAR file.
chrome_jar_file := $(jar_target_dir)/$(extension_name).jar

# The root of the JAR sources.
jar_source_root := chrome

# The sources for the JAR file.
jar_sources := bla #... some files, doesn't matter

jar_sources_no_dir := $(subst $(jar_source_root)/,,$(jar_sources))

$(chrome_jar_file): $(jar_sources) $(jar_target_dir)
    @echo "Creating chrome JAR file."
    @cd $(jar_source_root); $(ZIP) ../$(chrome_jar_file) $(jar_sources_no_dir)
    @echo "Creating chrome JAR file. Done!"

$(jar_target_dir): $(build_dir)
    echo "Creating jar target dir..."
    if [ ! -x $(jar_target_dir) ]; \
  then \
    mkdir $(jar_target_dir); \
  fi

$(build_dir):
    @if [ ! -x $(build_dir) ]; \
  then \
    mkdir $(build_dir); \
  fi

所以如果我只是从$(chrome_jar_file) 规则中删除$(jar_target_dir),它就可以正常工作。

更新:

这是 Windows 7 上 make 的基本调试输出

Reading makefiles...
Updating goal targets....
 File `all' does not exist.
     Prerequisite `../bin/build/chrome' is newer than
             target `../bin/build/chrome/alt.jar'.
    Must remake target `../bin/build/chrome/alt.jar'.
Creating chrome JAR file.
updating: content/about.js (deflated 66%)
updating: content/sprintf.js (deflated 52%)
...

和统计数据

$ stat ../bin/build/chrome/alt.jar ../bin/build/chrome
  File: `../bin/build/chrome/alt.jar'
  Size: 29220           Blocks: 32         IO Block: 65536  regular file
Device: 22c6affh/36465407d      Inode: 59672695062724268  Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    acid)   Gid: (  513/    None)
Access: 2010-05-05 13:03:01.066457300 +0900
Modify: 2010-05-05 13:03:01.088960100 +0900
Change: 2010-05-05 13:03:01.091460400 +0900
  File: `../bin/build/chrome'
  Size: 0               Blocks: 0          IO Block: 65536  directory
Device: 22c6affh/36465407d      Inode: 3940649674014457  Links: 1
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    acid)   Gid: (  513/    None)
Access: 2010-05-05 13:03:01.090960400 +0900
Modify: 2010-05-05 13:03:01.090960400 +0900
Change: 2010-05-05 13:03:01.090960400 +0900

如您所见,chrome dir 确实比 alt.jar 更新

索尔: 就像 Eric 提到的那样,拥有目录先决条件并在其中制作生产文件是个坏主意。每次更新 mtime 因此“需要重建”。这部分很清楚。 但是,在某些情况下,在其中创建的目录和文件的时间戳总是相等的。这很令人困惑...

【问题讨论】:

  • 在文中苦苦寻找问题——你能稍微澄清一下问题吗?
  • 是的,主题中描述的问题。构建目标后,我应该获得“最新”消息,以便后续构建尝试运行 make。但是,它总是为$(chrome_jar_file) 启动命令
  • 你能确认一下:它重制了$(chrome_jar_file),但不是$(jar_target_dir)或其他任何东西? $(jar_target_dir) 存在吗?
  • @Beta:是的,我可以确认每次它执行$(chrome_jar_file) 中描述的命令时。不是来自$(jar_target_dir)。还用一些统计数据和调试输出更新了我的原始帖子。

标签: windows-7 windows-xp cygwin makefile


【解决方案1】:

每当您在目录中添加或删除文件时,目录的修改时间都会发生变化。出于这个原因,在 Makefile 中使用目录作为先决条件是很棘手的,尤其是当目录旨在包含构建期间创建的文件时。

如果您使用 GNU make 3.80 或 3.81,您可以将目录依赖声明为 order-only 先决条件:

$(chrome_jar_file): $(jar_sources) | $(jar_target_dir)

注意$(jar_target_dir) 前面的竖线字符(或竖线)。这告诉 GNU make 只要目录存在就满足依赖关系,而不管先决条件的修改时间。

如果您不使用 GNU make,通常可以通过在目录中使用“虚拟”文件来解决此问题。该文件与目录同时创建,然后您的其他目标依赖于虚拟文件而不是目录本身。这里的好处当然是当其他文件添加到目录时,虚拟文件​​的修改时间不会改变。这是它的样子:

$(chrome_jar_file): $(jar_sources) $(jar_target_dir)/dummy

$(jar_target_dir)/dummy:
        echo "Creating jar target dir..."
        mkdir -p $(jar_target_dir)
        touch $(jar_target_dir)/dummy

【讨论】:

    【解决方案2】:

    您创建 $(jar_target_dir) 的规则看起来很可疑。如果它没有可执行位,它会创建目录,这似乎不正确。我的猜测是你想做类似的事情

    $(jar_target_dir): $(build_dir)
            echo "Creating jar target dir..."
            [ -e $(jar_target_dir) ] || mkdir $(jar_target_dir)
    

    【讨论】:

      【解决方案3】:

      我没有 Windows 7 可玩(哈哈!),但看起来好像当您修改文件时,操作系统会将其所在的目录标记为正在修改。

      所以你必须重新考虑$(chrome_jar_file) 规则。我建议:

      $(chrome_jar_file): $(jar_sources)
          @if [ ! -x $(build_dir) ]; then mkdir $(build_dir); fi
          @if [ ! -x $(jar_target_dir) ]; then mkdir $(jar_target_dir); fi
          ...
      

      【讨论】:

        猜你喜欢
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 2022-01-03
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多