OSDev
http://osdev.ru/

Makefile
http://osdev.ru/viewtopic.php?f=6&t=3885
Страница 1 из 1

Автор:  Sebt [ 26 сен 2019, 14:05 ]
Заголовок сообщения:  Makefile

Добрый день! Хочу автоматизировать процесс компиляции программ пользовательского пространства, но что-то не могу сообразить как. Может есть у кого готовое решение этой задачи? Поделитесь пожалуйста.
Код:
all:
   i686-elf-gcc -c init.c -o init.o -ffreestanding -O2 -Wall -Wextra
   i686-elf-gcc -T link.ld -o init -ffreestanding -O2 -nostdlib init.o  -lgcc

   i686-elf-gcc -c 2.c -o 2.o -ffreestanding -O2 -Wall -Wextra
   i686-elf-gcc -T link.ld -o 2 -ffreestanding -O2 -nostdlib 2.o  -lgcc

Автор:  Himik [ 26 сен 2019, 20:12 ]
Заголовок сообщения:  Re: Makefile

Что значит автоматизировать?
Для начала можно прописать зависимости, чтобы файлы компилировались только при изменениях.
Код:
all: init 2

init: init.o
    i686-elf-gcc -T link.ld -o init -ffreestanding -O2 -nostdlib init.o  -lgcc
init.o: init.c
    i686-elf-gcc -c init.c -o init.o -ffreestanding -O2 -Wall -Wextra
2: 2.o init
    i686-elf-gcc -T link.ld -o 2 -ffreestanding -O2 -nostdlib 2.o  -lgcc
2.o: 2.c
    i686-elf-gcc -c 2.c -o 2.o -ffreestanding -O2 -Wall -Wextra

Автор:  SII [ 27 сен 2019, 08:20 ]
Заголовок сообщения:  Re: Makefile

Кстати говоря, сейчас вроде б от классического make постепенно переходят на cmake...

Автор:  Sebt [ 27 сен 2019, 11:34 ]
Заголовок сообщения:  Re: Makefile

Himik писал(а):
Что значит автоматизировать?
Для начала можно прописать зависимости, чтобы файлы компилировались только при изменениях.

Подразумеваю под автоматизацией отказ от ввода каждого нового файла. В примере что я представил файлы init.c и 2.c. Каждый раз прописывать так новый файл, как то не рационально я считаю.

По счет cmake спасибо за наводку, поищу на досуге.

Автор:  Himik [ 27 сен 2019, 16:33 ]
Заголовок сообщения:  Re: Makefile

Да, так прописывать каждый файл не рационально. Есть способ, как прописать имена простым списком.
Код:
HEADERS=$(wildcard source/include/*.h)
OBJECTS1 = \
    build/init.o \
    build/run.o \
    build/resource.o

all: build/init

vpath %.c source

build/init: $(OBJECTS1)
    i686-elf-gcc -T link.ld -ffreestanding -O2 -nostdlib -lgcc -o $@ $(OBJECTS1)
build/%.o : %.c $(HEADERS)
    i686-elf-gcc -c -ffreestanding -O2 -Wall -Wextra -o $@ $<

Предполагается, что .c находятся в поддиректории source, а скомпилированные файлы запишутся в build. Пути можно убирать или добавлять.
Здесь я прописал линковку всех объектников в один бинарник.

Автор:  Sebt [ 27 сен 2019, 16:52 ]
Заголовок сообщения:  Re: Makefile

Himik писал(а):
Предполагается, что .c находятся в поддиректории source, а скомпилированные файлы запишутся в build. Пути можно убирать или добавлять.
Здесь я прописал линковку всех объектников в один бинарник.

Спасибо за ответ, примерно так я компилируются ядро, собирая в один бинарник. А как быть если я собираю каждый в отдельности? Я поэтому в примере указал Makefile который собирает в два разных бинарника.

Добавлено. Линковщик в данном случае указывает адрес начала бинарника и стандартную библиотеку. Может этот подход не рациональный?

Автор:  Himik [ 27 сен 2019, 18:10 ]
Заголовок сообщения:  Re: Makefile

Просто пропишите команду линковки сразу после команды компиляции. Количество команд не ограничено одной строкой, где стоит компиляция - можно прописать несколько строк, выполняющих разную работу, включая системные команды и команды интерпретатора.
Или не используйте отдельную компиляцию с опцией -c. gcc может выдать собранный бинарник одной командой.
Дополнительные опции линковки можно передать через -Wl,,,, ставя между запятыми ключи и параметры.

Автор:  TechnoWiz@rd [ 19 окт 2019, 12:16 ]
Заголовок сообщения:  Re: Makefile

Himik писал(а):
Да, так прописывать каждый файл не рационально. Есть способ, как прописать имена простым списком.

Предполагается, что .c находятся в поддиректории source, а скомпилированные файлы запишутся в build. Пути можно убирать или добавлять.
Здесь я прописал линковку всех объектников в один бинарник.


Можно еще так сделать:

SOURCES = $(wildcard sources/*.c)
OBJECTS = $(SOURCES:.c=.o)

В таком случае список объектов будет формироваться из списка файлов *.c в директории sources. Это исключит необходимость вбивать обжекты вручную.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/