Сборки из дерева с make-файлами и правилами статических шаблонов - PullRequest
9 голосов
/ 04 февраля 2011

Я работаю над некоммерческим встроенным кодом, который работает на ARM и, следовательно, имеет дело с различием между режимами ARM и THUMB.Текущая система сборки использует статические шаблонные правила, чтобы определить, компилировать ли файлы в режиме ARM или THUMB.

$(ACOBJS) : %.o : %.c
    @echo
    $(CC) -c $(CFLAGS) $(AOPT) -I . $(IINCDIR) $< -o $@
$(TCOBJS) : %.o : %.c
    @echo
    $(CC) -c $(CFLAGS) $(TOPT) -I . $(IINCDIR) $< -o $@

Где ACOBJS - это список выходных объектов, которые должны быть в режиме ARM и одинаковы для режимов TCOBJS и Thumb.Эти списки создаются из списка источников обычным образом

ACOBJS   = $(ACSRC:.c=.o)
TCOBJS   = $(TCSRC:.c=.o)

. В настоящее время это приводит к тому, что объектные файлы из сборки разбросаны по дереву исходного кода, чего я особенно не желаю.Я пытался настроить это для сборок из дерева, но не смог заставить это работать.Мне не обязательно полностью использовать работающие сборки дерева, но я хотел бы, по крайней мере, иметь возможность использовать выходной каталог, в который в конечном итоге попадают все промежуточные файлы.Какова наилучшая стратегия для достижения этой цели в этих ограничениях?

Один из вариантов, который я рассматриваю, - это использовать либо automake, либо весь набор инструментов autotools для создания make-файла.Казалось бы, это поддерживает создание типа make-файла, который я хочу, но кажется излишним.Кажется также, что между автоинструментами, которые предназначены для портативных сборок, и встроенными системами с «голым металлом», может существовать несоответствие импеданса.

Ответы [ 3 ]

3 голосов
/ 28 февраля 2011

Учитывая / если вы не заботитесь о переносимости и используете GNU make, вы можете использовать функцию VPATH :

  • Создайте каталог, в котором вы хотите выполнить сборку.
  • Создайте 'Makefile' в этом каталоге с (приблизительно) следующим содержимым:

    path_to_source = ..
    VPATH = $(path_to_source)
    include $(path_to_source)/Makefile
  • Измените переменную path_to_source так, чтобы она указывала на корень вашего исходного дерева.

Кроме того, вам, вероятно, нужно настроить исходный Makefile, чтобы убедиться, что он поддерживает сборку вне исходного кода. Например, вы не можете ссылаться на предварительные условия из ваших правил сборки и вместо этого должны использовать $ ^ и $ <. (См. <a href="http://www.gnu.org/software/make/manual/make.html#Recipes_002fSearch" rel="nofollow"> GNU make - Написание рецептов с поиском по каталогу ) Вам также может потребоваться изменить vpath-makefile. Например: добавление CFLAGS+=-I$(path_to_source) может быть полезным.

Также обратите внимание, что если файл находится как в исходном каталоге, так и в каталоге сборки, make будет использовать этот файл в каталоге сборки.

3 голосов
/ 22 февраля 2015

Это немного устарело, но я просто пытался сделать то же самое, что было первым попаданием в Google.Я подумал, что стоит поделиться другим подходом, поскольку ни один из ответов не удобен, если вы не используете автоинструменты и хотите иметь возможность встраивать в любой каталог с помощью одной команды, а затем просто удалить этот каталог.

ВотПример Makefile, который ссылается на файлы, относящиеся к каталогу, содержащему Makefile.

MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
MFD := $(MAKEFILE_DIR)

CXX=g++
CXXFLAGS=-std=c++14 -Wall -Wextra -pedantic -c

test: test.o adjacency_pointers_graph.o
    $(CXX) $^ -o $@

%.o: $(MFD)/%.cpp $(MFD)/adjacency_pointers_graph.h
    $(CXX) $(CXXFLAGS) $< -o $@

Затем выполнить сборку исходного кода:

mkdir build
cd build
make -f ../Makefile
1 голос
/ 07 февраля 2011

Вкл. automake

Если вы используете automake, вы в значительной степени используете все автоинструменты. automake не может работать без autoconf.

Makefile, сгенерированные automake, поддерживают сборки из исходного кода и кросс-компиляцию, поэтому вы сможете создавать подкаталоги arm/ и thumb/ и запускать ../configure --host=arm-host-prefix в arm/ и запустить ../configure --host=thumb-host-prefix в thumb/. (Я не знаю фактические кортежи хостов, которые вы использовали бы для каждого компилятора.)

Использование GNU make

Поскольку вы используете GNUMake, вы можете сделать что-то вроде этого:

ACOBJS := $(addprefix arm/,$(ACSRC:.c=.o))
TCOBJS := $(addprefix thumb/,$(TCSRC:.c=.o))

Используйте что-то вроде этого ответа , чтобы убедиться, что каталоги arm/ и thumb/ (и любые подкаталоги) существуют.

...