Делать:$(подстановочный знак), удерживающий открытый каталог
-
03-07-2019 - |
Вопрос
Итак, похоже, существует проблема с функцией GNU Make $(wildcard), сохраняющей каталог открытым в Windows.См. пост (без ответа) "make держит каталог открытым".Google не предоставляет много информации по этой теме.
Суммируя:Makefile в какой-то момент использует функцию $(wildcard) и оставляет каталог открытым, что обычно не позволяет правилу make clean выполнить свою работу правильно.Повторный запуск команды make clean во второй раз обычно решает эту проблему.
Я использую GNU Make версии 3.81 под стандартной DOS-Box.Автор сообщения, ссылка на которое приведена выше, использует Cygwin.
Кто-нибудь нашел решение этой проблемы?
Решение 2
я нашел обходной путь за проблему, которая, по крайней мере, позволяет мне спокойно работать.
Проблема заключалась в том, что $(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
Другие советы
Звучит как утечка файлового дескриптора, да, безвредно для очень недолговечных процессов (таких как make) в UNIX, но подходит для PITA в Windows.
Поскольку это предположительно ошибка в make, а не проблема с ее использованием, ее следует устранить сначала путем проверки того, что она все еще существует при сборке из исходного кода в новейшей исходной версии, а затем отправка отчета об ошибке с проектом GNU make (или с любым дистрибьютором, с которым у вас есть соответствующий контракт на поддержку), или погрузиться в исходный код и попытаться исправить его самостоятельно.
Не помешало бы попробовать воспроизвести в Linux — здесь проверка на утечку файловых дескрипторов намного проще, так как можно просто посмотреть /proc/self/fd
(или, для состоятельного ребенка, /proc/$PPID/fd
) за чужие вещи.