OSDev http://osdev.su/ |
|
Makefile http://osdev.su/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/ |