2014-11-08 5 views
2

Я пытаюсь создать очень простой скрипт сборки с помощью Autoconf/AutoMake цепь инструмента (в основном в качестве учебного упражнения.)Autoconf/Automake генерирует пустой сделать файл

Большинство примеров, кажется, указывают, что вам нужно отдельный Makefile.am в каждом исходном каталоге и что файл Makefile.am в корне проекта должен содержать директиву SUBDIRS, в которой говорится, что autoconf ищет дополнительные файлы Makefile.

Я думал, что для простого проекта может быть один Makefile.am в корневом каталоге проекта. Тем не менее, когда я пытаюсь это сделать и запускаю сгенерированный скрипт configure, он создает один единственный файл Makefile в корне проекта, который пуст (0 байт).

Я не совсем уверен, что я делаю неправильно здесь ,

Итак, моя структура каталогов предельно проста:

MyProject 
---src 
------myproject.cpp 
---Makefile.am 
---configure.ac 

Файл configure.ac минимален:

AC_INIT(myproject, 1.0) 
AC_MSG_NOTICE([My Project]) 
AC_PROG_CXX 
AC_LANG(C++) 
AC_CHECK_HEADERS(iostream) 
AC_CONFIG_SRCDIR(src/myproject.cpp) 
AM_INIT_AUTOMAKE(MyProject, 1.0) 
AC_OUTPUT(Makefile) 

И Makefile.am также очень просто:

bin_PROGRAMS = myproject 
myproject_SOURCES = src/myproject.cpp 
myproject_CPPFLAGS = --std=c++11 

Я бегу :

autoconf configure.ac > configure 

При запуске скрипта configure ошибок нет.

Тогда я вижу, что создается в корневой директории проекта в Makefile:

# ls -lh | grep Make 
-rw-r--r-- 1 root root 0 Nov 8 16:13 Makefile 
-rw-r--r-- 1 root root 98 Nov 8 15:53 Makefile.am 
-rw-r--r-- 1 root root 0 Nov 8 15:00 Makefile.in 

И вы можете видеть, Makefile он генерировал совершенно пуст.

Таким образом, я, очевидно, неправильно понимаю что-то фундаментальное о том, как должен работать autoconf/automake. Что я делаю неправильно здесь?

+1

Вы запустили 'automake'? – reinierpost

ответ

0

У меня была та же проблема - где automake будет генерировать пустые Makefiles. Я не знаю, почему это произошло, но я исправил его, удалив все файлы, созданные autoconf, например. Makefile.in (нулевой байт Makefile.in определенно плох).

Вы также можете попробовать autoreconf -if

0

Это интересно, я пытался воспроизвести ваше дело, и я получил разный, хотя и ожидаемые результаты.

  • AM_INIT_AUTOMAKE вызов является obsolete, вы должны написать AM_INIT_AUTOMAKE([foreign]). foreign говорит Automake не жаловаться на отсутствие README, ChangeLog и т.д.
  • У вас есть Makefile.am в другой папке, чем исходные файлы. Несмотря на то, что все в порядке, новый Automake должен жаловаться, что это вперед-несовместимость, я получил это на выходе (Automake 1.15):

    Makefile.am:2: warning: source file 'src/myproject.cpp' is in a subdirectory, 
    Makefile.am:2: but option 'subdir-objects' is disabled 
    automake: warning: possible forward-incompatibility. 
    automake: At least a source file is in a subdirectory, but the 'subdir-objects' 
    automake: automake option hasn't been enabled. For now, the corresponding output 
    ... 
    

    Это просто предупреждение, хотя.

  • Во всяком случае, вместо того, чтобы просто autoconf, я побежал autoreconf -i (или -i -f, чтобы убедиться --- опция -f перезаписывает все файлы эти средства генерации). Autoreconf запускает autoconf, automake и другие инструменты в правильном порядке для вас.

  • После завершения autoreconf у меня есть скрипт configure, который работал так, как ожидалось, и после запуска я тоже получил правильный Makefile.

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