Автоинструменты и вложенный проект с обычным 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 ответ
К сожалению, вы не можете достичь этого правильно без:
- Модификация / замена восходящего Makefile,
- Добавление ваших собственных правил 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 = # ...