LINUX.ORG.RU

Makefile - исходный код в одной директории, результаты сборки - в другой.

 


4

3

Здравствуйте. Написал простенький Makefile. При его вызове все исходники из директории ./src собираются в файл ./bin/firmware.elf. Сейчас объектные файлы остаются в директории ./src. Что поправить, чтобы объектные файлы компилировались в ./bin ? Сейчас:

$ tree
.
├── bin
│   └── firmware.elf
├── Makefile
└── src
    ├── blink.c
    ├── blink.h
    ├── blink.o
    ├── main.c
    └── main.o
Хочу:
$ tree
.
├── bin
│   ├── firmware.elf
│   ├── blink.o
│   └── main.o
├── Makefile
└── src
    ├── blink.c
    ├── blink.h
    └── main.с
Makefile
TARGET	= firmware.elf
DEVICE  = msp430f5529

SRC_DIR = ./src
BIN_DIR = ./bin

# Каталог компилятора
GCC_DIR = ~/ti/gcc/bin
# Путь до компилятора и утилит
CC = $(GCC_DIR)/msp430-elf-gcc
SIZE = $(GCC_DIR)/msp430-elf-size
# Путь до программатора
MSPDEBUG = /usr/local/bin/mspdebug
# Путь до системных заголовочных файлов
SUPPORT_FILE_DIR = ~/ti/gcc/include

# Ключи компилятора
CFLAGS = -I $(SUPPORT_FILE_DIR) -mmcu=$(DEVICE) -O2 -g -fdata-sections -ffunction-sections -Wall -std=gnu99
# Ключи линкера
LFLAGS = -L $(SUPPORT_FILE_DIR) -T $(DEVICE).ld -Wl,-gc-sections

###############################################################################
.PHONY: clean

# Получаем списоки файлов
SRCS = $(wildcard $(SRC_DIR)/*.c)
OBJS 	= $(SRCS:.c=.o)

all: $(TARGET)
	$(SIZE) $(BIN_DIR)/$(TARGET)
	

$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) $(LFLAGS) -o $(BIN_DIR)/$(TARGET) $(OBJS) 
 
.c.o:
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	rm -rf $(BIN_DIR)/$(TARGET) $(OBJS) 

program: all
	$(MSPDEBUG) tilib "prog $(BIN_DIR)/$(TARGET) reset"

Трудно добавить имя директории с бинарями к именам объектников?

kachsheev ★★★
()
Ответ на: комментарий от Stil

Stil,

make: *** Нет правила для сборки цели «bin/./src/blink.o», требуемой для «firmware.elf».  Останов.
Вы хотели что-то вроде этого посоветовать?
-OBJS 	= $(SRCS:.c=.o)
+OBJS 	= $(patsubst $(SRC_DIR)/%.c,$(BIN_DIR)/%.o, $(SRCS))
Пробовал. Весь зтык в правиле
.c.o:
	$(CC) $(CFLAGS) -c $< -o $@
Оно вызовится для файла bin/blink.o, но не выполнится, т.к. bin/blink.с отсутствует (он же лежи в src/)!

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

Вы хотели что-то вроде этого посоветовать?

Да.

Оно вызовится для файла bin/blink.o, но не выполнится, т.к. bin/blink.с отсутствует (он же лежи в src/)!

Хм, ну да. Попробуй почитать это.

Stil ★★★★★
()
Ответ на: комментарий от arhiv_6

Правила сборки тоже нужно переписать, что-то вроде

_obj/%.cc.o : %.cc
    $(CPP) -std=c++11 -c ${CFLAGS} -o $@ $<

_obj/%.c.o : %.c
    $(CC) -std=c99 -c ${CFLAGS} -o $@ $<

у меня блобы лежат в директориях _obj в каждой директории с сорцами.

mashina ★★★★★
()

GCC только так и собирается

lovesan ★★
()

Рекомендую не перегружать Makefile, а поступить проще: взять unionfs-fuse.

Сорцы в RO-бранч, объектные и бинарные файлы в RW-бранч.

Удобно таким образом собирать одновременно для нескольких архитектур из одного source tree без копирований, симлинков и прочих автолулзов.

SystemD-hater
()
Ответ на: комментарий от sigurd

Зачем вносить бардак в сборку этими vpath-ами, если в objs можно повторить структуру файловой системы исходников?

objs
├── src
│   ├── internal
│   │   └── file.c.d
│   │   └── file.c.o
│   ├── main.c.d
│   └── main.c.o
└── tests
    ├── test1.c.d
    └── test1.c.o

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