Сделайте: $ (подстановочный знак), держа каталог открытым - PullRequest
2 голосов
/ 15 октября 2008

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 21 октября 2008

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

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

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

0 голосов
/ 23 декабря 2008

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

Проблема заключалась в том, что для сбора исходных файлов использовалась функция $(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...