Cygwin делает всегда обработку цели - PullRequest
1 голос
/ 04 мая 2010

Однако это происходит только в 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

поэтому, если я просто удалю $(jar_target_dir) из правила $(chrome_jar_file), все будет работать нормально.

UPD:

Вот основные выходные данные отладки из make на Windows 7

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

SOL: Как упоминал Эрик, было плохой идеей иметь предварительные требования к каталогу и создавать внутри него производственный файл. Каждый раз, когда mtime обновляется, отсюда «нужно перестраивать». Эта часть понятна. Однако в некоторых случаях временные метки каталога и файла, создаваемого внутри, всегда равны. Это сбивает с толку ...

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

При добавлении или удалении файлов в каталоге время изменения каталога изменяется. По этой причине сложно использовать каталоги в качестве предварительного условия в 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
0 голосов
/ 05 мая 2010

У меня нет 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
    ...
0 голосов
/ 04 мая 2010

Ваше правило для создания $ (jar_target_dir) выглядит подозрительно.Он создает каталог, если у него нет исполняемого бита, что кажется неправильным.Я думаю, что вы хотите сделать что-то вроде

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