dimka76 61 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба Здравствуйте. Подскажите или натолкните на мысль. Есть набор исходников, который предназначен для нескольких проектов. Разница между проектами с точки зрения исходников в одном лишь define. Хотелось бы иметь такой makefile который собирает из одного и того же набора исходников бинарники для нескольких проектом, и сам для каждого проекта меняет этот define. А также раскладывает бинарники по разным папкам. Для каждого бинарника своя папка и свое имя бинарника. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба makefile это своего рода программа. Я бы вызывал make с параметром CONFIG=XXX и в зависимости от значения CONFIG формировал разные ключи компиляции и директорию куда компилировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба On 3/30/2023 at 1:10 PM, VladislavS said: makefile это своего рода программа. Я бы вызывал make с параметром CONFIG=XXX и в зависимости от значения CONFIG формировал разные ключи компиляции и директорию куда компилировать. Вы имеете ввиду ключик передавать ? Или прямо в самом makefile ручками править CONFIG=XXX ? Не удобно. Хотелось бы просто make all и он дальше все сам сделал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 1 hour ago, dimka76 said: Подскажите или натолкните на мысль. Посмотреть, как строятся цели debug и release. По-сути, ТСу нужно то же самое. У компиляторов есть опция командной строки, аналогичная #define в тексте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба On 3/30/2023 at 1:50 PM, tonyk_av said: Посмотреть, как строятся цели debug и release. По-сути, ТСу нужно то же самое. У компиляторов есть опция командной строки, аналогичная #define в тексте. Про опции я знаю. Обычно debug и relase передается аргументом для make либо вообще два отдельных makefile. Я ничего похожего на мои хотелки не нашел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба Сделать два makefile. В одном вся компиляция, во втором вызов make с первым и нужными параметрами. Примерно так: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 27 minutes ago, dimka76 said: Обычно debug и relase передается аргументом для make Этот аргумент определяет название цели, которую выполняет make. Порядок действий и опции для каждой цели свои, поэтому я и говорю посмотреть на них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба On 3/30/2023 at 2:19 PM, Сергей Борщ said: Сделать два makefile. В одном вся компиляция, во втором вызов make с первым и нужными параметрами. Примерно так: Спасибо ! Хорошая идея. Попробую. On 3/30/2023 at 2:27 PM, tonyk_av said: Этот аргумент определяет название цели, которую выполняет make. Порядок действий и опции для каждой цели свои, поэтому я и говорю посмотреть на них. ОК. Мне вариант @Сергей Борщ понравился Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба Цели 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба Вроде в целом получается, но с деталями беда. Написал такой 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба Я не уверен, но попробуйте DEFS_MOD_DI = -DMOD_NAME_STRING_CMP='"Di_32"' И я совсем не спец. Чуть что - сразу гуглить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 30 марта, 2023 Опубликовано 30 марта, 2023 · Жалоба 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 , чтобы эти сообщения не появлялись Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 апреля, 2023 Опубликовано 1 апреля, 2023 · Жалоба Я вот так делаю: 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` собираю сразу все варианты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 1 апреля, 2023 Опубликовано 1 апреля, 2023 · Жалоба On 4/1/2023 at 4:47 PM, AHTOXA said: Я вот так делаю: Спасибо ! Тоже интересно. А вы не могли бы выложить весь makefile целиком ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 2 апреля, 2023 Опубликовано 2 апреля, 2023 · Жалоба 16 часов назад, dimka76 сказал: А вы не могли бы выложить весь makefile целиком ? Держите: makefile 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться