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

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

Так что у меня есть некоторый проект со своим собственным Makefile (не GNU autotools) в modules / libfoo

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

Если я создаю subdir, говорю 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.

РЕДАКТИРОВАТЬ: Как он предположил в документах, я создал 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

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 все еще должен определить правильные цели automake (all, install и т.д.), так что в вашем случае вам также необходимо добавить GNUmakefile в проекте subdir вроде:

include Makefile
INSTALL:

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


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

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

LIBRARIES = modules/libfoo/libfoo.a

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

# and possibly some...
EXTRA_DIST = # ...
Другие вопросы по тегам