2010-05-04 3 views
1

Однако это происходит только в Windows 7. В Windows XP, когда он был построен и нетронутым, больше нет сборок. Я сузил вопрос до одного необходимого условия - $(jar_target_dir).Cygwin всегда обрабатывает цель

Вот часть кода

# 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:

Вот основной вывод отладочной от марки на 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 реж действительно новее, чем alt.jar

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

+1

Борясь, чтобы найти вопрос в тексте - можете ли вы немного осветить проблему? –

+0

Да, проблема описана в теме. После создания цели я должен получить «актуальное» сообщение для последующих попыток сборки для запуска make. Тем не менее, он всегда запускает команду для '$ (chrome_jar_file)' – Pablo

+0

Можете ли вы подтвердить: он переделывает '$ (chrome_jar_file)', но не '$ (jar_target_dir)' или что-нибудь еще? и '$ (jar_target_dir)' существует? – Beta

ответ

3

При каждом добавлении или удалении файлов в каталоге изменяется время изменения каталога. По этой причине сложно использовать каталоги в качестве предварительного условия в Makefile, особенно если каталог предназначен для хранения файлов, созданных во время сборки.

Если вы используете GNU Make 3,80 или 3,81, вы можете объявить зависимость каталога как order-only предпосылку:

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

Обратите внимание на характер трубы (или вертикальная черта), предшествующий $(jar_target_dir). Это говорит GNU, что зависимость выполняется до тех пор, пока существует каталог, независимо от времени модификации предварительного условия.

Если вы не используете 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

@ Эрик Мельски: Вы правы! – Pablo

0

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

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

@JesperE: это не помогло, извините ... – Pablo

0

я не имею 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 
    ... 
Смежные вопросы