Как подключить make-файлы для двух папок / проектов, которые должны запускаться как вместе, так и независимо - PullRequest
0 голосов
/ 04 марта 2019

У меня следующая проблема: у меня есть одна папка, скажем, / trunk / modules / mymodule, которая содержит мой проект, который я должен собрать, используя систему сборки, и у меня есть папка / trunk / libs / mylib с собственным .cpp и.h файлы.

Мой модуль должен будет использовать библиотеку, которую я создаю в / libs / mylib, но эта библиотека также будет использоваться другими проектами.Поэтому я хочу, чтобы всякий раз, когда я строю свой проект, я также проверял, обновлена ​​ли библиотека (и перестраиваем, если есть изменения), но я хочу, чтобы make-файлы в библиотеке могли запускаться независимо, так что кто-то может просто обновить библиотеку илииспользуйте его с другим модулем.

У меня есть 2 Makefiles.in, я соединяю их, вызывая include ../../lib/mylib/Makefile в первом и использую -L тот же путь -lmylib при компоновкемой проект, который также будет .so библиотекой.

Я логически получаю warning: overriding recipe for target 'distclean' и

warning: overriding recipe for target 'clean'

для clean и make distclean, которые определены в обоих make-файлах.

Как мне обойти это?И возможно ли это вообще?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Нерекурсивный способ: если вы управляете всеми make-файлами и можете полностью их перезаписать, то я бы посоветовал вам взглянуть на https://github.com/igagis/prorab

Это позволяет иметь независимые make-файлы для соседних проектов, а также включать одинmakefile в другой и добавление зависимости компиляции.См. Здесь описание того, как это делается: https://github.com/igagis/prorab/blob/master/wiki/TutorialBasicConcepts.md#including-other-makefiles

По сути, вы добавляете зависимость вашего исполняемого файла от некоторого libmylib.so, а также включаете make-файл, который создает эту библиотеку.

0 голосов
/ 04 марта 2019

Вместо включения файла вашей библиотеки Makefile lib/mylib/Makefile вы можете использовать рекурсивный MAKE, запустив

$(MAKE) -C ../../lib/mylib/Makefile

из Makefile вашего основного модуля modules/mymodule/Makefile.

Вы можете использовать аналогичные решения дляцели clean или distclean

Вы можете использовать фальшивую цель mylib следующим образом:

.PHONY: mylib all clean
LIBDIR=../../lib/mylib

all: mymodule

mymodule: mylib
        ...

mylib:
        $(MAKE) -C $(LIBDIR)

clean:
        $(MAKE) -C $(LIBDIR) $@
        ...

Примечание. Если вы копируете код из этого примера в Makefile,измените отступ, чтобы использовать табуляцию вместо пробелов.

Вы также можете рассмотреть возможность использования верхнего уровня Makefile в trunk, который рекурсивно вызывает make в lib/mylib и modules/mymodule.

См. Также https://www.gnu.org/software/make/manual/make.html#Recursion

Некоторые считают рекурсивное создание вредным, но это зависит от того, как именно вы его используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...