/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
//! [building monolith]

    In this tutorial, we build a monolith INTEGRITY project for a Qt example
    application. You can select any Qt example application that uses the
    \l {Supported Qt Modules} {supported Qt modules}.

    Before you can build a monolith INTEGRITY project, you need to prepare your
    build environment for the \c qmake build tool. You can do this by running
    the script \e {~/setEnvironment.sh} that you created in
    \l {Creating Script for Running Exports}.

    Run the following commands in a terminal:

    \badcode
    source ~/setEnvironment.sh
    <Qt installation path>/qtbase/bin/qmake <Qt example application path>/<projectname>.pro
    make
    \endcode

    The \c qmake tool must be called under the Qt installation path
    (<Qt installation path>), where you installed the Qt sources in
    \l {Getting Qt Source Code}.

    <Qt example application path>/<projectname>.pro is the installation path of
    the Qt example application project file that the monolith INTEGRITY project
    will be built for.

    \section1 Building Monolith Project

    To build a monolith INTEGRITY project, create an empty directory for your
    project in your home folder. In the steps below, we use the directory name
    \e {mymonolith}.

    \section2 Defining Project with Project Wizard

    Launch MULTI Launcher and select \uicontrol {File} > \uicontrol
    {Create New Project}. Define your monolith project with Project Wizard:

    \list 1
        \li In the \uicontrol {Project name} tab, fill in the \uicontrol {Directory}
        field with the directory you just created.
        \li Select \uicontrol {Next}.
        \li In the \uicontrol {Operating System} tab, select \e {INTEGRITY}
        from the \uicontrol {Operating System} list.
        \note The \uicontrol {OS Distribution Directory} field must contain your
        INTEGRITY installation directory (in our example, \e{mymonolith}).
        \li Select \uicontrol {Next}.
        \li In the \uicontrol {Processor Family} tab, select \uicontrol {ARM}.
        \li Select \uicontrol {Next}.
        \li In the \uicontrol {Target Board} tab, select \uicontrol {ARM Cortex-A9 Platform }
        from the target board list.
        \li Select \uicontrol {Finish}.
    \endlist

    \image project-wizard

    After selecting \uicontrol {Finish} in Project Wizard, Project Manager is
    opened.

    \section2 Project Manager Settings

    With Project Manager you can define the settings for the monolith project:

    \list 1
        \li In the \uicontrol {Select Item to Add} dialog page, select \uicontrol
        {Monolith} from the \uicontrol {Create New} list.

        \image select-item-to-add

        \li Select \uicontrol {Next}.
        \li In the \uicontrol {Settings for Monolith} dialog, define the settings:
        \list
            \li \uicontrol {Source Code Directory} is your project directory
            (in our example, \e {mymonolith}).
            \li \uicontrol {Project Name} is the name of your project. In our
            example, we use the name \e{myproject}.
            \li \uicontrol {Language} must be \uicontrol {C}. The Qt projects are
            C++ projects, but this will be configured later.
            \li Select \uicontrol {Next}.
            \li \uicontrol {Use Shared Libraries} should not be selected.
            \li Select \uicontrol {Next}.
        \endlist
        \li In the \uicontrol {Configure number of Virtual AddressSpaces} dialog
        page, select the checkbox \uicontrol {Names of Virtual Address Spaces} and
        type \e{galcore}.
        \li Select \uicontrol {Next}.
        \li In the \uicontrol {Settings for Kernel} dialog page, type the name of
        your kernel.
        \li Select \uicontrol {Debugging}, \uicontrol {Dynamic Load} and
        \uicontrol {ResourceManager} from the \uicontrol {Kernel Libraries} list.

        \image kernel-settings

        \li Select \uicontrol {Next}.
        \li In the \uicontrol {Settings for OS Module Selection} dialog page,
        select \uicontrol {File System (User Configured)} and \uicontrol
        {GHnet IPv4 Stack (Virtual)} from the \uicontrol {OS Module} list.
        \li Select \uicontrol {Next}.
        \li In the \uicontrol {Settings for File System (User Configured)} dialog
        page, select a filesystem that your monolith project supports.

        In our example, we have selected \uicontrol {MSDOS FAT} from the
        \uicontrol {Libraries} list.
        \li Select \uicontrol {Finish}.
        \li In the \uicontrol {Settings for Add File System Clients} dialog page,
        select \uicontrol {Finish}.
    \endlist

    \section2 Adding File System Mount Point

    You need to configure the file system to use the first partition of the
    micro SD card. In the MULTI Project Manager view, you see a tree structure
    of your monolith project:

    \list 1
        \li Right-click the file \e {mounttable.c} to open the context menu.
        \li Select \uicontrol {Modify Project} >
        \uicontrol {Add INTEGRITY File System Mount Point}.
        \li In the \uicontrol {Settings for FS MountPoint} dialog, define
        the settings:
        \list
            \li Type \e {/} to \uicontrol {Mount Directory}.
            \li Select \uicontrol {Next}.
            \li \uicontrol {File System Type} is \e {MSDOS FAT}.
            \li Select \uicontrol {Next}.
            \li Select the \uicontrol {Use Physical Device} radio button.
            \li Type \e {SDCardDev1} to the \uicontrol {Device} field.
            \li \uicontrol {Slice} is \e {a}.
            \li Select \uicontrol {Finish}.
        \endlist
    \endlist

    \section2 Galcore VAS Settings

    Next, define the virtual address space (VAS) settings for your project.

    In the MULTI Project Manager view, you see a tree structure of your monolith
    project:

    \list 1
        \li Double-click the .int file in your project (1) (in the steps below,
        \e {myproject.int}).
        \li In the opened window, double-click the galcore virtual address
        space (VAS) area (2).

        \image project-view

        \li \uicontrol {VirtualAddressSpace Options} dialog is opened.
        \li In the \uicontrol {Attributes} tab, select the values defined in
        \l {Values in Attributes Tab}.
        \li Select \uicontrol {OK}.
        \li In the galcore virtual address space area, double-click the
        \uicontrol {Task Initial} area (3).

        \image project-view-2

        \li Select the \uicontrol {Start Automatically} check box.
        \li Select \uicontrol {OK}.
    \endlist

    \section3 Values in Attributes Tab

    Add the following attribute values for the virtual address space:

    \table 80%
        \header \li Attribute \li Value
        \row
            \li Maximum Priority
            \li 255
        \row
            \li Maximum Weight
            \li 255
        \row
            \li Memory Pool Size
            \li 2000P
        \row
            \li Heap Size
            \li 0X2000000
        \row
            \li Heap Extension Reserved Size
            \li 0x20000
        \row
            \li Arguments
            \li Leave blank.
        \header \li Checkbox \li Value
        \row
            \li Create Extra Virtual Memory Regions
            \li Select the checkbox.
    \endtable

    \section2 Editing Galcore Project

    You need to edit a number of files in the monolith project.

    \section3 File galcore.c

    \list 1
        \li Select \e{galcore.c} from the tree structure in the MULTI Project
        Manager view.
        \li Double-click the file to open it for editing.
        \li Add the following code to \e{galcore.c}:

    \badcode
    #include <INTEGRITY.h>
    #include <stdlib.h>
    #include <stdio.h>
    extern Error GalCore_TaskInit(void);
    int main(void) {
        Error E;
        E = GalCore_TaskInit();
        if (E != Success) {
            printf("Failed to start GalCore tasks\n");
        }
        Exit(0);
    }
    \endcode
    \endlist

    \section3 File galcore.gpj

    \list 1
        \li Select \e{galcore.gpj} from the tree structure in the MULTI Project
        Manager view.
        \li Right-click the file to open the context menu.
        \li Select \uicontrol{Edit}.
        \li Add the file \e{libgalcore.a} to \e{galcore.gpj}.
    \endlist

    Contents of \e{galcore.gpj} should be as follows:

    \badcode
    #!gbuild
    #component integrity_virtual_address_space
    [Program]
        -lgalcore
    tgt/INTEGRITY.ld
    galcore.c
    \endcode

    \section3 File kernel.gpj

    \list 1
        \li Select \e{kernel.gpj} from the tree structure in the MULTI Project
        Manager view.
        \li Right-click the file to open the context menu.
        \li Select \uicontrol{Edit}.
        \li Add the file \e{libgalcore-iod.a} to \e{kernel.gpj}.
    \endlist

    Contents of \e{kernel.gpj} should be as follows:

    \badcode
    #!gbuild
    #component integrity_kernel_monolith
    [Program]
        -kernel
        -ldebug
        -lload
        -lres
        -lgalcore-iod
    tgt/default.ld
    myproject_kernel.c
    global_table.c
    \endcode

    \section3 File monolith.gpj

    \list 1
        \li Select \e{monolith.gpj} from the tree structure in the MULTI Project
        Manager view.
        \li Righ-click the file to open the context menu.
        \li Select \uicontrol{Edit}.
        \li Add the additional library directory \e {$(__LIBS_DIR_BASE)/Vivante}.
    \endlist

    Contents of \e{monolith.gpj} should be as follows:

    \badcode
    #!gbuild
    #component integrity_monolith
    [INTEGRITY Application]
        -non_shared
       -I$__OS_DIR/modules/ghs/ghnet2/source/kernel/integrity/ip4server :sourceDir=$__OS_DIR/modules/ghs/ghnet2/source/kernel/integrity/ip4server
       -L$(__LIBS_DIR_BASE)/Vivante
    tgt/default.bsp
    myproject.int
    galcore.gpj [Program]
    myproject_kernel.gpj [Program]
    my_ivfsserver_module.gpj [Program]
    ip4server_module.gpj [Program]
    \endcode

    \section3 .int File

    \list 1
    \li Select the \e {.int} file of your project from the tree structure in the MULTI Project
    Manager view.
    \li Right-click the file to open the context menu.
    \li Select \uicontrol{Edit}.
    \li Add the following lines at the end of the file.

    \note Replace </path/to/your/app/executable> with a path to your application executable.

    \badcode
    AddressSpace
        Name    myappname
        Filename    /path/to/your/app/executable
        MemoryPoolSize 0x2000000
        Language    C++
        HeapSize    0x6000000

        Task Initial
            StackSize    0x30000
            StartIt    true
        EndTask
        HeapExtensionReservedSize    0x2000000
    EndAddressSpace
    \endcode
    \endlist

    \section2 Building monolith.gpj

    Open \e{monolith.gpj} from the tree structure in the MULTI Project Manager
    view. To build the project:

    \list 1
        \li Right-click \e{monolith.gpj} to open the context menu.
        \li Select \uicontrol{Build}.
    \endlist

    Your monolith project is now ready to be packaged for U-Boot.
//! [building monolith]
*/
