| ================== |
| Custom Apps How-to |
| ================== |
| |
| NuttX comes with a large number of Apps but, most likely, you will want to add your own. |
| |
| There are various different options for this depending on your requirements. |
| |
| #. Replace the apps/ directory completely |
| #. Extend the apps/ directory to include a new custom directory |
| #. Include an additional custom directory outside of the main source trees |
| |
| The following sections explain these 3 methods using a ``CustomHello.c`` app and |
| the directory ``CustomApps`` as an example. |
| |
| .. Tip:: |
| If you make errors while setting this up and the build fails, it is most likely you'll |
| need to run ``make clean`` and possibly even ``make distclean`` before rebuilding to |
| ensure it works correctly. |
| |
| 1. Replace The Apps/ Directory Completely |
| ========================================= |
| |
| The CustomApps directory need only to contain the minimum three files: |
| |
| * ``Makefile`` |
| * ``Kconfig`` |
| * ``CustomHello.c`` |
| |
| |
| 1.1 Makefile |
| ------------ |
| |
| The custom application directory must include a Makefile to make all of the |
| targets expected by the NuttX build and must generate an archive called |
| libapps.a in the top-level of the custom directory structure. |
| |
| The Makefile has just those minimum required targets: |
| |
| .. code-block:: console |
| |
| APPDIR = ${shell pwd} |
| |
| -include $(TOPDIR)/Make.defs |
| |
| # files |
| |
| CSRCS = CustomHello.c |
| COBJS = CustomHello.o |
| |
| ROOTDEPPATH = --dep-path . |
| |
| # Build targets |
| |
| all: libapps.a |
| .PHONY: dirlinks context preconfig depend clean clean_context distclean |
| .PRECIOUS: libapps$(LIBEXT) |
| |
| # Compile C Files |
| |
| $(COBJS): %$(OBJEXT): %.c |
| $(call COMPILE, $<, $@) |
| |
| # Add object files to the apps archive |
| |
| libapps.a: $(COBJS) |
| $(call ARCHIVE, libapps.a, $(COBJS)) |
| |
| # Create directory links |
| |
| dirlinks: |
| |
| # Setup any special pre-build context |
| |
| context: |
| |
| # Setup any special pre-configuration context |
| |
| preconfig: |
| |
| # Make the dependency file, Make.deps |
| |
| depend: Makefile $(CSRCS) |
| $(Q) $(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) > Make.dep |
| |
| # Clean the results of the last build |
| |
| clean: |
| $(call CLEAN) |
| |
| # Remove the build context and directory links |
| |
| clean_context: |
| |
| # Restore the directory to its original state |
| |
| distclean: clean clean_context |
| $(call DELFILE, Make.dep) |
| |
| # Include dependencies |
| |
| -include Make.dep |
| |
| 1.2 Kconfig |
| ----------- |
| |
| A Kconfig file must be included but need not be populated with any meaningful |
| options. |
| This is a place where you can add settings to generate customized builds of |
| your custom application and/or choose which of your apps to include. |
| |
| In the minimum case, Kconfig is only: |
| |
| .. code-block:: console |
| |
| # For a description of the syntax of this configuration file, |
| # see the file kconfig-language.txt in the NuttX tools repository. |
| # |
| |
| but it is more usual to include at least the basic information any NuttX app |
| requires, as well as anything else your app may need: |
| |
| .. code-block:: console |
| |
| # For a description of the syntax of this configuration file, |
| # see the file kconfig-language.txt in the NuttX tools repository. |
| # |
| |
| config CUSTOM_APPS_MY_APP |
| tristate "My App" |
| default n |
| ---help--- |
| Enable My App |
| |
| if CUSTOM_APPS_MY_APP |
| |
| config CUSTOM_APPS_MY_APP_PROGNAME |
| string "Program name" |
| default "myapp" |
| ---help--- |
| This is the name of the program that will be used when the NSH ELF |
| program is installed. |
| |
| config CUSTOM_APPS_MY_APP_PRIORITY |
| int "My App task priority" |
| default 100 |
| |
| config CUSTOM_APPS_MY_APP_STACKSIZE |
| int "My App stack size" |
| default DEFAULT_TASK_STACKSIZE |
| |
| endif |
| |
| 1.3 CustomHello.c |
| ----------------- |
| |
| The custom application must actually compile some source files in order to generate the required |
| libapps.a archive. One of these source files must include the ``main()`` entry point to the |
| application. |
| |
| The function of this main() entry point simply to bring-up the full application. It is called |
| at the completion of OS initialization. |
| |
| What this application initialization entry point does, how it interacts with the rest of your |
| application, and where the rest of you application code is located is of no concern to the OS. |
| |
| Only this one entry point is needed. |
| |
| For this "Hello, Custom World!" application ``custom_hello()`` is the application entry point: |
| |
| .. code-block:: console |
| |
| #include <stdio.h> |
| |
| int main(int argc, char *argv[]) |
| { |
| printf("Hello, Custom World!!\n"); |
| return 0; |
| } |
| |
| 1.4 Building with the CustomApps Directory |
| ------------------------------------------ |
| |
| In order to build with the new custom configuration, you will need the following in your configuration: |
| |
| :menuselection:`CONFIG_APPS_DIR="../CustomApps"` |
| |
| :menuselection:`CONFIG_INIT_ENTRYPOINT="custom_hello_main"` |
| |
| Note that you can only access the ``../CustomApps/Kconfig`` configuration file if ``CONFIG_APPS_DIR`` is set |
| to ``../CustomApps`` BEFORE ``make menuconfig`` is executed |
| |
| This can be done by |
| |
| * hand-editing the .config file before running make menuconfig, which is rarely a good idea |
| * Using ``kconfig-tweak --set-str CONFIG_APPS_DIR ../CustomApps`` |
| * select the CustomApps directory as a command line option at the time the board is configured: |
| |
| .. code-block:: console |
| |
| ./tools/configure.sh -a ../CustomApps <board>:<config> |
| |
| or |
| |
| .. code-block:: console |
| |
| .tools/configure.sh -l ../CustomBoards/MyCustomBoardName/MyCustomConfig |
| |
| Then build as you normally would. When you execute the custom_hello app you should see: |
| |
| .. code-block:: console |
| |
| Hello, Custom World!! |
| |
| 2. Extend the apps/ directory to include a new custom directory |
| =============================================================== |
| |
| The collection of apps provided in nuttx-apps can be useful, and this method simply |
| extends the directory structure to include your own directory structure. |
| |
| The existing /apps makefile automatically checks for the existence of sub-directories |
| that contain a ``Makefile`` and ``Make.defs`` file. This example assumes there is likely |
| to be more than one custom app, and includes a ``Kconfig`` for the app itself. Inclusion |
| of a ``Kconfig`` allows custom App options to be included in the NuttX configuration |
| system, but is optional. |
| |
| 2.1 Custom Apps Directory |
| ------------------------- |
| |
| Simply create a new directory under the existing apps directory with a name of your choice. |
| This example uses the directory name ``CustomApps``. |
| |
| 2.2 Make.defs |
| ------------- |
| |
| Create this file in the ``CustomApps`` directory, with the following line added: |
| |
| .. code-block:: console |
| |
| include $(wildcard $(APPDIR)/CustomApps/*/Make.defs) |
| |
| 2.3 Makefile |
| ------------ |
| |
| Create a Makefile in the ``CustomApps`` directory, with the following lines added: |
| |
| .. code-block:: console |
| |
| MENUDESC = "Custom Apps" |
| |
| include $(APPDIR)/Directory.mk |
| |
| 2.4 CustomHello App |
| ------------------- |
| |
| Create a sub-directory under the ``CustomApps`` directory called ``CustomHello``. |
| |
| The same ``CustomHello.c`` file as described above should be created here. |
| |
| 2.5 CustomHello Make.defs |
| ------------------------- |
| |
| Create a Make.defs in the ``CustomApps/CustomHello`` directory with the following lines: |
| |
| .. code-block:: console |
| |
| ifneq ($(CONFIG_CUSTOM_APPS_CUSTOM_HELLO),) |
| CONFIGURED_APPS += $(APPDIR)/CustomApps/CustomHello |
| endif |
| |
| |
| 2.6 CustomHello Makefile |
| ------------------------ |
| |
| Create a Makefile in the ``CustomApps/CustomHello`` directory with the following lines: |
| |
| .. code-block:: console |
| |
| include $(APPDIR)/Make.defs |
| |
| # Custom Hello built-in application info |
| |
| PROGNAME = $(CONFIG_CUSTOM_APPS_CUSTOM_HELLO_PROGNAME) |
| PRIORITY = $(CONFIG_CUSTOM_APPS_CUSTOM_HELLO_PRIORITY) |
| STACKSIZE = $(CONFIG_CUSTOM_APPS_CUSTOM_HELLO_STACKSIZE) |
| MODULE = $(CONFIG_CUSTOM_APPS_CUSTOM_HELLO) |
| |
| # Custom Hello |
| |
| MAINSRC = CustomHello.c |
| |
| include $(APPDIR)/Application.mk |
| |
| |
| 2.7 CustomHello Kconfig |
| ----------------------- |
| |
| Create a Kconfig file in the ``CustomApps/CustomHello`` directory, with the following lines. For |
| the purposes of this example, the Kconfig will only cover our single application): |
| |
| .. code-block:: console |
| |
| # |
| # For a description of the syntax of this configuration file, |
| # see the file kconfig-language.txt in the NuttX tools repository. |
| # |
| |
| config CUSTOM_APPS_CUSTOM_HELLO |
| tristate "Custom Hello App" |
| default n |
| ---help--- |
| Enable the Custom Hello App |
| |
| if CUSTOM_APPS_CUSTOM_HELLO |
| |
| config CUSTOM_APPS_CUSTOM_HELLO_PROGNAME |
| string "Program name" |
| default "custom_hello" |
| ---help--- |
| This is the name of the program that will be used when the NSH ELF |
| program is installed. |
| |
| config CUSTOM_APPS_CUSTOM_HELLO_PRIORITY |
| int "Custom Hello task priority" |
| default 100 |
| |
| config CUSTOM_APPS_CUSTOM_HELLO_STACKSIZE |
| int "Custom Hello stack size" |
| default DEFAULT_TASK_STACKSIZE |
| |
| endif |
| |
| 2.8 Build and Run |
| ----------------- |
| |
| Once these files have been created, run a ``make clean`` (you may need to run ``make distclean`` |
| followed by ``make menuconfig``. If successful there will be new Kconfig entries. |
| |
| :menuselection:`Application Configuraration --> Custom Apps --> Custom Hello App` |
| |
| Select the ``Custom Hello App`` and run the usual build process. If successful |
| you can run the newly included ``custom_hello`` app. |
| |
| 3. Include an Additional Custom directory Outside of the Main Source Trees |
| ========================================================================== |
| |
| Thia is similar to the previous approach, but places the ``CustomApps`` directory |
| outside of the default trees. |
| |
| 3.1 Create Custom Apps directory and a Symbolic Link |
| ---------------------------------------------------- |
| |
| Create a directory for the custom apps in a location of your choosing. Then create A |
| symbolic link in the main nuttx/apps directory. |
| |
| This example assumes this has been placed below the top NuttX folder, alongside the |
| default ``apps`` directory, i.e. ``nuttx/CustomApps`` |
| |
| .. code-block:: console |
| |
| $ pwd |
| /home/nuttx |
| $ ls -1 |
| apps |
| CustomBoards |
| nuttx |
| $ mkdir CustomApps |
| $ ls -1 |
| apps |
| CustomApps |
| CustomBoards |
| nuttx |
| $ cd apps |
| $ ln -s ../CustomApps CustomApps |
| |
| 3.2 Make.defs etc. |
| ------------------ |
| |
| Follow all the steps as in sections 2.2 to 2.7 above, creating the exact same files but |
| placing then in the new ``CustomApps`` directory location created as described here. |