2008-10-15 4 views
2

Таким образом, проблема связана с функцией GNU Make $ $ (wildcard), сохраняющей каталог открытым в Windows. См. (Unasnewered) post "make is holding a directory open". Google не предоставляет много информации по этой теме.

Вкратце: Makefile использует функцию $ (wildcard) в какой-то момент и сохраняет каталог открытым, что обычно препятствует правилу «make clean» для правильной работы. Обычно повторный запуск «make clean» обычно решает.

Я использую GNU Сделайте версию 3.81 под стандартным DOS-Box. Автор сообщения, связанного выше, использует Cygwin.

Кто-нибудь нашел исправление для этого?

ответ

0

Я нашел обходное решение, что по крайней мере позволяет мне работать в покое.

Проблема заключалась в том, что для сбора файлов источников использовалась функция $(wildcard). Однако мое чистое правило удаляет только каталог - нет необходимости собирать, пожалуйста, пожалуйста. Поэтому я в основном ставил часть Makefile, которая должна собирать файлы источников в условном заявлении:

# The clean rule is always parsed 
clean: 
    rm -rf $(OUTPUT_DIRECTORY) 

# The compile rule is only interpreted if we did not invoke 'make clean'. We 
# can test the value of $(MAKECMDGOALS) for that: 
ifeq ($(filter $(MAKECMDGOALS),clean),) 

SOURCE_FILES := $(wildcard ...) 

compile: 
    g++ $(SOURCE_FILES) ... 

endif 
2

Звучит как утечка дескриптора файла - все в порядке - безвредно для очень короткоживущих процессов (например, make) в UNIX, но справа PITA на Windows.

Поскольку это, как утверждается, ошибка в make, а не проблема с ее использованием, его следует решить сначала, подтвердив, что он все еще существует, когда он построен из источника в новейшей восходящей версии, а затем filing a bug report с GNU сделать проект (или с любым дистрибьютором, с которым у вас есть соответствующий контракт поддержки), или погрузиться в источник и попытаться исправить его самостоятельно.

Было бы неловко пытаться воспроизвести на Linux - здесь гораздо проще проверять утечки дескриптора файла, так как можно просто посмотреть на /proc/self/fd (или, для ребенка make, /proc/$PPID/fd) для вещей, т.

Смежные вопросы