LINUX.ORG.RU

Как правильно разделить 2 типа сборки в Makefile

 


1

1

Сразу скажу, что да, знаю, что есть autotools, но хочу попробовать все же обойтись одним мейкфайлом.

Есть библиотека, которая собирается под arm и x86, выглядит это все примерно так:

INCLUDEPATH=-I./include -I$(SRCINCL) -I$(USRLIBS)

LIBS= -lpthread

MAIN_SRC= \
	./src/mylib.c \
	./src/impl_1.c

all: arm

arm: TARGET=arm
arm: CC=$(CC_ARM)
arm: buildinfo clean depends ${TARGET_LIB} test

x86-64: TARGET=linux
x86-64: CC=$(CC_LINUX)
x86-64: buildinfo clean depends ${TARGET_LIB} test

$(TARGET_LIB): $(MAIN_SRC:.c=.o)
	@echo linking: $@
	@ $(CC) ${LDFLAGS} ${LIBS} -Wl,-soname,$(LIB_NAME).so.$(MAJOR).$(MINOR) -o $@ $^ ./libs/other/libother.a
	@rm -f ./$(LIB_NAME).so
	@ln -s -f $@ ./$(LIB_NAME).so

$(MAIN_SRC:.c=.o): %.o:%.c
	@echo compile: "\t" $<" >>> "$@
	@ $(CC) $(INCLUDEPATH) $(CFLAGS_LIB) $(DEFINES)  $< -o $@

depends:
	@echo depends!
	@echo $(MAKE) $(TARGET)
	@cd libs/other && $(MAKE) $(TARGET)

Теперь мне нужно добавить новую цель target2, которая бы собирала так же как arm цель, но вместо ./src/impl_1.c использовала бы файл ./src/impl_2.c

Я тут наговнокодил так, но это все выглядит максимально плохо конечно…

INCLUDEPATH=-I./include -I$(SRCINCL) -I$(USRLIBS)

LIBS= -lpthread

MAIN_SRC= \
	./src/mylib.c

SRC_1= \
	./src/impl_1.c

SRC_2= \
	./src/impl_2.c

all: arm

arm: TARGET=arm
arm: CC=$(CC_ARM)
arm: buildinfo clean depends ${TARGET_LIB} test

target2: TARGET=arm
target2: CC=$(CC_ARM)
target2: buildinfo clean depends ${TARGET_LIB_2} test

x86-64: TARGET=linux
x86-64: CC=$(CC_LINUX)
x86-64: buildinfo clean depends ${TARGET_LIB} test

$(TARGET_LIB): $(MAIN_SRC:.c=.o) $(SRC_1:.c=.o)
	@echo linking: $@
	@ $(CC) ${LDFLAGS} ${LIBS} -Wl,-soname,$(LIB_NAME).so.$(MAJOR).$(MINOR) -o $@ $^ ./libs/other/libother.a
	@rm -f ./$(LIB_NAME).so
	@ln -s -f $@ ./$(LIB_NAME).so

$(TARGET_LIB_2): $(MAIN_SRC:.c=.o) $(SRC_2:.c=.o)
	@echo linking: $@
	@ $(CC) ${LDFLAGS} ${LIBS} -Wl,-soname,$(LIB_NAME).so.$(MAJOR).$(MINOR) -o $@ $^ ./libs/other/libother.a
	@rm -f ./$(LIB_NAME).so
	@ln -s -f $@ ./$(LIB_NAME).so

$(MAIN_SRC:.c=.o): %.o:%.c
	@echo compile: "\t" $<" >>> "$@
	@ $(CC) $(INCLUDEPATH) $(CFLAGS_LIB) $(DEFINES)  $< -o $@

$(SRC_1:.c=.o): %.o:%.c
	@echo compile: "\t" $<" >>> "$@
	@ $(CC) $(INCLUDEPATH) $(CFLAGS_LIB) $(DEFINES)  $< -o $@

$(SRC_2:.c=.o): %.o:%.c
	@echo compile: "\t" $<" >>> "$@
	@ $(CC) $(INCLUDEPATH) $(CFLAGS_LIB) $(DEFINES)  $< -o $@


depends:
	@echo depends!
	@echo $(MAKE) $(TARGET)
	@cd libs/other && $(MAKE) $(TARGET)

P.S. Я намерено многое выкинул из примера, не относящееся к сути.

# file: Makefile

# исходники
# общие
common_SRCS = a b
# для target1
target1_SRCS = ${common_SRCS} c
# для target2
target2_SRCS = ${common_SRCS} d

# подключаем target.mk
# для target1
TARGET := target1
include target.mk

# для target2
TARGET := target2
include target.mk

# это тестовый пример, не надо ругаться на отсутствующие файлы
.PHONY: a b c d
# file: target.mk

# общая логика для target

# Магия ${${TARGET}_SRCS} раскрывается в ${target1_SRCS}, который раскрывается ...

${TARGET}: ${${TARGET}_SRCS}
       	echo $@ srcs=$^

P.S. Писал в прямо здесь, возможны ошибки

anonymous ()

Легко в одном файле это делается

# TARGET = arm
# TARGET = x86_64
TARGET = arm_2

...
# всякие дефолтные и общие SRCS, LIBS, INCLUDES etc.
SRCS = a.c b.c
...

ifeq ($(TARGET),arm)
SRCS += c.c
LIBS += -L ./lib/arm
CC=$(CC_ARM)
endif

ifeq ($(TARGET),x86_64)
SRCS += d.c
LIBS += -L ./lib/x86_64
CC=$(CC_X86_64)
endif

ifeq ($(TARGET),arm_2)
SRCS += e.c
LIBS += -L ./lib/arm
CC=$(CC_ARM)
endif

# Далее твои правила сборки
...

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 3)
Ответ на: комментарий от Stanson

Легко в одном файле это делается

И как с твоим одним мейкфайлом собирать сразу несколько таргетов make target1 target2?

А отдельный файл нужен был для того, чтобы копипаст-программировнаием не заниматься или чтоб свои функции-генераторы не писать.

anonymous ()
Ответ на: комментарий от anonymous

И как с твоим одним мейкфайлом собирать сразу несколько таргетов make target1 target2

make TARGET=arm ; make TARGET=arm_2

например.

А отдельный файл нужен был для того, чтобы копипаст-программировнаием не заниматься или чтоб свои функции-генераторы не писать.

Так никакого копипаста и не будет, правила сборки ведь одни и те же для всех вариантов TARGET

Stanson ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.