LINUX.ORG.RU

Средства сборки на замену make

 


0

3

Главный критерий выбора, инструмент должен быть простым. То есть я не хочу связываться с cmake/autotools и подобными, проверка внешних зависимостей мне не нужна.

Собираю обычно мелкие проектики на C, и уже устал постоянно допиливать Makefile. Хочеться результат сборки положить в отдельную директорию, не так просто заставить make это делать. Разложить исходники по разным директориям, снова make сопротивляется. Ещё какие-то более мелкие проблемы (пересборка с новыми CFLAGS например).

Хотя подозреваю, что никакой подходящей замены не существует.

Добавка: впомнил про mk (p9port) и нашел aap, посмотрю.

★★

Хочеться результат сборки положить в отдельную директорию, не так просто заставить make это делать

положить предварительно мейкфайл в эту директорию, нэ?

Разложить исходники по разным директориям, снова make сопротивляется

аналогично

Ещё какие-то более мелкие проблемы (пересборка с новыми CFLAGS например).

новые CFLAGS берутся из файла? Пропиши его в зависимости

lazyklimm ★★★★★
()

в autotools ничего сложного нет, если один раз засесть и прочитать мануалы

Harald ★★★★★
()

Чем cmake-то не угодил? Для твоих задач хватит самого простого cmake-файла.

kulti ★★
()

Хочеться результат сборки положить в отдельную директорию, не так просто заставить make это делать.

Напиши правило по типу make install, пусть оно переносит результат сборки в нужный каталог, делов-то на 2 минуты.

Разложить исходники по разным директориям, снова make сопротивляется.

Как это? Не понял.

Ещё какие-то более мелкие проблемы (пересборка с новыми CFLAGS например).

И снова не понял. Обычно в CFLAGS вписываются все нужные флаги и...всё. Варианты тоже несложно сделать. Какие тут проблемы?

Да и вообще: что может быть проще make?

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

нэ, Makefile переписывать ещё надо.

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

Напиши правило по типу make install ...

Нет, цель была не засорять директории с исходниками перегенерируемыми файлами.

Как это? Не понял.

src/kernel/task.c
src/kernel/mutex.c
src/kernel/queue.c
src/hal/hbridge.c
src/hal/adc.c
src/hal/timer.c
src/app/main_task.c

Какие тут проблемы?

Сделать все можно, но громоздко и некравиво.

amaora ★★
() автор топика

Хочеться результат сборки положить в отдельную директорию, не так просто заставить make это делать. Разложить исходники по разным директориям, снова make сопротивляется.

Форменное 4.2 ☺

Глянь как это в *BSD реализовано. Например тут (проект сдох, но не в нём дело) или тут. Для linux'а есть пакет freebsd-make.

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

CMake

Нет, цель была не засорять директории с исходниками перегенерируемыми файлами.

И не будешь. Вообще, собирай в отдельном каталоге, например, build.

Chaser_Andrey ★★★★★
()

Собираю обычно мелкие проектики на C, и уже устал постоянно допиливать Makefile. Хочеться результат сборки положить в отдельную директорию, не так просто заставить make это делать. Разложить исходники по разным директориям, снова make сопротивляется. Ещё какие-то более мелкие проблемы (пересборка с новыми CFLAGS например).

ИМХО для тебя идеально make.

drBatty ★★
()

Хочеться результат сборки положить в отдельную директорию, не так просто заставить make это делать.

$ mkdir build
$ cd build
$ $(project_dir)/configure
$ make

Разложить исходники по разным директориям, снова make сопротивляется.

$ cat Makefile.am
prog_SOURCES = \
    prog.c \
    $(top_srcdir)/lib/a.c \
    $(top_srcdir)/test/b.c \
    ...

Ещё какие-то более мелкие проблемы (пересборка с новыми CFLAGS например).

make CFLAGS="..."
anonymous
()
Ответ на: комментарий от oami

Шевелится, но с ним намучаешься. Разработчики mypaint мучаются, например.

anonymous
()

cmake

</thread>

anonymous
()

А ничего, что в конце все равно make вызывать надо?

Ну, а чтобы руками Makefile не писать, есть cmake.

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

Вот есть набор исходников.

src/hal/r1/entry.s
src/ha/r1/abc.c
src/hal/sim/abc.c
src/rt/task.c
src/lib/list.c

Надо собирать все из hal/r1 rt lib кросс компилятором под arm (ещё дополнительно два варианта линковки). И надо собирать все из hal/sim rt lib хост компилятором. Позже могут появится r2 r3 и соответсвующие варианты сборки.

Как написать для этого короткий и красивый Makefile?

Сейчас копашусь вот с этим.


TARGET	= phobia
SIMULE	= sim

PREFIX	?= arm-none-eabi-

CC      = $(PREFIX)gcc
AS      = $(PREFIX)as
LD      = $(PREFIX)ld
OC      = $(PREFIX)objcopy
OD      = $(PREFIX)objdump
RM      = rm -f

CFLAGS  = -std=gnu99 -pipe -Wall -O2
CFLAGS  = -I../ -I../hal/
CFLAGS	+= -mcpu=cortex-m4 -mhard-float -mthumb
CFLAGS  += -fno-builtin
AFLAGS	= -mcpu=cortex-m4 -mthumb
LFLAGS  ?= -T ram.ld

HOST_CC		= gcc
HOST_CFLAGS	= -std=gnu99 -pipe -Wall -O2
HOST_LFLAGS	= 

TTY	= /dev/ttyUSB0

SRCDIR	= ..
DIRS	= $(hal/r1 lib rt)
OBJS	= $(sort \
		$(patsubst %.s, %.o, $(wildcard $(addsuffix /*.s, $(DIRS)))) \
		$(patsubst %.c, %.o, $(wildcard $(addsuffix /*.c, $(DIRS)))))

all: $(TARGET) $(SIMULE)

%.o: %.s
	@ echo "  AS    " $@
	@ $(AS) $(AFLAGS) -o $@ $<

%.o: %.c
	@ echo "  CC    " $@
	@ $(CC) -c $(CFLAGS) -MMD -o $@ $<

$(TARGET): $(OBJ)
	echo $(OBJS)
	@ echo "  LD    " $@
	@ $(LD) $(LFLAGS) -o $@ $^
	@ $(OC) -j .text -j .data -O binary $@

$(SIMULE): $(OBJ)
	@ echo "  LD    " $@
	@ $(LD) $(LFLAGS) -o $@ $^

tags: $(SRC)
	@ echo "  CTAGS "
	@ ctags --c-kinds=+px --fields=+Sn -R .
	@ cscope -b -k -f scope -R -s .

flash: $(TARGET)
	@ echo "  FLASH " $^
#	@ stmflasher -p $(TTY) -w $(TARGET) -v -g +0
	@ stmflasher -p $(TTY) -w $(TARGET) -Mr -S +0x1000 -v -g +0
	@ picocom -l -b 9600 $(TTY)

clean:
	@ echo "  CLEAN "
	@ $(RM) $(OBJ) $(TARGET)
	@ $(RM) $(patsubst %.o, %.d, $(OBJ))
	@ $(RM) tags scope

include $(wildcard *.d)

amaora ★★
() автор топика

jam, cook. Тысячи их. У меня как-то даже был свой лиспапед на тикле в каком-то из проектов...

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

Что-то jam оказался проще только для hello world. Даже отдельную директорию для сборки обозначить не понятно как.

amaora ★★
() автор топика

Вот если бы не лень и нежелание изучать что-то новое, ты бы не знал проблем с тем же CMake.

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

Тогда слабо понимаю, чем может помочь redo ТС'у. Он же более низкого уровня со своими тараканами, которые придется выискивать.

Впрочем, у нас в отделе кто-то им пользуется для запуска задач со сложными зависимостями.

anonymous
()

CMake, без вариантов. И проще тут некуда - простейший CMakeLists.txt будет состоять ровно из одной строки.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.