2014-01-19 2 views
1

У меня есть настройка autotools, сосуществующая с традиционным Makefile в одном репозитории. Чтобы избежать перезаписывания ./Makefile, я установил configure.ac для копирования Makefile.in в Makefile.test.Рекурсия с использованием automake ведет себя неожиданно

Существует подкаталог, которым управляет созданный файл Makefile.test. Когда я запускаю

make -f Makefile.test clean 

сценарий правильно входит в тестовый каталог, работает чистым и выходит из каталога. Однако, после возвращения к корню он пытается вызвать очистку утра, используя то, что, как представляется, простой

make clean-am 

Это вызывает неправильный сделать файл, и я получаю следующее сообщение об ошибке.

rm -f *.lo 
    make[2]: Leaving directory `/home/somedude/work_repos/some-repo/test' 
    make[2]: Entering directory `/home/somedude/work_repos/some-repo' 
    make[2]: *** No rule to make target `clean-am'. Stop. 
    make[2]: Leaving directory `/home/somedude/work_repos/some-rep' 
    make[1]: *** [clean-recursive] Error 1 
    make[1]: Leaving directory `/home/somedude/work_repos/some-repo' 
    make: *** [clean] Error 2 

Любая помощь по решению этой проблемы будет очень признательна.

ответ

1

Переименуйте свой статический make-файл в нечто другое и сгенерируйте make-файл, как обычно, с помощью Autotools, выводящий makefile или Makefile, а не Makefile.test.

Это решение не называет ваш созданный Automake make-файл чем-либо другим, кроме признанных шаблонов имен файлов, «makefile» (все строчные буквы) является первым и самым портативным. Я просто попробовал одно и то же, и все, что он делает, - это $(MAKE) $(AM_MAKEFLAGS) all-recursive, который расширяется до make all-recursive для меня.

Другими словами, Automake не может обрабатывать концепцию make-файлов с альтернативными именами файлов, главным образом потому, что для генерации правильного кода им нужно будет знать о них. Поскольку он не (и, возможно, не может), он вынужден принять имя файла makefile по умолчанию.

Возможность переименовать имя файла ввода/вывода, вероятно, не предназначалась для этого. Он был создан, если вы можете вывести причину из примера руководства, из-за ограничения DOS имени файла 8.3; config.h.in не является допустимым именем файла, поэтому вы должны сопоставить файл ввода, генерирующий config.h, к config.hin, например. Использование его для переименования make-файла, сгенерированного из Makefile.in или любого другого имени файла, которое вы использовали, очевидно, не работает.

Надеюсь, это поможет.

1

ваш лучший выбор, вероятно, использовать имя файла для Makefile, который содержит полный набор по следующим критериям:

  • прибудете данные берутся автоматически (так что вам не нужно указывать -f флаг)

  • переопределяет Makefile по умолчанию

  • не конфликтует с Makefile (так что вы можете держать другой Makefile вокруг)

чтение man make вы получите:

make выполняет команды в makefile для обновления одного или нескольких целевых names, где name обычно программа.Если нет -f вариант присутствует, make будет искать make-файлы GNUmakefile, makefile и Makefile, в указанном порядке.

поэтому очевидным выбором является использование GNUmakefile в качестве файла makeout autotools.

до тех пор, пока вы не запустили ./configure файловая система дерево будет выглядеть следующим образом:

Makefile 
GNUmakefile.in 
GNUmakefile.am 
configure 
[...] 

поэтому запуск make будет вызывать (устаревшие) Makefile по умолчанию. после вашего запуска configure, в пути также будет GNUmakefile, а make автоматически выберет новый блестящий файл автозагрузки Autotools.

Я использовал это успешно, чтобы поддерживать две параллельные системы сборки make.

+0

Проблема с использованием имени 'GNUmakefile' заключается в том, что он будет работать только в том случае, если пользователь использует gnu make. Однако просто использование имени 'makefile' (с нижним регистром' m') должно работать нормально. –

+0

@WilliamPursell проблема с 'makefile' (строчная), заключается в том, что она вызовет у вас большие проблемы с файловыми системами, которые не чувствительны к регистру (по умолчанию для W32 и OSX) –

+0

Другим вариантом является' makefile, v' (Build a makefile и использовать RCS 'ci' для создания' makefile, v') –

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