Autotools и вложенный проект проекта с обычным Makefile

Этот вопрос расширяет вопрос Как обрабатывать подпроекты с помощью автоинструментов?

Итак, у меня есть проект с собственным Makefile (не GNU autotools) в modules/libfoo.

Я добавил SUBDIRS = include/jsonbox Makefile.am, и он отлично компилируется, но только если я вызываю ./configure и делаю из верхнего каталога.

Если я создам подкаталог, скажем, build, и запущу из него ../configure, я получу ошибку во время make:

   Making all in modules/libfoo
   /bin/sh: line 17: cd: modules/libfoo: No such file or directory
   make: *** [all-recursive] Error 1

Можно ли справиться с этим? Мне нужно несколько каталогов сборки для разных арок и CFLAGS.

EDIT: Как указано в docs Я создал GNUmakefile.in во вложенном проекте. Но это все еще не работает с VPATH:

Making all in modules/libfoo
make[1]: Entering directory `/home/galadog/test/build/moudles/libfoo'
GNUmakefile:2: Makefile: No such file or directory
make[1]: *** No rule to make target `Makefile'.  Stop.
make[1]: Leaving directory `/home/galadog/test/build/moudles/libfoo'
make: *** [all-recursive] Error 1

Edit2 Фактический файл Makefile можно увидеть здесь: https://github.com/anhero/JsonBox/blob/master/Makefile


person galadog    schedule 19.08.2012    source источник
comment
Можете ли вы изменить Makefile этого подпроекта или это сторонний Makefile?   -  person Michał Górny    schedule 19.08.2012
comment
@michal-gorny это худший случай, но если нет другого решения, я могу.   -  person galadog    schedule 19.08.2012
comment
Не могли бы вы вставить это Makefile для нас? Возможно, у него уже есть какая-то поддержка build-dir/VPATH, но, честно говоря, я в этом сомневаюсь.   -  person Michał Górny    schedule 19.08.2012
comment
@MichałGórny см. обновленный пост   -  person galadog    schedule 20.08.2012


Ответы (1)


К сожалению, вы не можете добиться этого правильно без:

  1. Изменение/замена основного Makefile,
  2. Добавление собственных правил make для вышестоящей библиотеки и игнорирование их Makefile.

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

Однако есть один простой хак, который сработает с минимальными затратами — это копирование всего поддерева в каталог сборки. Это не очень хорошее решение, но оно заставит работать сборки поддерева:

SUBDIRS = modules/libfoo

# and possibly all other -recursive targets you'll be using
all-recursive: copy-libfoo

copy-libfoo:
    mkdir -p modules
    cp -R -H $(top_srcdir)/modules/libfoo modules/

Но, как я уже сказал, это некрасиво. В исходном Makefile по-прежнему необходимо определить правильные цели автоматического создания (all, install и т. д.), поэтому в вашем случае вам также необходимо добавить GNUmakefile в подкаталог проекта, например:

include Makefile
INSTALL:

который предоставил бы фиктивную цель, чтобы избежать *** No rule to make target 'install'; а возможно и это. Затем EXTRA_DIST, если вы хотите использовать make dist, но все это описано в связанном документе.


Честно говоря, вы на скользкой земле. На вашем месте я бы либо просто не использовал этот проект, либо проигнорировал бы его, потому что поддерживать его будет сложнее, чем писать то же самое с нуля.

Второе решение, которое я бы рассмотрел, и которое будет работать правильно, будет состоять в том, чтобы продублировать Makefile в вашем основном Makefile.am и не использовать рекурсивное автоматическое создание для этого подкаталога:

LIBRARIES = modules/libfoo/libfoo.a

modules_libfoo_libfoo_a_SOURCES = modules/libfoo/src/a.c # ...

# and possibly some...
EXTRA_DIST = # ...
person Michał Górny    schedule 20.08.2012
comment
Поэтому я добавляю Makefile.am и configure.ac для использования с libtool. Я предполагаю, что это единственное решение, грустное, но верное. - person galadog; 20.08.2012
comment
Нет, libtool здесь не нужен. Вам нужен libtool, если вы создаете разделяемые библиотеки или используете LTLIBRARIES. Automake может сам обрабатывать обычные LIBRARIES. - person Michał Górny; 20.08.2012