Tiny C Compiler
-
nsvad, А чем эта версия не устроила?
не умеет компилить Колибри бинарники
Небольшое предисловие: с Си и процессом сборки знаком не очень близко, но кое-как со скрипом получается. Решил попрактиковаться, но под Windows изобретать особо нечего. А вот в KolibriOS можно совместить приятное с полезным, и, может быть, что-нибудь удастся довести до ума и представить сообществу.
Быстрого старта, увы, не получилось, хоть и прошелся по всем мануалам, которые смог найти. Процесс сборки с помощью gcc испугал своей сложностью, поэтому решил попробовать tcc. Собирал по этой инструкции - такое впечатление, что она устарела. В процессе возникла пара проблем вместо обещаных tcc и библиотек к нему "в два клика", но обо всём по порядку.
1) Сперва была ошибка, не нашлась ф-ция WinMain@16. Глянул tcc.c, ф-ции main нет, зато есть app_main. Переименовал её в main, вроде собралось (http://prntscr.com/9zb0wn). Сделал правильно, или надо переделать?
2) Далее build.bat. Сначала выдал какую-то совсем страшную ошибку (увы, не запомнил). Заглянул внутрь, поправил CC=GCC, к CFLAGS добавил -m32 на всякий пожарный (у меня TDM-GCC-64), снова что-то не собралось. Ещё раз пригляделся, добавил AR=AR, ASM=FASM (скачал с сайта самую свежую версию, положил в C:\fasm, добавил в PATH). Вроде что-то собралось с кучей warning'ов, но melibc.a и start\start.o, упомянутых в инструкции, не появилось (UPD: start.o без проблем собрался из start.asm, а вот melibc.a по прежнему нет). Вот здесь я и затормозился. Что посоветуете?
Bat выглядит так:
Результат - так (всё не поместилось на экране, но при беглом просмотре error'ов не вижу, только warning'и).
Заранее спасибо.
Быстрого старта, увы, не получилось, хоть и прошелся по всем мануалам, которые смог найти. Процесс сборки с помощью gcc испугал своей сложностью, поэтому решил попробовать tcc. Собирал по этой инструкции - такое впечатление, что она устарела. В процессе возникла пара проблем вместо обещаных tcc и библиотек к нему "в два клика", но обо всём по порядку.
1) Сперва была ошибка, не нашлась ф-ция WinMain@16. Глянул tcc.c, ф-ции main нет, зато есть app_main. Переименовал её в main, вроде собралось (http://prntscr.com/9zb0wn). Сделал правильно, или надо переделать?
2) Далее build.bat. Сначала выдал какую-то совсем страшную ошибку (увы, не запомнил). Заглянул внутрь, поправил CC=GCC, к CFLAGS добавил -m32 на всякий пожарный (у меня TDM-GCC-64), снова что-то не собралось. Ещё раз пригляделся, добавил AR=AR, ASM=FASM (скачал с сайта самую свежую версию, положил в C:\fasm, добавил в PATH). Вроде что-то собралось с кучей warning'ов, но melibc.a и start\start.o, упомянутых в инструкции, не появилось (UPD: start.o без проблем собрался из start.asm, а вот melibc.a по прежнему нет). Вот здесь я и затормозился. Что посоветуете?
Bat выглядит так:
Spoiler:
Code: Select all
@echo off
echo ####################################################
echo # Melibc builder #
echo # usage: build [clean] #
echo ####################################################
rem #### CONFIG SECTION ####
set LIBNAME=libck.a
set INCLUDE=include
set CC=GCC
set CFLAGS=-c -nostdinc -DGNUC -I"%cd%\%INCLUDE%" -m32
set AR=AR
set ASM=FASM
set dirs=stdio memory kolibrisys string stdlib
rem #### END OF CONFIG SECTION ####
set objs=
set target=%1
if not "%1"=="clean" set target=all
set INCLUDE="%cd%"
call :Target_%target%
if ERRORLEVEL 0 goto Exit_OK
echo Probably at runing has been created error
echo For help send a report...
pause
goto :eof
:Compile_C
%CC% %CFLAGS% %1 -o "%~dpn1.o"
if not %errorlevel%==0 goto Error_Failed
set objs=%objs% "%~dpn1.o"
goto :eof
:Compile_Asm
%ASM% %1 "%~dpn1.o"
if not %errorlevel%==0 goto Error_Failed
set objs=%objs% "%~dpn1.o"
goto :eof
:Target_clean
echo cleaning ...
for %%a in (%dirs%) do del /Q "%%a\*.o"
goto :Exit_OK
:Target_all
echo building all ...
for %%a in (%dirs%) do (
for %%f in ("%%a\*.asm") do call :Compile_Asm "%%f"
for %%f in ("%%a\*.c") do call :Compile_C "%%f"
)
%AR% -ru %LIBNAME% %objs%
if not %errorlevel%==0 goto Error_Failed
goto Exit_OK
:Error_Failed
echo error: execution failed
pause
exit 1
:Exit_OK
echo ####################################################
echo # All operations has been done... #
echo # For cleaning run this script with param " clean" #
echo ####################################################
pause
exit 0
Заранее спасибо.
Бери msvc.Konstantin wrote:Процесс сборки с помощью gcc испугал своей сложностью
Сделаем мир лучше!
Спасибо за ответ.
Вообще-то, я привык работать с Code::Blocks, но поставить msvc чисто для компиляции под KolibriOS - не такая уж большая проблема (хотя предпочтительнее было бы остаться в C::B). У меня есть пара статических библиотек без внешних зависимостей (кроме стандартной библиотеки, которая, вроде бы, портирована), уже оформленных в виде проекта C::B. GCC делает из них %libname%.a файлы (могу заюзать и объектные .o, возникающие в процессе), но поймет ли их компилятор ms? Или надо сразу им собирать из C::B, а потом уже линковать к проекту VS? Или совсем никак без переноса в VS? Библиотеки написаны в c99, и изначально задумывалось собирать их вместе с основным приложением средствами tcc. Если есть не очень сложный способ настроить gcc в C::B так, чтобы он выплёвывал без лишних плясок с бубном готовый kos бинарник, я буду только рад (хватит и ссылки на неустаревшую пошаговую инструкцию: что для этого надо сделать с gcc, какие аргументы ему передавать в командной строке, откуда взять и куда положить относительно компилятора всякие библиотеки и прочие инструменты, необходимые для компиляции под kos).
Вообще-то, я привык работать с Code::Blocks, но поставить msvc чисто для компиляции под KolibriOS - не такая уж большая проблема (хотя предпочтительнее было бы остаться в C::B). У меня есть пара статических библиотек без внешних зависимостей (кроме стандартной библиотеки, которая, вроде бы, портирована), уже оформленных в виде проекта C::B. GCC делает из них %libname%.a файлы (могу заюзать и объектные .o, возникающие в процессе), но поймет ли их компилятор ms? Или надо сразу им собирать из C::B, а потом уже линковать к проекту VS? Или совсем никак без переноса в VS? Библиотеки написаны в c99, и изначально задумывалось собирать их вместе с основным приложением средствами tcc. Если есть не очень сложный способ настроить gcc в C::B так, чтобы он выплёвывал без лишних плясок с бубном готовый kos бинарник, я буду только рад (хватит и ссылки на неустаревшую пошаговую инструкцию: что для этого надо сделать с gcc, какие аргументы ему передавать в командной строке, откуда взять и куда положить относительно компилятора всякие библиотеки и прочие инструменты, необходимые для компиляции под kos).
Гарантированно актуальная информация - в http://websvn.kolibrios.org/filedetails ... se_gcc.lua + на выбор, http://websvn.kolibrios.org/filedetails ... etlibc.lua либо http://websvn.kolibrios.org/filedetails ... newlib.lua . Это инструкции для автосборщика, поэтому они совершенно точно работают, но могут быть не совсем очевидны для интерпретации.
lib-файлы можно найти на http://builds.kolibrios.org/eng/data/
lib-файлы можно найти на http://builds.kolibrios.org/eng/data/
Сделаем мир лучше!
Портировал новую версию 0.9.26 с гитхаба, заодно поисправлял ошибок в libc.
В целом все свои тесты компилятор проходит, хотя libc еще требует доработки.
Очень хорошая совместимость с gcc на уровне исходных текстов (расширения, встроенный асм).
В архиве родной компилятор для KOS и кросс компилятор под Win32.
Для работы под KOS пока нужно чтобы .с файлы были в корневом каталоге tcc или указывать путь ключом -B.
Использование стандартной библиотеки> ktcc hello.c -lck
Сообщения об ошибках компилятор пишет только на debugboard!
Версия обновлена 10-jun-16
Добавлены примеры
Версия обновлена 07-oct-16
Исправлен argc, вывод ошибок теперь на консоль, kos версия собрана gcc 5.4, требует libc.dll
В целом все свои тесты компилятор проходит, хотя libc еще требует доработки.
Очень хорошая совместимость с gcc на уровне исходных текстов (расширения, встроенный асм).
В архиве родной компилятор для KOS и кросс компилятор под Win32.
Для работы под KOS пока нужно чтобы .с файлы были в корневом каталоге tcc или указывать путь ключом -B.
Использование стандартной библиотеки> ktcc hello.c -lck
Сообщения об ошибках компилятор пишет только на debugboard!
Версия обновлена 10-jun-16
Добавлены примеры
Версия обновлена 07-oct-16
Исправлен argc, вывод ошибок теперь на консоль, kos версия собрана gcc 5.4, требует libc.dll
- Attachments
-
-
ktcc_26_161007.zip (261.69 KiB)Downloaded 480 times
-
Last edited by Siemargl on Fri Oct 07, 2016 12:29 pm, edited 10 times in total.
Тоесть можно пробовать повторять сборку программ написанных с использованием GCC под самой КолибриОС? Если что, то binutils портирован ранее, и линковщик есть.
to infinity and beyond
Линкер в tinycc встроенный, необходимости в "родных" binutils я не вижу.punk_joker wrote:Тоесть можно пробовать повторять сборку программ написанных с использованием GCC под самой КолибриОС? Если что, то binutils портирован ранее, и линковщик есть.
Есть свой библиотекарь tiny_libmaker.c (не проверял).
Я вижу применение tcc в трех ипостасях:
-как учебную платформу
-для маленьких утилит, с маленькой libc небольшой и исполняемый файл (можно еще урезать, сделав версию без плавающей точки)
-как родной компилятор на время отладки, т.к кросс компиляция неудобна
Окончательный же код, лучше генерировать gcc, поскольку оптимизатора в tcc нет совсем.
P.S.Если функций в libc будет не хватать, пишите или добавьте сами. Я планирую добавить консольный ввод/вывод, scanf (уже и перезалил в пост выше) и ревизовать всю libc на предмет тривиальных ошибок.
Выполнено. Большинство тестов проходит, отклонения описаны в readme и подробнее по исходникам libc
Добавлена опция -stack=size, позволяющая увеличить со стандартного размера 4096.
Добавлена маленькая ф-ция tiny_sprintf. Теперь результирующий минимальный бинарник с ней < 2Kb.
Версия обновлена в посте выше.
Отличная новость!
На СВН залито?
На СВН залито?
Из хаоса в космос
Да. Есть недолитые последние мелкие изменения, но они пока несущественны.Leency wrote:Отличная новость!
На СВН залито?
Бинарная версия компилятора выше по посту обновляется регулярно. Работает стабильно, все тесты что были, пройдены.
Есть неудобство - если С-строка исходников длинная, то при переходе на нее MTDBG пытается отрисовать команду jmp *very very long c source code string* и она не влезает в окно кода, портя окно регистров и может приводить к вылетанию MTDBG. Надо его фиксить, м.б сдвинуть заодно колонку ассемблера влево.
Ну и не все строки попадают в отладочную инфу - пока думаю добавить номер строки в исходнике. Или имяфайла: номер строки. Но места мало, см пред пункт.
MTDBG не приспособлен пока показывать многострочные символьные строки. Приходится урезать показываемый исходник.
Для локальных переменных нет показываемых символов. Здесь простого решения нет - затрагивается и генерация отладочной инфы в компиляторе и MTDBG не умеет динамически подгружать символы. I wont fix. Приходится считать байты от стандартного стек фрейма.
И наверное надо выводить ошибки не на доску отладки на в консоль. Изменение элементарное.
Еще бы удобный редактор был в Колибри и можно было бы обходится без кросс компиляции в простых случаях. И очень мешает системный баг (http://bugs.kolibrios.org/view.php?id=111) в клипборде - редакторы тоже из-за него вылетают.
Есть над чем поработать еще.
Да миниутилиту напиши, которая в отладочном файле строки подрежет)
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
Я писал генерацию .dbg файла, зачем мне утилита? =)
Просто одну и ту же строку требуется показывать разной длины как адрес в коде и как операнд jmp.
Просто одну и ту же строку требуется показывать разной длины как адрес в коде и как операнд jmp.
Siemargl
Нужно добавить в автосборку в ISO версию /kolibrios/develop/ktcc
Сможешь?
Нужно добавить в автосборку в ISO версию /kolibrios/develop/ktcc
Сможешь?
Из хаоса в космос
Who is online
Users browsing this forum: No registered users and 1 guest