From 7b6dff7cdc2756f49a2ba46f8915bba40b73492d Mon Sep 17 00:00:00 2001 From: James Goppert Date: Sat, 19 Sep 2015 17:57:54 -0400 Subject: [PATCH] Fix for romfs generation. --- cmake/nuttx/px4_impl_nuttx.cmake | 69 +++++++++++------------- cmake/test/cmake_tester.py | 52 ++++++++++++++++++ src/firmware/nuttx/CMakeLists.txt | 15 ++++-- src/modules/px4iofirmware/CMakeLists.txt | 6 ++- 4 files changed, 99 insertions(+), 43 deletions(-) create mode 100755 cmake/test/cmake_tester.py diff --git a/cmake/nuttx/px4_impl_nuttx.cmake b/cmake/nuttx/px4_impl_nuttx.cmake index b138e01e40..4bfe3566d0 100644 --- a/cmake/nuttx/px4_impl_nuttx.cmake +++ b/cmake/nuttx/px4_impl_nuttx.cmake @@ -40,7 +40,7 @@ # * px4_nuttx_add_firmware # * px4_nuttx_generate_builtin_commands # * px4_nuttx_add_export -# * px4_nuttx_generate_romfs +# * px4_nuttx_add_romfs # # Required OS Inteface Functions # @@ -295,12 +295,12 @@ endfunction() #============================================================================= # -# px4_nuttx_generate_romfs +# px4_nuttx_add_romfs # -# The functions generates the ROMFS filesystem for nuttx. +# The functions creates a ROMFS filesystem for nuttx. # # Usage: -# px4_nuttx_generate_romfs( +# px4_nuttx_add_romfs( # OUT # ROOT # EXTRAS ) @@ -310,64 +310,58 @@ endfunction() # EXTRAS : list of extra files # # Output: -# OUT : the generated ROMFS +# OUT : the ROMFS library target # # Example: -# px4_nuttx_generate_romfs(OUT my_romfs ROOT "ROMFS/my_board") +# px4_nuttx_add_romfs(OUT my_romfs ROOT "ROMFS/my_board") # -function(px4_nuttx_generate_romfs) +function(px4_nuttx_add_romfs) px4_parse_function_args( - NAME px4_nuttx_generate_romfs + NAME px4_nuttx_add_romfs ONE_VALUE OUT ROOT MULTI_VALUE EXTRAS REQUIRED OUT ROOT ARGN ${ARGN}) set(romfs_temp_dir ${CMAKE_BINARY_DIR}/tmp/${ROOT}) - set(romfs_dest_dir ${CMAKE_BINARY_DIR}/${ROOT}) set(romfs_src_dir ${CMAKE_SOURCE_DIR}/${ROOT}) set(romfs_autostart ${CMAKE_SOURCE_DIR}/Tools/px_process_airframes.py) set(romfs_pruner ${CMAKE_SOURCE_DIR}/Tools/px_romfs_pruner.py) set(bin_to_obj ${CMAKE_SOURCE_DIR}/cmake/nuttx/bin_to_obj.py) + set(extras_dir ${CMAKE_CURRENT_BINARY_DIR}/extras) file(GLOB_RECURSE romfs_src_files ${romfs_src_dir} ${romfs_src_dir}/*) - px4_copy_tracked(OUT romfs_files - FILES ${romfs_src_files} - DEST ${romfs_dest_dir} - RELATIVE ${romfs_src_dir} - ) + set(cmake_test ${CMAKE_SOURCE_DIR}/cmake/test/cmake_tester.py) - if (EXTRAS) - px4_copy_tracked(OUT extra_files - FILES ${EXTRAS} - DEST ${romfs_dest_dir}/extras - RELATIVE ${romfs_src_dir} + + set(extras) + foreach(extra ${EXTRAS}) + get_filename_component(file_name ${extra} NAME) + set(file_dest ${extras_dir}/${file_name}) + add_custom_command(OUTPUT ${file_dest} + COMMAND cmake -E copy ${extra} ${file_dest} + DEPENDS ${extra} ) - list(APPEND romfs_files ${extra_files}) - endif() + list(APPEND extras ${file_dest}) + endforeach() + add_custom_target(collect_extras DEPENDS ${extras}) - add_custom_command(OUTPUT ${romfs_dest_dir}/init.d/rc.autostart - COMMAND ${PYTHON_EXECUTABLE} ${romfs_autostart} - -a ${romfs_src_dir}/init.d - -s ${romfs_dest_dir}/init.d/rc.autostart - ) - list(APPEND romfs_files ${romfs_dest_dir}/init.d/rc.autostart) + message(STATUS "EXTRAS: ${extras}") - add_custom_command(OUTPUT romfs.bin + add_custom_command(OUTPUT romfs.o COMMAND cmake -E remove_directory ${romfs_temp_dir} - COMMAND cmake -E copy_directory ${romfs_dest_dir} ${romfs_temp_dir} + COMMAND cmake -E copy_directory ${romfs_src_dir} ${romfs_temp_dir} + COMMAND cmake -E copy_directory ${extras_dir} ${romfs_temp_dir} + COMMAND ${PYTHON_EXECUTABLE} ${romfs_autostart} + -a ${romfs_temp_dir}/init.d + -s ${romfs_temp_dir}/init.d/rc.autostart COMMAND ${PYTHON_EXECUTABLE} ${romfs_pruner} --folder ${romfs_temp_dir} COMMAND ${GENROMFS} -f ${CMAKE_CURRENT_BINARY_DIR}/romfs.bin -d ${romfs_temp_dir} -V "NSHInitVol" COMMAND cmake -E remove_directory ${romfs_temp_dir} - DEPENDS ${romfs_files} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - - add_custom_command(OUTPUT romfs.o COMMAND ${PYTHON_EXECUTABLE} ${bin_to_obj} --ld ${LD} --c_flags ${CMAKE_C_FLAGS} --c_compiler ${CMAKE_C_COMPILER} @@ -375,11 +369,12 @@ function(px4_nuttx_generate_romfs) --obj romfs.o --var romfs_img --bin romfs.bin - DEPENDS romfs.bin + DEPENDS ${romfs_src_files} ${extras} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - - set(${OUT} romfs.o PARENT_SCOPE) + add_library(${OUT} STATIC romfs.o) + set_target_properties(${OUT} PROPERTIES LINKER_LANGUAGE C) + set(${OUT} ${${OUT}} PARENT_SCOPE) endfunction() diff --git a/cmake/test/cmake_tester.py b/cmake/test/cmake_tester.py new file mode 100755 index 0000000000..34bebacb9d --- /dev/null +++ b/cmake/test/cmake_tester.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +""" +The module facilitates testing in cmake. +It takes a command and a regex for failure ok passing. +It passes if: + * No stderr output. + * Stdout doesn't match failure regex. + * Stdout matches ok regex if given. +""" +from __future__ import print_function +import argparse +import subprocess +import re +import sys + +#pylint: disable=invalid-name + +parser = argparse.ArgumentParser() + +parser.add_argument('cmd') +parser.add_argument('--re-fail') +parser.add_argument('--re-ok') +parser.add_argument('--verbose', '-v', dest='verbose', action='store_true') + +parser.set_defaults(verbose=False) +args = parser.parse_args() + +proc = subprocess.Popen(args.cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) +stdout, stderr = proc.communicate() + +if stderr != "": + print(stderr) + sys.exit(1) + +if args.re_fail is not None: + fail_match = re.search(args.re_fail, stdout) + if fail_match is not None: + print(stdout) + sys.exit(1) + +if args.re_ok is not None: + ok_match = re.search(args.re_ok, stdout) + if re.match(args.re_ok, stdout) is None: + print(stdout) + sys.exit(1) + +if args.verbose: + print(stdout) + +sys.exit(0) + +# vim: set et ft=python fenc=utf-8 ff=unix sts=4 sw=4 ts=4 : diff --git a/src/firmware/nuttx/CMakeLists.txt b/src/firmware/nuttx/CMakeLists.txt index 36132e6f38..bf50a33814 100644 --- a/src/firmware/nuttx/CMakeLists.txt +++ b/src/firmware/nuttx/CMakeLists.txt @@ -5,17 +5,22 @@ px4_nuttx_generate_builtin_commands( ${config_extra_builtin_cmds} ) -px4_nuttx_generate_romfs(OUT romfs.o - ROOT ROMFS/px4fmu_common) +px4_nuttx_add_romfs(OUT romfs + ROOT ROMFS/px4fmu_common + EXTRAS ${CMAKE_BINARY_DIR}/src/modules/px4iofirmware/${config_io_board}_${LABEL}.bin + ) + +add_dependencies(romfs fw_io) # add executable add_executable(firmware_nuttx - builtin_commands.c - romfs.o) + builtin_commands.c) + + set(nuttx_export_dir ${CMAKE_BINARY_DIR}/${BOARD}/NuttX/nuttx-export) set(link_libs - apps nuttx m gcc + romfs apps nuttx m gcc ) if(NOT ${BOARD} STREQUAL "sim") diff --git a/src/modules/px4iofirmware/CMakeLists.txt b/src/modules/px4iofirmware/CMakeLists.txt index 9feed84674..43c59fb2db 100644 --- a/src/modules/px4iofirmware/CMakeLists.txt +++ b/src/modules/px4iofirmware/CMakeLists.txt @@ -129,8 +129,12 @@ target_link_libraries(${fw_io_name} ${config_io_extra_libs} -Wl,--end-group) -px4_nuttx_create_bin(OUT ${fw_io_name}.bin +px4_nuttx_create_bin(OUT ${CMAKE_CURRENT_BINARY_DIR}/${fw_io_name}.bin EXE ${fw_io_name} ) +add_custom_target(fw_io + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${fw_io_name}.bin) + + # vim: set noet ft=cmake fenc=utf-8 ff=unix :