Custom Application Directories

Most people use the generic apps/ directory with NuttX. That is convenient and well-documented. However, it should always be remembered that NuttX is a stand-alone, general-purpose OS and has no dependency on that “canned” application directory.

This page shows how to create your own, custom application directory from scratch.

Creating the Custom Application Directory

Below is a simple example of the minimum custom application directory. It contains only three files: Makefile, Kconfig, and hello.c.

Makefile

The custom application directory must include a Makefile that supports all of the make targets expected by the NuttX build system and must generate an archive called libapps.a in the top-level of the custom directory structure. The minimal required targets for the Makefile look like this:

APPDIR = ${shell pwd}

-include $(TOPDIR)/Make.defs

# files

CSRCS = hello.c
COBJS = hello.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

Kconfig

A Kconfig file must be included, but it need not contain any meaningful configuration options. This file is where you can add application-specific configuration settings if desired. The minimal Kconfig might look like:

# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

hello.c

Your custom application must compile at least one source file to generate the required libapps.a archive. One of these source files must include the main() entry point to the application. That main function (or similarly named entry point) is called after OS initialization completes.

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.

Below is a small “Hello, World!” example, where custom_main() is the application entry point:

#include <stdio.h>

int custom_main(int argc, char *argv[])
{
printf("Hello, World!!\n");
return 0;
}

Building with the Custom Application Directory

In order to build with the new custom application directory, you need the following in your NuttX configuration:

CONFIG_APPS_DIR="../custom-apps"
CONFIG_USER_ENTRYPOINT="custom_main"

Note

You can only access the ../custom-apps/Kconfig file if CONFIG_APPS_DIR is set to ../custom-apps before running make menuconfig. If you start with an existing configuration, you may face a “chicken-and-egg” situation. One workaround is to manually edit the .config file before running make menuconfig.

Alternatively, if you use the tools/configure.sh script, you can specify the custom-apps directory from the command line:

tools/configure.sh -a ../custom_apps <board>:<config>

Afterward, just build NuttX as you normally would. When you run the program that was built with your custom application directory, you should see:

Hello, World!!