Перейти к содержанию
    

makefile для получения нескольких разных бинарников

Здравствуйте.

Подскажите или натолкните на мысль.

Есть набор исходников, который предназначен для нескольких проектов.

Разница между проектами с точки зрения исходников в одном лишь define.

Хотелось бы иметь такой makefile который собирает из одного и того же набора исходников

бинарники для нескольких проектом, и сам для каждого проекта меняет этот define.

А также раскладывает бинарники  по разным папкам. Для каждого бинарника своя папка и свое имя бинарника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

makefile это своего рода программа. Я бы вызывал make с параметром CONFIG=XXX и в зависимости от значения CONFIG формировал разные ключи компиляции и директорию куда компилировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/30/2023 at 1:10 PM, VladislavS said:

makefile это своего рода программа. Я бы вызывал make с параметром CONFIG=XXX и в зависимости от значения CONFIG формировал разные ключи компиляции и директорию куда компилировать.

Вы имеете ввиду ключик передавать ? 

Или прямо в самом makefile ручками править CONFIG=XXX ?

Не удобно.

Хотелось бы просто make all и он дальше все сам сделал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, dimka76 said:

Подскажите или натолкните на мысль.

Посмотреть, как строятся цели debug и release. По-сути, ТСу нужно то же самое. У компиляторов есть опция командной строки, аналогичная #define в тексте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/30/2023 at 1:50 PM, tonyk_av said:

Посмотреть, как строятся цели debug и release. По-сути, ТСу нужно то же самое. У компиляторов есть опция командной строки, аналогичная #define в тексте.

Про опции я знаю. Обычно debug и relase передается аргументом для make либо вообще два отдельных makefile.

Я ничего похожего на мои хотелки не нашел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделать два makefile. В одном вся компиляция, во втором вызов make с первым и нужными параметрами. Примерно так:

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 minutes ago, dimka76 said:

Обычно debug и relase передается аргументом для make

Этот аргумент определяет название цели, которую выполняет make. Порядок действий и опции для каждой цели свои, поэтому я и говорю посмотреть на них.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/30/2023 at 2:19 PM, Сергей Борщ said:

Сделать два makefile. В одном вся компиляция, во втором вызов make с первым и нужными параметрами. Примерно так:

Спасибо ! Хорошая идея. Попробую.

On 3/30/2023 at 2:27 PM, tonyk_av said:

Этот аргумент определяет название цели, которую выполняет make. Порядок действий и опции для каждой цели свои, поэтому я и говорю посмотреть на них.

ОК. Мне вариант @Сергей Борщ понравился

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цели all и clean:

# Это комментарий, который говорит, что переменная CC указывает компилятор, используемый для сборки
CC=g++
#Это еще один комментарий. Он поясняет, что в переменной CFLAGS лежат флаги, которые передаются компилятору
CFLAGS=-c -Wall

all: hello

hello: main.o factorial.o hello.o
	$(CC) main.o factorial.o hello.o -o hello

main.o: main.cpp
	$(CC) $(CFLAGS) main.cpp

factorial.o: factorial.cpp
	$(CC) $(CFLAGS) factorial.cpp

hello.o: hello.cpp
	$(CC) $(CFLAGS) hello.cpp

clean:
	rm -rf *.o hello

 

2 minutes ago, dimka76 said:

Хорошая идея

Можно и так, то как-то принято делать один makefile, в котором прописывают разные цели и пути их достижения. Нет смысла делать несколько файлов, когда все цели можно просто описать в одном файле.

Кстати, в случае ТС разные цели просто установят разные значения для переменных скрипта, а вызовы компилятора и прочих утилит будут одними и теми же с одними и теми же переменными. Мне бы было лень править два почти одинаковых makefile.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде в целом получается, но с деталями беда.

Написал такой makefile

PROJECT_DI = di_bootloader
OUTDIR_DI = release_di
DEFS_MOD_DI = -DMOD_NAME_STRING_CMP=\"Di_32\"

.PHONY : all
all: build_di
	
build_di:
	make PROJECT=$(PROJECT_DI) OUTDIR=$(OUTDIR_DI) DEFS_MOD=$(DEFS_MOD_DI) -f makefile_all.mk

Но строка \"Di_32\" не хочет передаваться как надо.

Вот так в итоге вызывается компилятор

Compiling: ./Src/bootloader_client.c
arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -gdwarf-2 -MD -MP -MF release_di/dep/bootloader_client.o.d -I./ -I. -I../ -IInc 
-DMOD_NAME_STRING_CMP="Di_32" ......

Но в итоге компилятор выдает ошибку

<command-line>: error: 'Di_32' undeclared (first use in this function)
./Src/bootloader_client.c:215:43: note: in expansion of macro 'MOD_NAME_STRING_CMP'
  215 |  res = strncmp((char*)p_tbl->module_name, MOD_NAME_STRING_CMP, MOD_NAME_LEN_MAX);
      |                                           ^~~~~~~~~~~~~~~~~~~
<command-line>: note: each undeclared identifier is reported only once for each function it appears in
./Src/bootloader_client.c:215:43: note: in expansion of macro 'MOD_NAME_STRING_CMP'
  215 |  res = strncmp((char*)p_tbl->module_name, MOD_NAME_STRING_CMP, MOD_NAME_LEN_MAX);
      |                                           ^~~~~~~~~~~~~~~~~~~

Что я делаю не так ?

Мажет  @Сергей Борщ  подскажет как главный спец по GCC и make ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не уверен, но попробуйте  

DEFS_MOD_DI = -DMOD_NAME_STRING_CMP='"Di_32"'

И я совсем не спец. Чуть что - сразу гуглить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/30/2023 at 4:02 PM, Сергей Борщ said:

Я не уверен, но попробуйте  

DEFS_MOD_DI = -DMOD_NAME_STRING_CMP='"Di_32"'

И я совсем не спец. Чуть что - сразу гуглить

Я методом научного тыка победил его 

DEFS_MOD_DI = -DMOD_NAME_STRING_CMP="\\\"Di_32\\\""

Надо чтобы в итоге компилятору передавалось

arm-none-eabi-gcc -DMOD_NAME_STRING_CMP=\"Di_32\" далее все остальны ключи

Еще один неприятный момент.

Начало вылезать 


make[1]: Entering directory ...
make[1]: Leaving directory ...

 

On 3/30/2023 at 4:09 PM, dimka76 said:

Еще один неприятный момент.

Начало вылезать 


make[1]: Entering directory ...
make[1]: Leaving directory ...

 

Надо вызывать make с ключом --no-print-directory , чтобы эти сообщения не появлялись

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вот так делаю:

1. В начале makefile задаю вариант:

    TARGET	= my-super-device


# program variant (VAR1, VAR2, DEBUG, VAR3)
    APP_VARIANT  ?= VAR1
    

Затем передаю этот вариант компилятору в виде дефайна:

ifeq ($(APP_VARIANT),VAR1)
	DEFS		+= -DVAR1
else ifeq ($(APP_VARIANT),VAR2)
	DEFS		+= -DVAR2
else
$(error "bad app variant")
endif

Далее формирую имя цели и путь к объектным файлам (разные пути для разных вариантов, чтобы не смешивались объектники от разных вариантов):

	TARGET      := $(TARGET)-$(SENSOR_VARIANT)-v-$(VER_MAJOR)-$(VER_MINOR)

# dirs
	SRCDIR      = src
	OBJDIR      = obj/$(SENSOR_VARIANT)

И, наконец, формирую цель variants, для сборки всех вариантов:

.PHONY: all dirs build clean program protect reset discovery defines variants

MAKEFLAGS += --no-print-directory

all : 
	@echo --- building $(TARGET). defines: $(DEFS)
	$(MAKE) dirs
	$(MAKE) $(ELF)
	$(MAKE) $(HEX)
	$(MAKE) $(LSS)
	$(SIZE) $(ELF)
	@echo "Errors: none"

variants:
	$(MAKE) build APP_VARIANT=VAR1
	$(MAKE) build APP_VARIANT=VAR2
	$(MAKE) build APP_VARIANT=VAR3
    ...

Разработка идёт на варианте по умолчанию (VAR1 в примере), а при необходимости я командой `make variants` собираю сразу все варианты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/1/2023 at 4:47 PM, AHTOXA said:

Я вот так делаю:

Спасибо !

Тоже интересно.

А вы не могли бы выложить весь makefile целиком ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, dimka76 сказал:

А вы не могли бы выложить весь makefile целиком ?

Держите: makefile

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...