Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вс дек 17, 2017 4:59 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 14 сообщений ] 
Автор Сообщение
СообщениеДобавлено: Пн май 29, 2017 11:51 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Тема предназначена исключительно для новичков, типа меня.
Остальным же, прошу отнестись к ней максимально снизходительно.
Надеюсь, кому-нибудь поможет.
:)

Придлогаю, в этой теме выкладывать свои способы настройки окружения в GNU Linux: описание ключей, советы,
трюки и всё остальное, что будет полезно при разработке программ для Kolibri в GNU Linux.


Если допущены какие-нибудь ошибки, сообщайте. Исправлю.

Translation for English-speaking users.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Настройка окружения для компиляции программ на C, для Kolibri в Ubuntu 16.04.

Инструменты, которые будем использовать:
1. GCC v5.4.0 из Toolchain'a от Serge (x86_64-linux-kos32-5.4.0.7z).
2. SDK из Toolchain'a от Serge (sdk-28-10-16.7z).
3. SDK из SVN с libgcc.a и Newlib.
4. VirtualBox и флешка.
5. ISO образ ночной сборки Kolibri.

Установка необходимых инструментов.

Качаем и установливаем все необходимые инструменты. Все команды выполняются в терминале.

Порядок действий:
1. На всякий случай обновляем систему.
Код:
sudo apt update & sudo apt dist-upgrade

2. Переходим в папку Downloads. Туда будем качать все наши инструменты.
Код:
cd ~/Downloads

3. Качаем GCC и SDK из Toolchain'a от Serge.
Код:
wget ftp://ftp.kolibrios.org/users/Serge/new/Toolchain/x86_64-linux-kos32-5.4.0.7z && wget ftp://ftp.kolibrios.org/users/Serge/new/Toolchain/sdk-28-10-16.7z

4. Ставим "7zip" для распаковки архивов, если не установлен.
Код:
sudo apt install p7zip-full

5. Распаковываем всё выше скачанное.
Код:
7z x x86_64-linux-kos32-5.4.0.7z && 7z x sdk-28-10-16.7z

6. Копируем всё из папки "lib" в папку "win32/lib".
Код:
cp -R ./lib/* ./win32/lib

7. Ставим "subversion" для скачивания SDK с SVN.
Код:
sudo apt install subversion

8. Скачиваем папку SDK с SVN.
Код:
svn co svn://kolibrios.org/contrib/sdk sdk

9. Перемещаем папку SDK в папку win32.
Код:
mv ./sdk ./win32

10. Непонятно, почему папка с Linux'овыми инструментами для Kolibri, называется "win32". Поэтому, переименуем в "kos32".
Код:
mv ./win32 ./kos32

11. Перемещаем папку "kos32" в директорию "/usr/local".
Код:
sudo mv -R ./kos32 /usr/local

12. Выставляем права на папку "kos32".
Код:
sudo chmod -R u+rwx /usr/local/kos32 && chmod -R go-w /usr/local/kos32 && sudo chmod -R go+rx /usr/local/kos32

13. Чтобы была возможность использовать инструменты из папки "kos32/bin", надо прописать путь к папке с инструментами "/usr/local/kos32/bin", в переменную окружения "PATH", через двоеточие в файле "/etc/environment".
Код:
sudo nano /etc/environment
Изображение

Проверим, видит ли терминал инструменты в папке "kos32/bin". Вводим в терминал следующую строку:
Код:
kos32-gcc --version

Изображение

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

14. Для того, чтобы "kos32-gcc" мог компилировать, качаем, распаковываем и ставим библиотеку "libisl.so.10.2.2".
Код:
wget http://board.kolibrios.org/download/file.php?id=8301libisl.so.10.2.2.7z && 7z x file.php?id=8301libisl.so.10.2.2.7z
sudo mv libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu && sudo ln -s /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu/libisl.so.10
sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10 && sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2

15. Качаем и устанавливаем VirtualBox, если не установлен.
Код:
wget http://download.virtualbox.org/virtualbox/5.1.22/virtualbox-5.1_5.1.22-115126~Ubuntu~xenial_amd64.deb
sudo dpkg -i virtualbox-5.1_5.1.22-115126~Ubuntu~xenial_amd64.deb

16. Качаем и устанавливаем дополнение к VirtualBox, если не установлено.
Код:
wget http://download.virtualbox.org/virtualbox/5.1.22/Oracle_VM_VirtualBox_Extension_Pack-5.1.22-115126.vbox-extpack
virtualbox Oracle_VM_VirtualBox_Extension_Pack-5.1.22-115126.vbox-extpack

17. Всё. Инструменты установлены и готовы к использованию.

Настройка VirtualBox.

Переходим к настройке VirtualBox. Все команды выполняются в терминале.

Порядок действий:
1. Чтобы была видна флешка в VirtualBox, добавляем себя в группу "vboxusers". Список доступных групп можно посмотреть в "/etc/groups".
Код:
sudo usermod -a -G vboxusers $USER

2. Далее, надо перезагрузиться.
Код:
sudo reboot

3. Переходим в папку "Downloads". Туда будем качать ISO образ Kolibri.
Код:
cd ~/Downloads

4. Скачиваем архив с ISO образом Kolibri.На сервере, на момент написания статьи, была Kolibri "svn6912-iso.7z".
Код:
wget http://builds.kolibrios.org/rus/svn6912-iso.7z

5. Распаковываем архив с ISO образом Kolibri.
Код:
7z x svn6912-iso.7z

8. Создаём виртуальную машину для VirtualBox.

а) Создаём новую виртуальную машину с названием "KolibriOS".
Код:
VBoxManage createvm --name KolibriOS --ostype WindowsXP --register

б) Выставляем основные параметры.
Код:
VBoxManage modifyvm KolibriOS --memory 256 --vram 128 --cpus 1 --firmware bios --boot1 dvd --usb on --usbehci on --usbcardreader on
VBoxManage modifyvm KolibriOS --clipboard bidirectional --draganddrop bidirectional

в) Создаём устройство "IDE".
Код:
VBoxManage storagectl KolibriOS --name IDE --add ide --bootable on

г) Копируем "kolibri.iso" в папку "VirtualBox VMs".
Код:
cp ./kolibri.iso ~/'VirtualBox VMs'/KolibriOS

д) Прикрепляем к устройству "IDE" наш образ "kolibri.iso".
Код:
VBoxManage storageattach KolibriOS --storagectl IDE --port 0 --device 0 --type dvddrive --medium ~/'VirtualBox VMs'/KolibriOS/kolibri.iso

9. Запускаем VirtualBox в графическом режиме и в настройках "Settings"...
Изображение
выбираем пункт "USB" и выставляем в нём "USB 2.0 Controller".

Изображение
Далее, нажимаем на маленькую кнопку с флешкой, с плюсиком, которая распологается справого бока.

Изображение
Добавляем свою флешку из списка и жмём на кнопку "OK". Закрываем VirtualBox.
Изображение
Изображение
10. Всё. VirtualBox настроена.

Теперь, у нас есть готовое окружение для программирования.

Далее, расскажу как компилировать программы. Продолжение тут.

Дата выпуска: 29.05.2017


Вложения:
libisl.so.10.2.2.7z [370.03 КБ]
19 скачиваний

_________________
The Glass is Always Half Full! :mrgreen:


Последний раз редактировалось JohnXenox Вт июн 13, 2017 11:26 pm, всего редактировалось 19 раз.
Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 9:11 am 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1077
Может поможет https://habrahabr.ru/company/kolibrios/blog/229231/

_________________
я лишь учусь


Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 2:02 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
punk_joker писал(а):
Уже читал. Там, не всё было понятно, так как, статья не для начинающего, вроде меня и нацелена на разработку в среде Windows. К тому же, makefile и пример из данной стати, у меня в Linux, не работают. Но, тем не менее, статья всё же помогла разобраться в некоторых вопросах. :)

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 3:12 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Цитата:
10. Непонятно, почему папка с Linux'овыми инструментами для Kolibri, называется "win32". Поэтому, переименуем в "kos32".
Закон Мерфи бессмертен.
Ставится все в /home/autobuild/tools.
Q. Почему такой путь?
A. Потому что такой путь используется на сервере автосборки.
Q. Почему папка называется win32?
A. Чтобы make файлы работали в Linux и Windows без переделок.


Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 4:00 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Serge писал(а):
Цитата:
10. Непонятно, почему папка с Linux'овыми инструментами для Kolibri, называется "win32". Поэтому, переименуем в "kos32".
Закон Мерфи бессмертен.
Ставится все в /home/autobuild/tools.
Q. Почему такой путь?
A. Потому что такой путь используется на сервере автосборки.
Q. Почему папка называется win32?
A. Чтобы make файлы работали в Linux и Windows без переделок.
Ясно.

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 5:07 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Setting up the environment for compiling programs in C, for Kolibri in Ubuntu 16.04.

The tools we will use:
1. GCC v5.4.0 from Toolchain'a от Serge (x86_64-linux-kos32-5.4.0.7z).
2. SDK from Toolchain'a от Serge (sdk-28-10-16.7z).
3. SDK из SVN с libgcc.a и Newlib.
4. VirtualBox and USB Flash Drive (USB Stick).
5. ISO image of the Kolibri is night build.

Installing the necessary tools.

Download and install all the necessary tools. All commands are executing in the terminal.

Order of actions:
1. Just in case, we update the system.
Код:
sudo apt update & sudo apt dist-upgrade

2. Go to the Downloads folder. There we will download all our instruments.
Код:
cd ~/Downloads

3. Download "GCC" and "SDK" from "Toolchain" from Serge.
Код:
wget ftp://ftp.kolibrios.org/users/Serge/new/Toolchain/x86_64-linux-kos32-5.4.0.7z && wget ftp://ftp.kolibrios.org/users/Serge/new/Toolchain/sdk-28-10-16.7z

4. We installing "7zip" to unpack the archives, if not installed.
Код:
sudo apt install p7zip-full

5. Unpack all the above downloaded archives.
Код:
7z x x86_64-linux-kos32-5.4.0.7z && 7z x sdk-28-10-16.7z

6. Copy everything from the "lib" folder to the "win32/lib" folder.
Код:
cp -R ./lib/* ./win32/lib

7. We install "subversion" for downloading "SDK" with "SVN".
Код:
sudo apt install subversion

8. Download the "SDK" folder from "SVN".
Код:
svn co svn://kolibrios.org/contrib/sdk sdk

9. We move the folder "SDK" to the folder "win32".
Код:
mv ./sdk ./win32

10. Rename the win32 folder to "kos32".
Код:
mv ./win32 ./kos32

11. We move the folder "kos32" in the directory "/usr/local".
Код:
sudo mv -R ./kos32 /usr/local

12. We put the rights for the folder "kos32".
Код:
sudo chmod -R u+rwx /usr/local/kos32 && chmod -R go-w /usr/local/kos32 && sudo chmod -R go+rx /usr/local/kos32

13. In order to be able to use the tools from the folder "kos32/bin", you need to register the path to the folder with the tools "/usr/local/kos32/bin", into the environment variable "PATH ", followed by a colon in the file" /etc/environment ".
Код:
sudo nano /etc/environment
Изображение

Let's check if the terminal sees the tools in the folder "kos32/bin". Enter the following line in the terminal:
Код:
kos32-gcc --version

Изображение

And if you see also that in the picture above, then the tools are available, and you can use them.

14. In order that "kos32-gcc" can compile, download, unpack and put the library "libisl.so.10.2.2".
Код:
wget http://board.kolibrios.org/download/file.php?id=8301libisl.so.10.2.2.7z && 7z x file.php?id=8301libisl.so.10.2.2.7z
sudo mv libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu && sudo ln -s /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu/libisl.so.10
sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10 && sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2

15. Download and install VirtualBox, if not already installed.
Код:
wget http://download.virtualbox.org/virtualbox/5.1.22/virtualbox-5.1_5.1.22-115126~Ubuntu~xenial_amd64.deb
sudo dpkg -i virtualbox-5.1_5.1.22-115126~Ubuntu~xenial_amd64.deb

16. Download and install addition to VirtualBox, if not already installed.
Код:
wget http://download.virtualbox.org/virtualbox/5.1.22/Oracle_VM_VirtualBox_Extension_Pack-5.1.22-115126.vbox-extpack
virtualbox Oracle_VM_VirtualBox_Extension_Pack-5.1.22-115126.vbox-extpack

17. That's all. The tools are installed.

Configuring VirtualBox.

Now go on to configure the VirtualBox. All commands are executing in the terminal.

Order of actions:
1. To be able to see the USB flash drive in VirtualBox, we add ourselves to the group "vboxusers". The list of available groups can be found in "/etc/groups".
Код:
sudo usermod -a -G vboxusers $USER

2. Next, you need to reboot.
Код:
sudo reboot

3. Go to the folder "Downloads". There we will download the ISO image of Kolibri.
Код:
cd ~/Downloads

4. Download the archive ISO image Kolibri. On the server, at the time of this writing, was Kolibri "svn6912-iso.7z".
Код:
wget http://builds.kolibrios.org/rus/svn6912-iso.7z

5. Unpack the archive with ISO image Kolibri.
Код:
7z x svn6912-iso.7z

8. We create a virtual machine for VirtualBox.

a) Create a new virtual machine called "KolibriOS".
Код:
VBoxManage createvm --name KolibriOS --ostype WindowsXP --register

b) We expose the basic parameters.
Код:
VBoxManage modifyvm KolibriOS --memory 256 --vram 128 --cpus 1 --firmware bios --boot1 dvd --usb on --usbehci on --usbcardreader on
VBoxManage modifyvm KolibriOS --clipboard bidirectional --draganddrop bidirectional

c) We create the device "IDE".
Код:
VBoxManage storagectl KolibriOS --name IDE --add ide --bootable on

d) Copy "kolibri.iso" to the "VirtualBox VMs" folder.
Код:
cp ./kolibri.iso ~/'VirtualBox VMs'/KolibriOS

e) We attach to our device "IDE" our image "kolibri.iso".
Код:
VBoxManage storageattach KolibriOS --storagectl IDE --port 0 --device 0 --type dvddrive --medium ~/'VirtualBox VMs'/KolibriOS/kolibri.iso

9. Run VirtualBox in graphical mode and in the settings "Settings" ...
Изображение
select the item "USB" and choose "USB 2.0 Controller" radio button.

Изображение
Next, click on the small button with a flash drive, with a plus, which is located on the right side.

Изображение
Add flash drive from the list and click on the button "OK". Close VirtualBox.
Изображение
Изображение
10. That's all. VirtualBox is configured.

Now, we have a ready environment for programming.

Next, I'll show you how to compile programs. Continuation here.

Release date: 29.05.2017

_________________
The Glass is Always Half Full! :mrgreen:


Последний раз редактировалось JohnXenox Вт июн 13, 2017 11:27 pm, всего редактировалось 9 раз.

Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 6:45 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Компиляция программ для Kolibri.

Компиляция программ в простейшем случае, осуществляется в 3 этапа (если где-то ошибаюсь, поправьте!):
1. Инструментом "kos32-gcc" создаётся объектный файл с именем "имя_программы.o".
2. Инструментом "kos32-ld", производится встраивание заголовка исполняемого файла Kolibri и связывание объектного файла с библиотеками в единый файл..
3. Инструментом "kos32-objcopy", происходит вырезание исполняемого файла Kolibri из файла, который на выходе выдаёт "kos32-ld".

Настройка kos32-gcc.

Далее, будет приведено описание обязательных и необязательных, но полезных ключей.

Описание ключей kos32-gcc (обязательные ключи):
-c - компилировать файл(ы), но не линковать.
-U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 - Отменяет предыдущее определение имени, либо встроенное, либо снабженное опцией -D.
-I /usr/local/kos32/sdk/sources/newlib/libc/include - добавляет директорию "/usr/local/kos32/sdk/sources/newlib/libc/include" в список директорий с заголовочными файлами.
Данный ключ можно использовать для переопределения файла заголовка системы, подставляя вашу собственную версию, поскольку
эти директории просматриваются перед директориями файлов заголовков системы. Если вы используете более одного параметра -I, каталоги сканируются в порядке слева направо.
-o имя_программы.o - Расположить выходной файл в файле "имя_программы.o".

Более подробное описание ключей можно посмотреть в man-странице командой "man gcc".

Командная строка для kos32-gcc:
Код:
kos32-gcc  -c -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I /usr/local/kos32/sdk/sources/newlib/libc/include -o имя_программы.o имя_программы.c

Описание ключей kos32-gcc (необязательные ключи):
-m32 - генерировать код только для 32 битного процессора.
-march=тип_процессора - сгенерировать инструкции для указанного типа процессора.
типы процессоров:
native - использовать инструкции всех доступных процессоров.
i386, i486, i586/pentium, pentium-mmx, pentiumpro, i686, pentium2, pentium3, pentium4 и т.д.
-mtune=тип процессора - настройка на процессор.
тип процессора:
generic - генерировать оптимизированный код для большинства процессоров IA32/AMD64/EM64T.
pentium4 - генерировать код настроенный на процессор pentium4.
и т.д.
-std=языковой стандарт - определяет стандарт языка.
Стандарты: c99, с90, с89 и т.д.
-O2 - оптимизация кода по скорости компиляции и по скорости исполнения.
-Os - оптимизация кода по размеру.
-fomit-frame-pointer - не держать указатель кадра в регистре для функций, который им не нужен. Это позволяет избежать сохранение
инструкций, настройку и восстановление указателей кадров; также делает дополнительный регистр доступным во многих функциях. Так же, на
некоторых машинах, делает отладку невозможной.

Более подробное описание ключей можно посмотреть в man-странице командой "man gcc".

Командная строка для kos32-gcc:
Код:
kos32-gcc  -m32 -march=native -mtune=generic -std=c99 -c -O2 -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 
-I /usr/local/kos32/sdk/sources/newlib/libc/include -o имя_программы.o имя_программы.c

Настройка kos32-ld.

Настройка kos32-ld чуть сложнее, но если разобраться, то всё просто.

Описание ключей kos32-ld:
-static - не линковать с динамическими библиотеками.
-call_shared - ссылка на динамические библиотеки.
-nostdlib - только поиск библиотек, явно указанных в командной строке. Библиотечные каталоги, указанные в сценариях компоновщика
(включая скрипты компоновщика, указанные в командной строке), игнорируются.
--subsystem подсистема - Определяет подсистему, под которой будет выполняться ваша программа. Параметр "подсистема"
в ключе "--subsystem" для программ Kolibri, может быть: для графических - "native", "windows" или "posix", для консольных - "console".
--image-base 0 - Использовать значение 0 в качестве базового адреса вашей программы или dll. Это самая нижняя область памяти,
которая будет использоваться при загрузке вашей программы или dll.
-T /usr/local/kos32/sdk/sources/newlib/static.lds - использовать скриптовый файл "static.lds" в качестве скрипта для линкера "kos32-ld".
-Map=mapfile - распечатать карту ссылок в файл "mapfile".
-L searchdir - добавляет путь "searchdir" в список путей, которые "kos32-ld" будет искать в архивных библиотеках и ld-скриптах управления.
Вы можете использовать эту опцию любое количество раз. Поиск директорий осуществляется в том порядке, в котором они указаны в
командной строке. Каталоги, указанные в командной строке, просматриваются перед каталогами по умолчанию. Все опции -L применяются ко всем параметрам -l, независимо от порядка отображения параметров. Параметры -L не влияют на то, как "ld" ищет скрипт компоновщика, если не указана опция -T.
-o имя_программы - расположить выходной файл в файле "имя_программы". Если опция "имя_программы" не указана, то по умолчанию используется имя "a.out".
-lc - добавить файл архива или объекта, указанный в указателе имен, в список файлов для ссылки. В нашем случае - "libc.a".
-lc.dll - добавить файл архива или объекта, указанный в указателе имен, в список файлов для ссылки. В нашем случае - "libc.dll.a".
-lgcc - добавить файл архива или объекта, указанный в указателе имен, в список файлов для ссылки. В нашем случае - "libgcc.a".

Более подробное описание ключей можно посмотреть в man-странице командой "man ld".

Командная строка для kos32-ld (статическая линковка):
Код:
kos32-ld  -static -nostdlib --subsystem native --image-base 0 -T /usr/local/kos32/sdk/sources/newlib/static.lds -Map=$app_name.map -L /usr/local/kos32/sdk/lib 
-L /usr/local/kos32/lib -o имя_программы имя_программы.o -lc -lgcc -lc

Порядок расположения ключей -lc и -lgcc, имеет значение, и должен совпадать с порядком указания путей, ключём -L.

Командная строка для kos32-ld (динамическая линковка):
Код:
kos32-ld  -call_shared -nostdlib --subsystem native --image-base 0 -T /usr/local/kos32/sdk/sources/newlib/app-dynamic.lds -Map=$app_name.map 
-L /usr/local/kos32/sdk/lib -L /usr/local/kos32/lib  -o имя_программы имя_программы.o -lgcc -lc.dll

Порядок расположения ключей -lgcc и -lc.dll, имеет значение, и должен совпадать с порядком указания путей, ключём -L.

Настройка kos32-objcopy.

Тут, всё просто и особо настраевать нечего.

Командная строка для kos32-objcopy:
Код:
kos32-objcopy  имя_программы -O binary

Подробное описание ключей kos32-objcopy в "man objcopy".

Две простые программы для теста.

Первая рограмма hello.c (консольная):
Спойлер: Показать
Код:
#include <stdio.h>

int main(void)
{
    printf("Hello, world!\n");
    return 0;
};

Изображение

Вторая программа window.c (графическая):
Спойлер: Показать
Код:
#include <kos32sys.h>

static char * title="Window";

void create_window(){
        BeginDraw();
        DrawWindow(100,100,400,200,title,0x80ffffff,0x13);
        EndDraw();
}

int main(int argc, char** argv[])
{
    create_window();
    for (;;)
    {
    switch(get_os_event())
   {
   case 1:
       create_window();
            continue;
   case 2:
       // key pressed, read it and ignore
       get_key();
            continue;
   case 3:
       // button pressed; we have only one button, close
            if(get_os_button()==1) return 0;
            continue;
   }
    }
}

Изображение

Теперь, если всё настроено верно и все ключи введены правильно, то на выходе получим исполняемый(ые) файл(ы) для Kolibri.

На этом, пока всё. Описания минимального набора ключей, вполне достаточно для комфортного компилирования программ для Kolibri, в GNU Linux.

Далее, приведу простой, но удобный Bash скрипт, для компиляции программ для Kolibri. Продолжение тут.

Дата выпуска: 30.05.2017

_________________
The Glass is Always Half Full! :mrgreen:


Последний раз редактировалось JohnXenox Вт сен 19, 2017 6:22 am, всего редактировалось 22 раза.

Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 7:46 pm 
Не в сети
Mentor

Зарегистрирован: Вт мар 11, 2014 11:37 am
Сообщения: 183
Nice compilation!
This is very useful for new developers/users.

Would be nice if you could post this on the wiki.kolibrios.org as well!

Thank you.

_________________
---
Check out the Netsurf Web Browser for KolibriOS.
Read the wiki and happy hacking with KolibriOS!


Вернуться к началу
СообщениеДобавлено: Вт май 30, 2017 8:15 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
ashmew2 писал(а):
Nice compilation!
This is very useful for new developers/users.
I hope so. :)
ashmew2 писал(а):
Would be nice if you could post this on the wiki.kolibrios.org as well!

Thank you.
I can not promise, but I'll try. :roll:

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
СообщениеДобавлено: Чт июн 01, 2017 12:34 am 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Compilation of programs for Kolibri.

Compilation of programs in the simplest case, is carried out in 3 stages (if somewhere I am mistaken, correct me!):
1. The "kos32-gcc" tool creates an object file named "program_name.o".
2. The "kos32-ld" tool implements the header of the Kolibri executable and links the object file with the libraries in a single file.
3. With the tool "kos32-objcopy", the executable file Kolibri is cut from the file that outputs "kos32-ld".

Configuring kos32-gcc.

Next, a description of mandatory and optional but useful keys will be provided.

Description of keys kos32-gcc (mandatory keys):
-c - Compile the file(s), but not link.
-U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 - cancels the previous definition of a name, either built-in, or provided with the option -D.
-I /usr/local/kos32/sdk/sources/newlib/libc/include - adds the directory "/usr/local/kos32/sdk/sources/newlib/libc/include" to the list of directories with header files. You can use this key to override the system header file, substituting your own version, as these directories are scanned before the directories of the system header files. If you use more than one -I parameter, directories are scanned in order from left to right.
-o program_name.o - Arrange the output file in the file "program_name.o".

A more detailed description of the keys can be found in the man page with the command "man gcc".

Command line for kos32-gcc:
Код:
kos32-gcc  -c -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I /usr/local/kos32/sdk/sources/newlib/libc/include -o program_name.o program_name.c

Description of the keys kos32-gcc (optional keys):
-m32 - Generate code only for 32-bit processor.
-march=processor_type - Generate instructions for the specified processor type.
processor types:
native - use the instructions of all available processors.
i386, i486,i586/pentium, pentium-mmx, pentiumpro, i686, pentium2, pentium3, pentium4 and etc.
-mtune=processor_type - tuning to the processor.
processor type:
generic - generate optimized code for most IA32/AMD64/EM64T processors.
pentium4 - generate the code configured on the pentium4 processor.
and etc.
-std=language standard - determines the standard of the language.
Стандарты: c99, с90, с89 и т.д.
-O2 - optimizing the code for compilation speed and speed of execution.
-Os - code optimization by size.
-fomit-frame-pointer - Do not keep the frame pointer in the register for functions that they do not need. This avoids saving instructions, setting up and restoring frame indexes; Also makes the additional register available in many functions. Also, on some machines, it makes debugging impossible.

A more detailed description of the keys can be found in the man page with the command "man gcc".

Command line for kos32-gcc:
Код:
kos32-gcc  -m32 -march=native -mtune=generic -std=c99 -c -O2 -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 
-I /usr/local/kos32/sdk/sources/newlib/libc/include -o program_name.o program_name.c

Configuring kos32-ld.

Setting up kos32-ld is a little more complicated, but if you understand, everything is simple.

Description of keys kos32-ld:
-static - Do not link to dynamic libraries.
-call_shared - link to dynamic libraries.
-nostdlib - Only search for libraries explicitly specified on the command line. The library directories specified in the linker scenarios (including the linker scripts specified on the command line) are ignored.
--subsystem subsystem - Specifies the subsystem under which your program will run. The parameter "subsystem" in the key "--subsystem" for Kolibri programs, can be: for graphics - "native", "Windows" or "posix", for console - "console ".
--image-base 0 - Use 0 as the base address of your program or dll. This is the lowest memory area that will be used when loading your program or dll.
-T /usr/local/kos32/sdk/sources/newlib/static.lds - Use the script file "static.lds" as a linker script "kos32-ld".
-Map=mapfile - print the map of links in the file "mapfile".
-L searchdir - adds the path "searchdir" to the list of paths that kos32-ld will search in archived libraries and ld control scripts. You can use this option any number of times. The search for directories is carried out in the order in which they are specified in
command line. The directories specified on the command line are scanned before the default directories. All -L options apply to all parameters -l, regardless of the order in which the parameters are displayed. The parameters -L do not affect how "ld" looks for the linker script,
If option -T is not specified.
-o program_name - place the output file in the file "program_name". If the option "program_name" is not specified, the default name is "a.out".
-lc - add the archive or object file specified in the index of names to the list of files for the link. In our case, "libc.a".
-lc.dll - Add the archive or object file specified in the index of names to the list of files for the link. In our case, "libc.dll.a".
-lgcc - Add the archive or object file specified in the index of names to the list of files for the link. In our case, "libgcc.a".

A more detailed description of the keys can be found in the man page with the command "man ld".

Command line for kos32-ld (static link):
Код:
kos32-ld  -static -nostdlib --subsystem native --image-base 0 -T /usr/local/kos32/sdk/sources/newlib/static.lds -Map=$app_name.map -L /usr/local/kos32/sdk/lib 
-L /usr/local/kos32/lib -o program_name program_name.o -lc -lgcc -lc

The order of the keys -lc and -lgcc has a value, and must match the path ordering order with -L.

Command line for kos32-ld (dynamic link):
Код:
kos32-ld  -call_shared -nostdlib --subsystem native --image-base 0 -T /usr/local/kos32/sdk/sources/newlib/app-dynamic.lds -Map=$app_name.map 
-L /usr/local/kos32/sdk/lib -L /usr/local/kos32/lib  -o program_name program_name.o -lgcc -lc.dll

The order of the keys -lgcc and -lc.dll, has a value, and must match the path ordering order by -L.

Configuring kos32-objcopy.

Here, everything is simple and especially nothing to adjust.

Command line for kos32-objcopy:
Код:
kos32-objcopy  program_name -O binary

A detailed description of the keys "kos32-objcopy" in "man objcopy".

Two simple programs for the test.

The first program hello.c (console):
Спойлер: Показать
Код:
#include <stdio.h>

int main(void)
{
    printf("Hello, world!\n");
    return 0;
};

Изображение

The second program window.c (graphic):
Спойлер: Показать
Код:
#include <kos32sys.h>

static char * title="Window";

void create_window(){
        BeginDraw();
        DrawWindow(100,100,400,200,title,0x80ffffff,0x13);
        EndDraw();
}

int main(int argc, char** argv[])
{
    create_window();
    for (;;)
    {
    switch(get_os_event())
   {
   case 1:
       create_window();
            continue;
   case 2:
       // key pressed, read it and ignore
       get_key();
            continue;
   case 3:
       // button pressed; we have only one button, close
            if(get_os_button()==1) return 0;
            continue;
   }
    }
}

Изображение

Now, if everything is set up correctly and all the keys are entered correctly, then at the output we get the executable file(s) for Kolibri.

For now, it's all. The description of the minimal set of keys is enough for comfortable compilation of programs for Kolibri, in GNU Linux.

Next, I will give a simple but convenient Bash script for compiling programs for Kolibri. Continuation here.

Release date: 30.05.2017

_________________
The Glass is Always Half Full! :mrgreen:


Последний раз редактировалось JohnXenox Вт сен 19, 2017 6:21 am, всего редактировалось 3 раза.

Вернуться к началу
СообщениеДобавлено: Пт июн 02, 2017 12:20 am 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Компиляции программ с помощью Bash скрипта.

После того, как выяснили, что означают ключи и как с ними компилировать программу(ы), можно написать свой Bash скрипт.

Вот, мой скромный, но полезный скрипт "Compile.sh", которым сам пользуюсь (вариант не окончательный).
Спойлер: Показать
Код:
#!/bin/bash

##############################################################################
# Compile.sh - bash script for compiling C programs for KolibriOS.
# Uses GCC v5.4.0 for KolibriOS.
# Compile.sh written by JohnXenox.
# GNU GPLv2.
##############################################################################
# Compile script usage:
# ./Compile.sh
##############################################################################

app_name=hello
dir_path=/usr/local/kos32
# 1 - static, 2 - dynamic.
compile_mode=2
# for app with gui (native, windows, posix).
# for app with cui (console).
subsys_arg='console'

#export PATH=$PATH:$dir_path/bin

gcc_keys="-m32 -march=native -mtune=generic -std=c99 -c -O2 -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32"
ld_keys1="-static -nostdlib --subsystem $subsys_arg --image-base 0"
ld_keys2="-call_shared -nostdlib --subsystem $subsys_arg --image-base 0"

path_to_headers="$dir_path/sdk/sources/newlib/libc/include"
path_to_ldscript1="$dir_path/sdk/sources/newlib/static.lds"
path_to_ldscript2="$dir_path/sdk/sources/newlib/app-dynamic.lds"
path_to_libc="$dir_path/lib"
path_to_libgcc="$dir_path/sdk/lib"

kos32-gcc  $gcc_keys -I $path_to_headers -o $app_name.o $app_name.c

case $compile_mode in
  1) kos32-ld  $ld_keys1 -T $path_to_ldscript1 -Map=$app_name.map -L $path_to_libgcc -L $path_to_libc -o $app_name $app_name.o -lc -lgcc -lc  ;;
  2) kos32-ld  $ld_keys2 -T $path_to_ldscript2 -Map=$app_name.map -L $path_to_libgcc -L $path_to_libc  -o $app_name $app_name.o -lgcc -lc.dll ;;
  *) exit 1 ;;
esac

kos32-strip  -s $app_name -o $app_name
kos32-objcopy  $app_name -O binary
rm  $app_name.o
rm  $app_name.map

exit 0

Чтобы компилировать скриптом, его надо настроить, выставив соответствующие переменные для программы, которую требуется откомпилировать.

Описание переменных скрипта:
Код:
app_name - содержит имя компилируемой программы.
dir_path - содержит путь к директории с папкой [b]kos32[/b], включая папку [b]kos32[/b].
compile_mode - содержит режим сборки программы (1 - статический, 2 - динамический).
subsys_arg - содержит значение подсистемы: для графической программы - native, windows или posix, для консольной программы - console.

Как компилировать скриптом?

Рассмотрим настройку и компиляцию на двух тестовых примерах, которые были опубликованы ранее.

1. Консольная программа hello.c.

Выбираем нужную директорию, где будет находиться наша программа. Берём ранее приведённую программу "hello.c", а так же, выше приведённый скрипт "Compile.sh", и кидаем в нашу директорию.

Выставляем права на исполнение скрипта:
Код:
sudo chmod u+x Compile.sh

Берём скрипт "Compile.sh", открываем в любом удобном текстовом редакторе и выставляем следующие значения в переменных.

Код:
app_name=hello        # имя программы hello.
compile_mode=2        # используем динамическую сборку.
subsys_arg='console'  # программа будет собираться как консольная.

Запуск файла "Compile.sh" на компиляцию, осуществляется: либо одним, либо двойным нажатием по нему левой кнопкой мыши в граф. режиме, либо введя в терминале строчку "./Compile.sh", без ковычек.

2. Графическая программа window.c.

Выбираем нужную директорию, где будет находиться наша программа. Берём ранее приведённую программу "window.c", а так же, выше приведённый скрипт "Compile.sh", и кидаем в нашу директорию.

Выставляем права на исполнение скрипта:
Код:
sudo chmod u+x Compile.sh

Берём скрипт "Compile.sh", открываем в любом удобном текстовом редакторе и выставляем следующие значения в переменных.

Код:
app_name=window       # имя программы window.
compile_mode=2        # используем динамическую сборку.
subsys_arg='windows'  # программа будет собираться как графическая (оконная).

Запуск файла "Compile.sh" на компиляцию, осуществляется: либо одним, либо двойным нажатием по нему левой кнопкой мыши в граф. режиме, либо введя в терминале строчку "./Compile.sh", без ковычек.

На этом, пока всё. Продолжение здесь...

Дата выпуска: 02.06.2017

_________________
The Glass is Always Half Full! :mrgreen:


Последний раз редактировалось JohnXenox Вт сен 19, 2017 4:13 pm, всего редактировалось 3 раза.

Вернуться к началу
СообщениеДобавлено: Вт июн 13, 2017 10:54 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Compiling programs using Bash script.

After you have found out what keys mean and how to compile the program(s) with them, you can write your Bash script.

Here, my modest but useful script "Compile.sh", which I use (the option is not final).
Спойлер: Показать
Код:
#!/bin/bash

##############################################################################
# Compile.sh - bash script for compiling C programs for KolibriOS.
# Uses GCC v5.4.0 for KolibriOS.
# Compile.sh written by JohnXenox.
# GNU GPLv2.
##############################################################################
# Compile script usage:
# ./Compile.sh
##############################################################################

app_name=hello
dir_path=/usr/local/kos32
# 1 - static, 2 - dynamic.
compile_mode=2
# for app with gui (native, windows, posix).
# for app with cui (console).
subsys_arg='console'

#export PATH=$PATH:$dir_path/bin

gcc_keys="-m32 -march=native -mtune=generic -std=c99 -c -O2 -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32"
ld_keys1="-static -nostdlib --subsystem $subsys_arg --image-base 0"
ld_keys2="-call_shared -nostdlib --subsystem $subsys_arg --image-base 0"

path_to_headers="$dir_path/sdk/sources/newlib/libc/include"
path_to_ldscript1="$dir_path/sdk/sources/newlib/static.lds"
path_to_ldscript2="$dir_path/sdk/sources/newlib/app-dynamic.lds"
path_to_libc="$dir_path/lib"
path_to_libgcc="$dir_path/sdk/lib"

kos32-gcc  $gcc_keys -I $path_to_headers -o $app_name.o $app_name.c

case $compile_mode in
  1) kos32-ld  $ld_keys1 -T $path_to_ldscript1 -Map=$app_name.map -L $path_to_libgcc -L $path_to_libc -o $app_name $app_name.o -lc -lgcc -lc  ;;
  2) kos32-ld  $ld_keys2 -T $path_to_ldscript2 -Map=$app_name.map -L $path_to_libgcc -L $path_to_libc  -o $app_name $app_name.o -lgcc -lc.dll ;;
  *) exit 1 ;;
esac

kos32-strip  -s $app_name -o $app_name
kos32-objcopy  $app_name -O binary
rm  $app_name.o
rm  $app_name.map

exit 0

To compile the script, you must configure it by setting the appropriate variables for the program that you want to compile.

Description of script variables:
Код:
app_name - contains the name of the compiled program.
dir_path - Contains the path to the directory with the folder [b]kos32[/b], including the folder [b]kos32[/b].
compile_mode - contains the program assembly mode (1 - static, 2 - dynamic).
subsys_arg - contains the value of the subsystem: for the graphics program - native, windows or posix, for the console program - console.

How to compile the script?

Consider setup and compilation on two test samples that were published earlier.

1. Console program hello.c.

Choose the desired directory where our program will be located. We take the previously mentioned program "hello.c", as well as the above script "Compile.sh", and throw it into our directory.

We expose the performance rights for the script:
Код:
sudo chmod u+x Compile.sh

We take the script "Compile.sh", open it in any convenient text editor and set the following values in the variables.

Код:
app_name=hello        # the name of the hello program.
compile_mode=2        # we use dynamic assembly.
subsys_arg='console'  # the program will be assembled as console.

Running the file "Compile.sh" for compilation is done either by one or by double clicking on it with the left mouse button in the graph. mode, or typing in the terminal line "./Compile.sh", without the quotes.

2. The graphical program window.c.

Choose the desired directory where our program will be located. We take the previously mentioned program "window.c", as well as the above script "Compile.sh", and throw it into our directory.

We expose the performance rights for the script:
Код:
sudo chmod u+x Compile.sh

We take the script "Compile.sh", open it in any convenient text editor and set the following values in the variables.

Код:
app_name=window       # the name of the window program.
compile_mode=2        # we use dynamic assembly.
subsys_arg='windows'  # The program will be assembled as a graphic (windowed).

Running the file "Compile.sh" for compilation is done either by one or by double clicking on it with the left mouse button in the graph. mode, or typing in the terminal line "./Compile.sh", without the quotes.

For now, it's all. Continuation here...

Release date: 02.06.2017

_________________
The Glass is Always Half Full! :mrgreen:


Последний раз редактировалось JohnXenox Вт сен 19, 2017 4:15 pm, всего редактировалось 2 раза.

Вернуться к началу
СообщениеДобавлено: Вт сен 19, 2017 6:03 am 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Использование образа виртуального жёсткого диска в GNU/Linux, вместо флеш диска.

Во время написания программ для Kolibri с использованием флеш диска подключённого к VirtualBox, у меня, в моей Ubuntu, всё время возникала проблема с записью на флеш диск. Ни с того ни с сего, во время программирования, почему-то пропадала запись на флеш диск, и чтобы это исправить приходилось перезагружать компьютер. Как это исправить, я так и не разобрался, ибо не специалист в Linux. Всё это, меня дико раздражало и я стал думать о том, как в Ubuntu можно писать программы для Kolibri, без использования флеш диска. И тогда в голову, мне пришла мысль о том, почему бы мне, для этого, не использовать виртуальный образ жёсткого диска. И тогда, я стал думать какой формат образа виртуального жёсткого диска пригоден для моей задачи. Долго искал информацию по форматам образов виртуальных дисков и понял, что лучше всего подходит формат ".img", отформатированный в файловую систему "fat32". У VirtualBox есть собственный формат жёсткого диска ".vdi", но как его использовать для моей задачи в Ubuntu, информации не нашёл. Поэтому выбрал формат ".img". Он простой: легко создаётся, легко форматируется, легко монтируется и его легко преобразовать в формат".vdi". Далее, приступил к написанию Bash скрипта. Писал - отлаживал, писал - отлаживал. Через некоторое время написания Bash скрипта, сталкнулся с проблемой удаления старой информации о старом образе с расширением ".vdi". Очень долго ползал по сети, но так и не нашёл, способа решения появившейся проблемы. Потом вспомнил, что почти у каждой программы, есть как минимум один собственный конфигурационный файл, его-то и надо попробовать изменить, чтобы удалить ненужную информацию о старом образе. Далее, поиск конфигурационного файла. Найдя этот заветный файл, который назывался "KolibriOS.vbox", провёл серию проверок поведения виртуальной машины, изменяя этот файл, пока не добился нужного результата. И снова, писал - отлаживал, писал - отлаживал и т.д., пока Bash скрипт не заработал как надо. Потом переделывал. Потом мне показалось, что мой Bash скрипт не очень удобен в управлении. Пришлось снова переделать. И снова понял, что что-то не так; Bash скрипт надо было размещать в "/usr/local/kos32/bin", так мне удобнее, а там чуть другой код нужен. И снова правка и отладка. Затем оптимизация. В общем угрохал 3 дня на это, но зато, теперь есть маленький и удобный Bash скрипт.

Получившийся Bash скрипт не знал как назвать, поэтому назвал просто - "koshdd". Вот, собственно сам скрипт:
Спойлер: Показать
Код:
#!/bin/bash

# =============================================================================== #
# Description:                                                                    #
#  koshdd - bash script, that: creates, mounts, launches and unmounts             #
#           the ".img" image.                                                     #
# Usage:                                                                          #
# koshdd create  - to create an image.                                            #
# koshdd mount   - to mount the image.                                            #
# koshdd launch  - to launch vbox.                                                #
# koshdd unmount - to unmount the image.                                          #
# =============================================================================== #
# --------------------------------------------                                    #
# Bash script koshdd was written by JohnXenox.                                    #
# --------------------------------------------                                    #
# GNU GPLv2.                                                                      #
# =============================================================================== #

# img name.
name='koshdd'
# mount dir name.
dir_name='koshdd'
# path to mount dir.
mount_dir='/media'
#
#hdd_dir='/usr/local/kos32/koshdd'
#
kos32_path='/usr/local/kos32'
# virtual machine name.
vm_name='KolibriOS'
#
img_size=100

vbox_ifname="${vm_name}.vbox"
vbox_ofname1="${vm_name}1.${full_date}.txt"
vbox_ofname2="${vm_name}2.${full_date}.txt"
vbox_ifpath="${HOME}/VirtualBox VMs/${vm_name}"

time=$(date +%H%M%S)
date=$(date +%e%m%g)
full_date="$time.$date"

# =============================================================================== #
# =============================================================================== #
function create_kosimg () {
# create image and format it.
if `test -e "${vbox_ifpath}/${name}.img"`
then
  echo
  echo "The image \"${name}.img\" is alredy exists..."
  echo
  read -n 1 -p "Do you want to recreate an existing one?(y/n) " answer
  case $answer in
    "Y" | "y") sudo rm "${vbox_ifpath}/${name}.img" ; echo ; make_kosimg ; echo ;;
    "N" | "n") echo ; echo ;;
    *) echo ; echo "Error: wrong answer, try again!"  ; echo ; exit 1 ;;
  esac
else
  make_kosimg
fi
}
# =============================================================================== #
# =============================================================================== #
function make_kosimg () {
# create image and format it.
  echo "Creating the image \"${name}.img\"..."
  sudo dd if=/dev/zero of="${vbox_ifpath}/${name}.img" bs=1M count=${img_size}
  echo "Formatting the image \"${name}.img\" in fat32..."
  sudo mkfs.vfat -F 32 "${vbox_ifpath}/${name}.img"
  sudo chmod -R u+rw "${vbox_ifpath}/${name}.img" && sudo chmod -R go+r "${vbox_ifpath}/${name}.img" && sudo chmod -R go-wx "${vbox_ifpath}/${name}.img"
}
# =============================================================================== #
# =============================================================================== #
function mount_kosimg () {
# create directory.
if ! `test -d ${mount_dir}/${dir_name}` ; then
  echo "Creating directory \"${mount_dir}/${dir_name}\"..."
  sudo mkdir -p ${mount_dir}/${dir_name}
# sudo chmod -R go-x ${mount_dir}/${name}
fi

# mounting image and puting rights.
sudo mount | grep "${mount_dir}/${dir_name}" > /dev/null
#if `test $?` ; then
if ! [[ $? -eq 0 ]] ; then
  echo "Mounting \"${name}.img\" in ${mount_dir}/${dir_name}..."
  sudo mount -t vfat -o loop,uid=1000,rw "${vbox_ifpath}/${name}.img" ${mount_dir}/${dir_name}
# sudo mount -t vfat -o loop,uid=1000,rw,noexec "${vbox_ifpath}/${name}.img" ${mount_dir}/${dir_name}
  #sudo chmod -R ugo+rw ${mount_dir}/${name}
else
  echo "The image \"${name}.img\" is already mounted..."
fi
}
# =============================================================================== #
# =============================================================================== #
function unmount_kosimg () {
# unmounting the image.
sudo mount | grep "${mount_dir}/${dir_name}" > /dev/null
if [[ $? -eq 0 ]] ; then
  echo "Unmounting \"${name}.img\" image file..."
  sudo umount "${vbox_ifpath}/${name}.img"
# sudo umount ${mount_dir}/${name}
fi
}
# =============================================================================== #
# =============================================================================== #
function launch_kosimg () {
# backuping ".img" to "kos32" directory.
if `test -e "${kos32_path}/${name}.img"` ; then
    sudo rm "${kos32_path}/${name}.img"
fi
echo "Backuping \"${name}.img\" to \"${kos32_path}\"..."
sudo cp "${vbox_ifpath}/${name}.img" ${kos32_path}

# unmounting directory.
unmount_kosimg

# converting a ".img" image file to a "vdi" image file.
if `test -e "${vbox_ifpath}/${name}.img"` ; then
  if `test -e "${vbox_ifpath}/${name}.vdi"` ; then
    echo "Deleting old image file \"${name}.vdi\"..."
    sudo rm "${vbox_ifpath}/${name}.vdi"
  fi
  echo "Converting \".img\" to \".vdi\"..."
  sudo VBoxManage convertfromraw --format VDI "${vbox_ifpath}/${name}.img" "${vbox_ifpath}/${name}.vdi"
  sudo chmod -R u+rw "${vbox_ifpath}/${name}.vdi" && sudo chmod -R go+rw "${vbox_ifpath}/${name}.vdi" && sudo chmod -R go-x "${vbox_ifpath}/${name}.vdi"
else
  exit 1
fi

# deleting ".vdi" image file.
#if `test -w "${vbox_ifpath}/${name}.vdi"` ; then
#  echo "Deleting old image file \"${vbox_ifpath}/${name}.vdi\"..."
#  rm "${vbox_ifpath}/${name}.vdi"
#fi

# copying ".vdi" image file to "VirtualBox VMs" directory.
#echo "Copying \"${name}.vdi\" to \"${vbox_ifpath}\" directory..."
#cp ${vbox_ifpath}/${name}.vdi "${vbox_ifpath}"

# deleting notes about hdd from file ".vbox".
#cd "${vbox_ifpath}"
if `test -w "${vbox_ifpath}/${vbox_ifname}"` ; then
  echo "Backuping the file \"${vbox_ifname}\"..."
  sudo cp  "${vbox_ifpath}/${vbox_ifname}" "${vbox_ifpath}/${vbox_ifname}.${full_date}.back"
  echo "Deleting notes about hdd from \"${vbox_ifname}\"..."
  sudo sed '/<HardDisks>/,/<\/HardDisks>/d' "${vbox_ifpath}/${vbox_ifname}" > "${vbox_ifpath}/${vbox_ofname1}"
  sudo sed '/<AttachedDevice type="HardDisk"/,/<\/AttachedDevice>/d' "${vbox_ifpath}/${vbox_ofname1}" > "${vbox_ifpath}/${vbox_ofname2}"
  rm  "${vbox_ifpath}/${vbox_ofname1}"
  mv  "${vbox_ifpath}/${vbox_ofname2}" "${vbox_ifpath}/${vbox_ifname}"
else
  echo 'The file does not exists and/or it do not have writeble permissions!'
  exit 1
fi

# attach ".vdi" to SATA drive in already created virtual machine..
echo "Attaching \"${name}.vdi\" to SATA drive..."
VBoxManage storageattach $vm_name --storagectl SATA --port 0 --device 0 --type hdd --medium "${vbox_ifpath}/${name}.vdi"

# start KolibriOS virtual machine in VirtualBox.
echo "Starting the virtual machine \"${vm_name}\" in the VirtualBox..."
VBoxManage startvm $vm_name
}
# =============================================================================== #
# =============================================================================== #
function print_usage_info () {
cat <<'EOF'

Usage:
./koshdd create  - to create an image.
./koshdd mount   - to mount the image.
./koshdd launch  - to launch vbox.
./koshdd unmount - to unmount the image.

EOF
}
# =============================================================================== #
# =============================================================================== #

# MAIN CODE #

if [[ $# = 1 ]] ; then

  case $1 in
     "create" ) create_kosimg  ;;
     "mount"  ) mount_kosimg   ;;
     "launch" ) launch_kosimg  ;;
     "unmount") unmount_kosimg ;;
     *) echo ; echo "Error: wrong argument \"$1\", try again!"  ; print_usage_info ; exit 1 ;;
  esac

elif [[ $# = 0 ]]
then echo ; echo "Error: you did not enter any argument!" ; print_usage_info ; exit 1

else echo ; echo "Error: you have entered too many arguments!" ; print_usage_info ; exit 1

fi

exit 0

Как пользоваться Bash скриптом "koshdd"?

Вообще описание того, как им пользоваться, есть внутри в краткой форме самого Bash скрипта "koshdd", но для полноты статьи приведу здесь.

Описание:
Код:
koshdd create  - для создания образа виртуального жёсткого диска ".img".
koshdd mount   - для монтирования образа виртуального жёсткого диска ".img".
koshdd launch  - для запуска виртуальной машины VirtualBox.
koshdd unmount - для размонтирования образа виртуального жёсткого диска ".img".

Теперь более подробно...

Чтобы писать программы с использованием данного Bash скрипта, надо:
1. Скрипт "koshdd" надо забросить в директорию "/usr/local/kos32/bin".
2. Если нет образа, то создать отформатированный образ виртуального жёсткого диска "koshdd.img", в котором будете размещать все ваши программы, командой "koshdd create". Новый образ будет создан в директории "/usr/local/kos32" и будет иметь размер 100 Мб, но вы, можете задать свой собственный размер образа, изменив параметр "img_size=100". Если образ был создан ранее, то будет предупреждение, с вопросом "надо ли создать новый?". И если ответ будет полажительный, то существующий образ будет удалён и создан новый. Так что, будьте осторожны, а то ничаянно удалите весь образ со всеми своими программами!
3. Смонтировать образ свежего или несвежего виртуального жёсткого диска "koshdd.img", командой "koshdd mount". Образ будет смонтирован в директории "/media", как папка, с названием "koshdd". В этой папке вы можете размещать или удалять из неё исходные файлы своих программ. Если необходимо, то образ можно отмонтировать командой "koshdd unmount", тогда все ваши программы и изменения в них, будут сохранены в образе виртуального жёсткого диска "koshdd.img", в директории "/usr/local/kos32".
4. Запутить виртуальную машину VirtualBox, командой "koshdd launch". Образ "koshdd.img" будет автоматически отмонтирован.

Далее, при дальнейшем написании программ надо делать всего простых два шага: 3 и 4.

Всё довольно просто, а главное удобно, имхо.

Примечание:
1. "koshdd.img" - содержит ваши программы. Выступает в роли жёсткого диска.
2. "koshdd.vdi" - копия "koshdd.img", является посредником. Создается во время запуска виртуальной машины VirtualBox, при это старый образ удаляется, если имеется.
3. "KolibriOS.vbox" распологается в директории "/VirtualBox VMs/KolibriOS/", в нём хранятся настройки вашей виртуальной машины. По умолчанию данный файл, во время каждого запуска скриптом, виртуальной машины VirtualBox, создаётся резервная копия с названием "KolibriOS.vbox.время.дата.back". Сделано на случай проблем, со свеже созданным конфигурационным файлом. Отключить можно закомментировав строку "sudo cp "${vbox_ifpath}/${vbox_ifname}" "${vbox_ifpath}/${vbox_ifname}.${full_date}.back"" в функции "launch_kosimg".

Всё.

Дата выпуска: 19.09.2017

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
СообщениеДобавлено: Вт сен 19, 2017 4:01 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Using a virtual hard disk image in GNU/Linux, instead of a flash drive.

While writing programs for Kolibri using a flash drive connected to VirtualBox, i in my Ubuntu, always had a problem with writing to the flash drive. For no reason, during the programming, for some reason the recording on the flash disk was lost, and to fix this it was necessary to reboot the computer. How to fix it, I still can not figure it out, because I'm not a specialist in Linux. All this, I was wildly annoyed and I began to think about how in Ubuntu you can write programs for Kolibri, without using a flash disk. And then to my mind, I came up with the idea of why, for this, I should not use the virtual image of the hard drive. And then, I began to think what format the virtual hard disk image is suitable for my task. I was looking for information on the formats of virtual disk images for a long time and realized that the ".img" format, formatted in the "fat32" file system, is best suited. VirtualBox has its own hard disk format ".vdi", but I did not find information on how to use it for my task in Ubuntu. Therefore I chose the format ".img". It is simple: easy to create, easy to format, easy to install and easy to convert to ".vdi" format. Next, I started writing a Bash script. Wrote, debugged, wrote, debugged. After a while writing the Bash script, I started with the problem of deleting the old information about the old image with the extension ".vdi". A very long time crawling on the network, but did not find a way to solve the problem. Then I remembered that almost every program has at least one configuration file of its own, it's something you should try to change to remove unnecessary information about the old image. Next, find the configuration file. Having found this treasured file called "KolibriOS.vbox", I conducted a series of tests of the behavior of the virtual machine, changing this file until I got the desired result. And again, wrote - debugged, wrote - debugged, etc., until Bash script did not work properly. Then altered. Then it seemed to me that my Bash script was not very convenient to manage. I had to redo it again. And he realized again that something was wrong; Bash script should have been placed in "/usr/local/kos32/bin", so it's more convenient for me, and there is a little more code needed. And again, editing and debugging. Then optimization. In general, threatened 3 days for this, but, now, there is a small and convenient Bash script.

The resulting Bash script did not know how to name it, so it was called simply "koshdd". Here, actually the script itself:
Спойлер: Показать
Код:
#!/bin/bash

# =============================================================================== #
# Description:                                                                    #
#  koshdd - bash script, that: creates, mounts, launches and unmounts             #
#           the ".img" image.                                                     #
# Usage:                                                                          #
# koshdd create  - to create an image.                                            #
# koshdd mount   - to mount the image.                                            #
# koshdd launch  - to launch vbox.                                                #
# koshdd unmount - to unmount the image.                                          #
# =============================================================================== #
# --------------------------------------------                                    #
# Bash script koshdd was written by JohnXenox.                                    #
# --------------------------------------------                                    #
# GNU GPLv2.                                                                      #
# =============================================================================== #

# img name.
name='koshdd'
# mount dir name.
dir_name='koshdd'
# path to mount dir.
mount_dir='/media'
#
#hdd_dir='/usr/local/kos32/koshdd'
#
kos32_path='/usr/local/kos32'
# virtual machine name.
vm_name='KolibriOS'
#
img_size=100

vbox_ifname="${vm_name}.vbox"
vbox_ofname1="${vm_name}1.${full_date}.txt"
vbox_ofname2="${vm_name}2.${full_date}.txt"
vbox_ifpath="${HOME}/VirtualBox VMs/${vm_name}"

time=$(date +%H%M%S)
date=$(date +%e%m%g)
full_date="$time.$date"

# =============================================================================== #
# =============================================================================== #
function create_kosimg () {
# create image and format it.
if `test -e "${vbox_ifpath}/${name}.img"`
then
  echo
  echo "The image \"${name}.img\" is alredy exists..."
  echo
  read -n 1 -p "Do you want to recreate an existing one?(y/n) " answer
  case $answer in
    "Y" | "y") sudo rm "${vbox_ifpath}/${name}.img" ; echo ; make_kosimg ; echo ;;
    "N" | "n") echo ; echo ;;
    *) echo ; echo "Error: wrong answer, try again!"  ; echo ; exit 1 ;;
  esac
else
  make_kosimg
fi
}
# =============================================================================== #
# =============================================================================== #
function make_kosimg () {
# create image and format it.
  echo "Creating the image \"${name}.img\"..."
  sudo dd if=/dev/zero of="${vbox_ifpath}/${name}.img" bs=1M count=${img_size}
  echo "Formatting the image \"${name}.img\" in fat32..."
  sudo mkfs.vfat -F 32 "${vbox_ifpath}/${name}.img"
  sudo chmod -R u+rw "${vbox_ifpath}/${name}.img" && sudo chmod -R go+r "${vbox_ifpath}/${name}.img" && sudo chmod -R go-wx "${vbox_ifpath}/${name}.img"
}
# =============================================================================== #
# =============================================================================== #
function mount_kosimg () {
# create directory.
if ! `test -d ${mount_dir}/${dir_name}` ; then
  echo "Creating directory \"${mount_dir}/${dir_name}\"..."
  sudo mkdir -p ${mount_dir}/${dir_name}
# sudo chmod -R go-x ${mount_dir}/${name}
fi

# mounting image and puting rights.
sudo mount | grep "${mount_dir}/${dir_name}" > /dev/null
#if `test $?` ; then
if ! [[ $? -eq 0 ]] ; then
  echo "Mounting \"${name}.img\" in ${mount_dir}/${dir_name}..."
  sudo mount -t vfat -o loop,uid=1000,rw "${vbox_ifpath}/${name}.img" ${mount_dir}/${dir_name}
# sudo mount -t vfat -o loop,uid=1000,rw,noexec "${vbox_ifpath}/${name}.img" ${mount_dir}/${dir_name}
  #sudo chmod -R ugo+rw ${mount_dir}/${name}
else
  echo "The image \"${name}.img\" is already mounted..."
fi
}
# =============================================================================== #
# =============================================================================== #
function unmount_kosimg () {
# unmounting the image.
sudo mount | grep "${mount_dir}/${dir_name}" > /dev/null
if [[ $? -eq 0 ]] ; then
  echo "Unmounting \"${name}.img\" image file..."
  sudo umount "${vbox_ifpath}/${name}.img"
# sudo umount ${mount_dir}/${name}
fi
}
# =============================================================================== #
# =============================================================================== #
function launch_kosimg () {
# backuping ".img" to "kos32" directory.
if `test -e "${kos32_path}/${name}.img"` ; then
    sudo rm "${kos32_path}/${name}.img"
fi
echo "Backuping \"${name}.img\" to \"${kos32_path}\"..."
sudo cp "${vbox_ifpath}/${name}.img" ${kos32_path}

# unmounting directory.
unmount_kosimg

# converting a ".img" image file to a "vdi" image file.
if `test -e "${vbox_ifpath}/${name}.img"` ; then
  if `test -e "${vbox_ifpath}/${name}.vdi"` ; then
    echo "Deleting old image file \"${name}.vdi\"..."
    sudo rm "${vbox_ifpath}/${name}.vdi"
  fi
  echo "Converting \".img\" to \".vdi\"..."
  sudo VBoxManage convertfromraw --format VDI "${vbox_ifpath}/${name}.img" "${vbox_ifpath}/${name}.vdi"
  sudo chmod -R u+rw "${vbox_ifpath}/${name}.vdi" && sudo chmod -R go+rw "${vbox_ifpath}/${name}.vdi" && sudo chmod -R go-x "${vbox_ifpath}/${name}.vdi"
else
  exit 1
fi

# deleting ".vdi" image file.
#if `test -w "${vbox_ifpath}/${name}.vdi"` ; then
#  echo "Deleting old image file \"${vbox_ifpath}/${name}.vdi\"..."
#  rm "${vbox_ifpath}/${name}.vdi"
#fi

# copying ".vdi" image file to "VirtualBox VMs" directory.
#echo "Copying \"${name}.vdi\" to \"${vbox_ifpath}\" directory..."
#cp ${vbox_ifpath}/${name}.vdi "${vbox_ifpath}"

# deleting notes about hdd from file ".vbox".
#cd "${vbox_ifpath}"
if `test -w "${vbox_ifpath}/${vbox_ifname}"` ; then
  echo "Backuping the file \"${vbox_ifname}\"..."
  sudo cp  "${vbox_ifpath}/${vbox_ifname}" "${vbox_ifpath}/${vbox_ifname}.${full_date}.back"
  echo "Deleting notes about hdd from \"${vbox_ifname}\"..."
  sudo sed '/<HardDisks>/,/<\/HardDisks>/d' "${vbox_ifpath}/${vbox_ifname}" > "${vbox_ifpath}/${vbox_ofname1}"
  sudo sed '/<AttachedDevice type="HardDisk"/,/<\/AttachedDevice>/d' "${vbox_ifpath}/${vbox_ofname1}" > "${vbox_ifpath}/${vbox_ofname2}"
  rm  "${vbox_ifpath}/${vbox_ofname1}"
  mv  "${vbox_ifpath}/${vbox_ofname2}" "${vbox_ifpath}/${vbox_ifname}"
else
  echo 'The file does not exists and/or it do not have writeble permissions!'
  exit 1
fi

# attach ".vdi" to SATA drive in already created virtual machine..
echo "Attaching \"${name}.vdi\" to SATA drive..."
VBoxManage storageattach $vm_name --storagectl SATA --port 0 --device 0 --type hdd --medium "${vbox_ifpath}/${name}.vdi"

# start KolibriOS virtual machine in VirtualBox.
echo "Starting the virtual machine \"${vm_name}\" in the VirtualBox..."
VBoxManage startvm $vm_name
}
# =============================================================================== #
# =============================================================================== #
function print_usage_info () {
cat <<'EOF'

Usage:
./koshdd create  - to create an image.
./koshdd mount   - to mount the image.
./koshdd launch  - to launch vbox.
./koshdd unmount - to unmount the image.

EOF
}
# =============================================================================== #
# =============================================================================== #

# MAIN CODE #

if [[ $# = 1 ]] ; then

  case $1 in
     "create" ) create_kosimg  ;;
     "mount"  ) mount_kosimg   ;;
     "launch" ) launch_kosimg  ;;
     "unmount") unmount_kosimg ;;
     *) echo ; echo "Error: wrong argument \"$1\", try again!"  ; print_usage_info ; exit 1 ;;
  esac

elif [[ $# = 0 ]]
then echo ; echo "Error: you did not enter any argument!" ; print_usage_info ; exit 1

else echo ; echo "Error: you have entered too many arguments!" ; print_usage_info ; exit 1

fi

exit 0

How to use the Bash script "koshdd"?

In general, the description of how to use it is inside in the brief form of the Bash script "koshdd", but for the sake of completeness of the article I will give here.

Short description:
Код:
koshdd create  - to create an image of a virtual hard disk ".img".
koshdd mount   - to mount the virtual hard disk image ".img".
koshdd launch  - to run the VirtualBox virtual machine.
koshdd unmount - to unmount the virtual hard disk image ".img".

Now in more detail ...

To write programs using this Bash script, you must:
1. The script "koshdd" should be thrown in the directory "/usr/local/kos32/bin".
2. If there is no image, then create a formatted image of the virtual hard disk "koshdd.img", in which you will place all your programs, with the command "koshdd create". The new image will be created in the "/usr/local/kos32" directory and will have a size of 100 MB, but you can set your own image size by changing the "img_size = 100" parameter. If the image was created earlier, then there will be a warning, with the question "Do I need to create a new one?". And if the answer is positive, then the existing image will be deleted and a new one created. So, be cautious, and then accidentally delete the whole image with all your programs!
3. Mount the image of a fresh or stale virtual hard disk "koshdd.img", using the command "koshdd mount". The image will be mounted in the "/media" directory, like a folder named "koshdd". In this folder you can post or delete source files of your programs from it. If necessary, the image can be unmounted with the command "koshdd unmount", then all your programs and changes to them will be saved in the virtual hard disk image "koshdd.img", in the directory "/usr/local/kos32".
4. Start the virtual machine VirtualBox, with the command "koshdd launch". The image "koshdd.img" will be automatically unmounted.

Further, with the further writing of programs it is necessary to do all simple simple two steps: 3 and 4.

Everything is pretty simple, but most importantly, IMHO.

Note:
1. "koshdd.img" - contains your programs. Acts as a hard disk.
2. "koshdd.vdi" - a copy of "koshdd.img", is an intermediary. It is created when the VirtualBox virtual machine is started, and the old image is deleted, if any.
3. "KolibriOS.vbox" is located in the directory "/VirtualBox VMs/KolibriOS/", it stores the settings of your virtual machine. By default, this file, during each launch of the script, VirtualBox virtual machine, creates a backup copy with the name "KolibriOS.vbox.time.data.back". Made in case of problems, with a newly created configuration file. You can disable this by commenting out the line "sudo cp" ${vbox_ifpath}/${vbox_ifname} "" ${vbox_ifpath}/${vbox_ifname}.${Full_date}.back"" in the launch_kosimg function.

Release date: 19.09.2017

_________________
The Glass is Always Half Full! :mrgreen:


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

Часовой пояс: UTC+03:00


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

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


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

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