Настройка окружения и инструментов для компиляции программ на C для Kolibri в GNU Linux с исп. toolchain'а от Serge.

High-level languages programming questions
  • to infinity and beyond
  • punk_joker wrote:Может поможет https://habrahabr.ru/company/kolibrios/blog/229231/
    Уже читал. Там, не всё было понятно, так как, статья не для начинающего, вроде меня и нацелена на разработку в среде Windows. К тому же, makefile и пример из данной стати, у меня в Linux, не работают. Но, тем не менее, статья всё же помогла разобраться в некоторых вопросах. :)
    The Glass is Always Half Full! :mrgreen:
  • 10. Непонятно, почему папка с Linux'овыми инструментами для Kolibri, называется "win32". Поэтому, переименуем в "kos32".
    Закон Мерфи бессмертен.
    Ставится все в /home/autobuild/tools.
    Q. Почему такой путь?
    A. Потому что такой путь используется на сервере автосборки.
    Q. Почему папка называется win32?
    A. Чтобы make файлы работали в Linux и Windows без переделок.
  • Serge wrote:
    10. Непонятно, почему папка с Linux'овыми инструментами для Kolibri, называется "win32". Поэтому, переименуем в "kos32".
    Закон Мерфи бессмертен.
    Ставится все в /home/autobuild/tools.
    Q. Почему такой путь?
    A. Потому что такой путь используется на сервере автосборки.
    Q. Почему папка называется win32?
    A. Чтобы make файлы работали в Linux и Windows без переделок.
    Ясно.
    The Glass is Always Half Full! :mrgreen:
  • 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.

    Code: Select all

    sudo apt update & sudo apt dist-upgrade
    2. Go to the Downloads folder. There we will download all our instruments.

    Code: Select all

    cd ~/Downloads
    3. Download "GCC" and "SDK" from "Toolchain" from Serge.

    Code: Select all

    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.

    Code: Select all

    sudo apt install p7zip-full
    5. Unpack all the above downloaded archives.

    Code: Select all

    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.

    Code: Select all

    cp -R ./lib/* ./win32/lib
    7. We install "subversion" for downloading "SDK" with "SVN".

    Code: Select all

    sudo apt install subversion
    8. Download the "SDK" folder from "SVN".

    Code: Select all

    svn co svn://kolibrios.org/contrib/sdk sdk
    9. We move the folder "SDK" to the folder "win32".

    Code: Select all

    mv ./sdk ./win32
    10. Rename the win32 folder to "kos32".

    Code: Select all

    mv ./win32 ./kos32
    11. We move the folder "kos32" in the directory "/usr/local".

    Code: Select all

    sudo mv -R ./kos32 /usr/local
    12. We put the rights for the folder "kos32".

    Code: Select all

    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 ".

    Code: Select all

    sudo nano /etc/environment
    Image

    Let's check if the terminal sees the tools in the folder "kos32/bin". Enter the following line in the terminal:

    Code: Select all

    kos32-gcc --version
    Image

    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".

    Code: Select all

    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.

    Code: Select all

    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.

    Code: Select all

    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".

    Code: Select all

    sudo usermod -a -G vboxusers $USER
    2. Next, you need to reboot.

    Code: Select all

    sudo reboot
    3. Go to the folder "Downloads". There we will download the ISO image of Kolibri.

    Code: Select all

    cd ~/Downloads
    4. Download the archive ISO image Kolibri. On the server, at the time of this writing, was Kolibri "svn6912-iso.7z".

    Code: Select all

    wget http://builds.kolibrios.org/rus/svn6912-iso.7z
    5. Unpack the archive with ISO image Kolibri.

    Code: Select all

    7z x svn6912-iso.7z
    8. We create a virtual machine for VirtualBox.

    a) Create a new virtual machine called "KolibriOS".

    Code: Select all

    VBoxManage createvm --name KolibriOS --ostype WindowsXP --register
    b) We expose the basic parameters.

    Code: Select all

    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".

    Code: Select all

    VBoxManage storagectl KolibriOS --name IDE --add ide --bootable on
    d) Copy "kolibri.iso" to the "VirtualBox VMs" folder.

    Code: Select all

    cp ./kolibri.iso ~/'VirtualBox VMs'/KolibriOS
    e) We attach to our device "IDE" our image "kolibri.iso".

    Code: Select all

    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" ...
    Image
    select the item "USB" and choose "USB 2.0 Controller" radio button.

    Image
    Next, click on the small button with a flash drive, with a plus, which is located on the right side.

    Image
    Add flash drive from the list and click on the button "OK". Close VirtualBox.
    Image
    Image
    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
    Last edited by JohnXenox on Tue Jun 13, 2017 11:27 pm, edited 9 times in total.
    The Glass is Always Half Full! :mrgreen:
  • Компиляция программ для 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:

    Code: Select all

    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:

    Code: Select all

    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 (статическая линковка):

    Code: Select all

    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 (динамическая линковка):

    Code: Select all

    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:

    Code: Select all

    kos32-objcopy  имя_программы -O binary
    Подробное описание ключей kos32-objcopy в "man objcopy".

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

    Первая рограмма hello.c (консольная):
    Spoiler:

    Code: Select all

    #include <stdio.h>
    
    int main(void)
    {
        printf("Hello, world!\n");
        return 0;
    };
    Image

    Вторая программа window.c (графическая):
    Spoiler:

    Code: Select all

    #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;
    	}
        }
    }
    
    Image

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

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

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

    Дата выпуска: 30.05.2017
    Last edited by JohnXenox on Tue Sep 19, 2017 6:22 am, edited 22 times in total.
    The Glass is Always Half Full! :mrgreen:
  • 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!
  • ashmew2 wrote:Nice compilation!
    This is very useful for new developers/users.
    I hope so. :)
    ashmew2 wrote: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:
  • 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:

    Code: Select all

    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:

    Code: Select all

    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):

    Code: Select all

    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):

    Code: Select all

    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:

    Code: Select all

    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):
    Spoiler:

    Code: Select all

    #include <stdio.h>
    
    int main(void)
    {
        printf("Hello, world!\n");
        return 0;
    };
    Image

    The second program window.c (graphic):
    Spoiler:

    Code: Select all

    #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;
    	}
        }
    }
    
    Image

    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
    Last edited by JohnXenox on Tue Sep 19, 2017 6:21 am, edited 3 times in total.
    The Glass is Always Half Full! :mrgreen:
  • Компиляции программ с помощью Bash скрипта.

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

    Вот, мой скромный, но полезный скрипт "Compile.sh", которым сам пользуюсь (вариант не окончательный).
    Spoiler:

    Code: Select all

    #!/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
    Чтобы компилировать скриптом, его надо настроить, выставив соответствующие переменные для программы, которую требуется откомпилировать.

    Описание переменных скрипта:

    Code: Select all

    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", и кидаем в нашу директорию.

    Выставляем права на исполнение скрипта:

    Code: Select all

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

    Code: Select all

    app_name=hello        # имя программы hello.
    compile_mode=2        # используем динамическую сборку.
    subsys_arg='console'  # программа будет собираться как консольная.
    Запуск файла "Compile.sh" на компиляцию, осуществляется: либо одним, либо двойным нажатием по нему левой кнопкой мыши в граф. режиме, либо введя в терминале строчку "./Compile.sh", без ковычек.

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

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

    Выставляем права на исполнение скрипта:

    Code: Select all

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

    Code: Select all

    app_name=window       # имя программы window.
    compile_mode=2        # используем динамическую сборку.
    subsys_arg='windows'  # программа будет собираться как графическая (оконная).
    Запуск файла "Compile.sh" на компиляцию, осуществляется: либо одним, либо двойным нажатием по нему левой кнопкой мыши в граф. режиме, либо введя в терминале строчку "./Compile.sh", без ковычек.

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

    Дата выпуска: 02.06.2017
    Last edited by JohnXenox on Tue Sep 19, 2017 4:13 pm, edited 3 times in total.
    The Glass is Always Half Full! :mrgreen:
  • 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).
    Spoiler:

    Code: Select all

    #!/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:

    Code: Select all

    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:

    Code: Select all

    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.

    Code: Select all

    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:

    Code: Select all

    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.

    Code: Select all

    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
    Last edited by JohnXenox on Tue Sep 19, 2017 4:15 pm, edited 2 times in total.
    The Glass is Always Half Full! :mrgreen:
  • Использование образа виртуального жёсткого диска в 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". Вот, собственно сам скрипт:
    Spoiler:

    Code: Select all

    #!/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", но для полноты статьи приведу здесь.

    Описание:

    Code: Select all

    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
    Last edited by JohnXenox on Sun Sep 09, 2018 8:36 pm, edited 2 times in total.
    The Glass is Always Half Full! :mrgreen:
  • 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:
    Spoiler:

    Code: Select all

    #!/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:

    Code: Select all

    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:
  • Разработка в Qemu с использованием общей папки.

    Тест производился на:
    • Ubuntu 18.04 x86_64
    • QEMU v2.11.1.
    • kolibri svn7327

    Краткая справка: Qemu – кроссплатформенный эмулятор аппаратного обеспечения различных платформ. Включает в себя эмуляцию процессоров Intel x86 и устройств ввода-вывода и многое другое.

    Я долго думал, есть ли простой способ писать программы с использованием эмулятора Qemu. Ведь Qemu, загружает операционную систему Колибри, заметно быстрее, чем VirtualBox. Но так, что-то ничего и не придумал. Потом забыл об этом, на некоторое время. А после недавнего стрима от theonlymirage на youtube, где велась разработка программы в реальном времени с использованием Qemu из под Windows, снова задумался и через некоторое время нашёл простой способ. Но, правда, для GNU/Linux, в частности для Ubuntu 18.04 x86_64, потому что она, основная и единственная у меня на жёстком диске (не считая Колибри). Тот же способ, возможно, будет работать и для Windows.

    В общем, после стрима, сидел перед компьютером и думал, думал и сидел, ну и, время от времени, искал в сети полезную информацию. Но ничего полезного не находил. Потом решил заглянуть в man-страницу командой “man qemu-doc”. В терминале читать длинный man, мне лично, не очень удобно, поэтому я решил поискать man или нечто подобное, в сети. В результате, нашёл документацию “QEMU version 3.0.0 User Documentation” и долго её вкуривал. Пока, наконец, не наткнулся на раздел “2.7.8 Virtual Fat Disk Images”, который меня очень заинтересовал.

    Чтобы далеко не ходить, приведу раздел тут:
    2.7.8 Virtual FAT disk images
    QEMU can automatically create a virtual FAT disk image from a directory tree. In order to use it, just type:

    qemu-system-i386 linux.img -hdb fat:/my_directory

    Then you access access to all the files in the /my_directory directory without having to copy them in a disk image or to export them via SAMBA or NFS. The default access is read-only.

    Floppies can be emulated with the :floppy: option:

    qemu-system-i386 linux.img -fda fat:floppy:/my_directory

    A read/write support is available for testing (beta stage) with the :rw: option:

    qemu-system-i386 linux.img -fda fat:floppy:rw:/my_directory

    What you should never do:
    • use non-ASCII filenames ;
    • use "-snapshot" together with ":rw:" ;
    • expect it to work when loadvm’ing ;
    • write to the FAT directory on the host system while accessing it with the guest system.
    Попробовал сделать примерно то же самое у себя на компьютере с поправкой на Колибри, но как обычно, с наскока, у меня ничего не вышло. Тогда я вспомнил, что если в GNU/Linux что-то не работает в режиме обычного пользователя, то всё дело частенько заключается, либо в чей-то ошибке, либо в разграничении прав пользователей. Тогда, я сначала стал проверять командную строку, и там, вроде как, всё было верно. Затем, я залез в файл “/etc/groups”. Открыл его обычным текстовым редактором и вписал своего пользователя в группу “kvm”.

    Узнать текущего пользователя можно командой:

    Code: Select all

    echo $USER
    Далее, создал папку "Temp" и в ней, создал папку с именем “my_directory”, как было в написано в документации на Qemu, в папке своего пользователя.

    Code: Select all

    mkdir {Temp,Temp/my_directory}
    Затем перешёл в папку Temp.

    Code: Select all

    cd Temp
    И на всякий случай выставил права на создание и удаление файлов в папке для своего пользователя.

    Code: Select all

    chmod u+rwx my_directory && chmod g+rwx my_directory
    В папку “my_directory”, для теста, записал несколько файлов разного размера, что в сумме составляло порядка 500 Мибибайт. И тут, к моему удивлению, всё сработало идеально.

    Вот простейшая команда на запуск Qemu с общей папкой:

    Code: Select all

    qemu-system-i386 -enable-kvm -m 256 -boot a -fda kolibri.img -hda fat:rw:./my_directory
    Внимание! Должен заметить, что в документации написано, что опция "rw:" тестовая. Поэтому надо бать остороженее и делать своевременно резервную копию вашего проекта.

    Вот снимок с экрана:
    Image

    Всё.

    Дата выпуска: 09.09.2018
    Last edited by JohnXenox on Mon Oct 08, 2018 10:09 pm, edited 7 times in total.
    The Glass is Always Half Full! :mrgreen:
  • Who is online

    Users browsing this forum: No registered users and 7 guests