OSDev

для всех
Текущее время: 29 мар 2024, 02:59

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Makefile
СообщениеДобавлено: 26 сен 2019, 14:05 

Зарегистрирован: 26 янв 2019, 14:00
Сообщения: 34
Добрый день! Хочу автоматизировать процесс компиляции программ пользовательского пространства, но что-то не могу сообразить как. Может есть у кого готовое решение этой задачи? Поделитесь пожалуйста.
Код:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Makefile
СообщениеДобавлено: 26 сен 2019, 20:12 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Что значит автоматизировать?
Для начала можно прописать зависимости, чтобы файлы компилировались только при изменениях.
Код:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Makefile
СообщениеДобавлено: 27 сен 2019, 08:20 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Кстати говоря, сейчас вроде б от классического make постепенно переходят на cmake...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Makefile
СообщениеДобавлено: 27 сен 2019, 11:34 

Зарегистрирован: 26 янв 2019, 14:00
Сообщения: 34
Himik писал(а):
Что значит автоматизировать?
Для начала можно прописать зависимости, чтобы файлы компилировались только при изменениях.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Makefile
СообщениеДобавлено: 27 сен 2019, 16:33 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Да, так прописывать каждый файл не рационально. Есть способ, как прописать имена простым списком.
Код:
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. Пути можно убирать или добавлять.
Здесь я прописал линковку всех объектников в один бинарник.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Makefile
СообщениеДобавлено: 27 сен 2019, 16:52 

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Makefile
СообщениеДобавлено: 27 сен 2019, 18:10 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Просто пропишите команду линковки сразу после команды компиляции. Количество команд не ограничено одной строкой, где стоит компиляция - можно прописать несколько строк, выполняющих разную работу, включая системные команды и команды интерпретатора.
Или не используйте отдельную компиляцию с опцией -c. gcc может выдать собранный бинарник одной командой.
Дополнительные опции линковки можно передать через -Wl,,,, ставя между запятыми ключи и параметры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Makefile
СообщениеДобавлено: 19 окт 2019, 12:16 
Аватара пользователя

Зарегистрирован: 15 дек 2015, 11:12
Сообщения: 15
Himik писал(а):
Да, так прописывать каждый файл не рационально. Есть способ, как прописать имена простым списком.

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


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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB