CMakeLists.txt files for building applications
The CMakeLists.txt file for building an application must contain the following commands:
include (platform/nk)connects theCMakelibrary for working with the NK compiler.project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO") sets the flags of the compiler and linker.- An EDL description of a process class for a program can be generated by using the
generate_edl_file()command. - If the program provides endpoints using an IPC mechanism, the following transport code must be generated:
- idl.h files are generated by the
nk_build_idl_files()command - cdl.h files are generated by the
nk_build_cdl_files()command - edl.h files are generated by the
nk_build_edl_files()command
- idl.h files are generated by the
add_executable (<program name> "<path to the file containing the program source code>")adds the program build target.add_dependencies (<program name> <name of the edl.h file build target>) adds a program build dependency on edl.h file generation.target_link_libraries (<program name> <list of libraries>)determines the libraries that need to be linked with the program during the build.For example, if the program uses file I/O or network I/O, it must be linked with the
${vfs_CLIENT_LIB}transport library.CMakedescriptions of system programs and drivers provided in KasperskyOS Community Edition, and descriptions of their exported variables and properties are located in the corresponding files at/opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/<program name>/<program name>-config.cmake- To automatically add descriptions of IPC channels to the
init.yamlfile when building a solution, you must define theEXTRA_CONNECTIONSproperty and assign it a value with descriptions of the relevant IPC channels.Please note the indentations at the beginning of strings in the
EXTRA_CONNECTIONSproperty. These indentations are necessary to correctly insert values into theinit.yamlfile and must comply with its syntax requirements.Example of creating an IPC channel between a
Clientprocess and aServerprocess:set_target_properties (Client PROPERTIES
EXTRA_CONNECTIONS
" - target: Server
id: server_connection")
When building this solution, the description of this IPC channel will be automatically added to the
init.yamlfile when processing macros of the init.yaml.in template. - To automatically add a list of arguments for the
main()function and a dictionary of environment variables to theinit.yamlfile when building a solution, you must define theEXTRA_ARGSandEXTRA_ENVproperties and assign the appropriate values to them.Note the indentations at the beginning of strings in the
EXTRA_ARGSandEXTRA_ENVproperties. These indentations are necessary to correctly insert values into theinit.yamlfile and must comply with its syntax requirements.Example of sending the
Clientprogram the"-v"argument of themain()function and the environment variableVAR1set toVALUE1:set_target_properties (Client PROPERTIES
EXTRA_ARGS
" - \"-v\""
EXTRA_ENV
" VAR1: VALUE1")
When building this solution, the description of the
main()function argument and the environment variable value will be automatically added to theinit.yamlfile when processing macros of the init.yaml.in template.
Example CMakeLists.txt file for building a simple application
CMakeLists.txt
project (hello)
# Tools for working with the NK compiler.
include (platform/nk)
# Set compile flags.
project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO")
# Define the name of the project that includes the program.
set (LOCAL_MODULE_NAME "example")
# Define the application name.
set (ENTITY_NAME "Hello")
# Please note the contents of the init.yaml.in and security.psl.in templates
# They define program names as ${LOCAL_MODULE_NAME}.${ENTITY_NAME}
# Define the targets that will be used to create the generated files of the program.
set (ENTITY_IDL_TARGET ${ENTITY_NAME}_idl)
set (ENTITY_CDL_TARGET ${ENTITY_NAME}_cdl)
set (ENTITY_EDL_TARGET ${ENTITY_NAME}_edl)
# Define the name of the target that will be used to build the program.
set (APP_TARGET ${ENTITY_NAME}_app)
# Add the idl.h file build target.
nk_build_idl_files (${ENTITY_IDL_TARGET}
NK_MODULE ${LOCAL_MODULE_NAME}
IDL "resources/Hello.idl"
)
# Add the cdl.h file build target.
nk_build_cdl_files (${ENTITY_CDL_TARGET}
IDL_TARGET ${ENTITY_IDL_TARGET}
NK_MODULE ${LOCAL_MODULE_NAME}
CDL "resources/Hello.cdl")
# Add the EDL file build target. The EDL_FILE variable is exported
# and contains the path to the generated EDL file.
generate_edl_file ( ${ENTITY_NAME}
PREFIX ${LOCAL_MODULE_NAME}
)
# Add the edl.h file build target.
nk_build_edl_files (${ENTITY_EDL_TARGET}
NK_MODULE ${LOCAL_MODULE_NAME}
EDL ${EDL_FILE}
)
# Define the target for the program build.
add_executable (${APP_TARGET} "src/hello.c")
# The program name in init.yaml and security.psl must match the name of the executable file
set_target_properties (${APP_TARGET} PROPERTIES OUTPUT_NAME ${ENTITY_NAME})
# Libraries that are linked to the program during the build
target_link_libraries ( ${APP_TARGET}
PUBLIC ${vfs_CLIENT_LIB} # The program uses file I/O
# and must be connected as a client to VFS
)