diff --git a/CMakeLists.txt b/CMakeLists.txt index c445b7788f..806809ce11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,12 +168,16 @@ endforeach() #============================================================================= # git # +if(${OS} STREQUAL "nuttx") px4_add_git_submodule(TARGET git_nuttx PATH "NuttX") +endif() px4_add_git_submodule(TARGET git_genmsg PATH "Tools/genmsg") px4_add_git_submodule(TARGET git_gencpp PATH "Tools/gencpp") px4_add_git_submodule(TARGET git_mavlink PATH "mavlink/include/mavlink/v1.0") px4_add_git_submodule(TARGET git_gtest PATH "unittets/gtest") +if(NOT ${OS} STREQUAL "nuttx") px4_add_git_submodule(TARGET git_eigen PATH "src/lib/eigen") +endif() add_custom_target(submodule_clean WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} @@ -199,6 +203,7 @@ px4_os_add_flags( INCLUDE_DIRS include_dirs LINK_DIRS link_dirs DEFINITIONS definitions) + px4_join(OUT CMAKE_EXE_LINKER_FLAGS LIST "${exe_linker_flags}" GLUE " ") px4_join(OUT CMAKE_C_FLAGS LIST "${c_flags}" GLUE " ") px4_join(OUT CMAKE_CXX_FLAGS LIST "${cxx_flags}" GLUE " ") diff --git a/cmake/Toolchain-hexagon.cmake b/cmake/Toolchain-hexagon.cmake index 82f6f19ab1..5e5805ba46 100644 --- a/cmake/Toolchain-hexagon.cmake +++ b/cmake/Toolchain-hexagon.cmake @@ -32,7 +32,7 @@ include(CMakeForceCompiler) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) -include(px4_utils) +include(px4_base) if(NOT HEXAGON_TOOLS_ROOT) set(HEXAGON_TOOLS_ROOT /opt/6.4.05) diff --git a/cmake/px4_impl_qurt.cmake b/cmake/px4_impl_qurt.cmake new file mode 100644 index 0000000000..7748ff2ecf --- /dev/null +++ b/cmake/px4_impl_qurt.cmake @@ -0,0 +1,259 @@ +############################################################################ +# +# Copyright (c) 2015 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + + +#============================================================================= +# +# Defined functions in this file +# +# OS Specific Functions +# +# * px4_qurt_add_firmware +# * px4_qurt_generate_builtin_commands +# * px4_qurt_add_export +# * px4_qurt_generate_romfs +# +# Required OS Inteface Functions +# +# * px4_os_add_flags +# * px4_os_prebuild_targets +# + +include(px4_base) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/qurt) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/qurt/configs) +include(qurt_funcs) + +#============================================================================= +# +# px4_qurt_generate_builtin_commands +# +# This function generates the builtin_commands.c src for qurt +# +# Usage: +# px4_qurt_generate_builtin_commands( +# MODULE_LIST +# OUT ) +# +# Input: +# MODULE_LIST : list of modules +# +# Output: +# OUT : generated builtin_commands.c src +# +# Example: +# px4_qurt_generate_builtin_commands( +# OUT MODULE_LIST px4_simple_app) +# +function(px4_qurt_generate_builtin_commands) + px4_parse_function_args( + NAME px4_qurt_generate_builtin_commands + ONE_VALUE OUT + MULTI_VALUE MODULE_LIST + REQUIRED MODULE_LIST OUT + ARGN ${ARGN}) + set(builtin_apps_string) + set(builtin_apps_decl_string) + set(command_count 0) + foreach(module ${MODULE_LIST}) + # default + set(MAIN_DEFAULT MAIN-NOTFOUND) + set(STACK_DEFAULT 1024) + set(PRIORITY_DEFAULT SCHED_PRIORITY_DEFAULT) + foreach(property MAIN STACK PRIORITY) + get_target_property(${property} ${module} ${property}) + if(NOT ${property}) + set(${property} ${${property}_DEFAULT}) + endif() + endforeach() + if (MAIN) + set(builtin_apps_string + "${builtin_apps_string}\t{\"${MAIN}\", ${PRIORITY}, ${STACK}, ${MAIN}_main},\n") + set(builtin_apps_decl_string + "${builtin_apps_decl_string}extern int ${MAIN}_main(int argc, char *argv[]);\n") + math(EXPR command_count "${command_count}+1") + endif() + endforeach() + configure_file(${CMAKE_SOURCE_DIR}/cmake/builtin_commands.c.cmake + ${OUT}) +endfunction() + +#============================================================================= +# +# px4_os_add_flags +# +# Set ths qurt build flags. +# +# Usage: +# px4_os_add_flags( +# C_FLAGS +# CXX_FLAGS +# EXE_LINKER_FLAGS +# INCLUDE_DIRS +# LINK_DIRS +# DEFINITIONS ) +# +# Input: +# BOARD : flags depend on board/qurt config +# +# Input/Output: (appends to existing variable) +# C_FLAGS : c compile flags variable +# CXX_FLAGS : c++ compile flags variable +# EXE_LINKER_FLAGS : executable linker flags variable +# INCLUDE_DIRS : include directories +# LINK_DIRS : link directories +# DEFINITIONS : definitions +# +# Example: +# px4_os_add_flags( +# C_FLAGS CMAKE_C_FLAGS +# CXX_FLAGS CMAKE_CXX_FLAGS +# EXE_LINKER_FLAG CMAKE_EXE_LINKER_FLAGS +# INCLUDES ) +# +function(px4_os_add_flags) + + set(inout_vars + C_FLAGS CXX_FLAGS EXE_LINKER_FLAGS INCLUDE_DIRS LINK_DIRS DEFINITIONS) + + px4_parse_function_args( + NAME px4_add_flags + ONE_VALUE ${inout_vars} BOARD + REQUIRED ${inout_vars} BOARD + ARGN ${ARGN}) + + px4_add_common_flags( + BOARD ${BOARD} + C_FLAGS ${C_FLAGS} + CXX_FLAGS ${CXX_FLAGS} + EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS} + INCLUDE_DIRS ${INCLUDE_DIRS} + LINK_DIRS ${LINK_DIRS} + DEFINITIONS ${DEFINITIONS}) + + set(DSPAL_ROOT src/lib/dspal) + set(added_include_dirs + ${DSPAL_ROOT}/include + ${DSPAL_ROOT}/sys + ${DSPAL_ROOT}/sys/sys + ${DSPAL_ROOT}/mpu_spi/inc + ${DSPAL_ROOT}/uart_esc/inc + src/platforms/qurt/include + src/platforms/posix/include + src/lib/eigen-3.2 + ) + + set(added_definitions + -D__PX4_QURT + -D__PX4_POSIX + -include ${PX4_INCLUDE_DIR}visibility.h + ) + + # Add the toolchain specific flags + set(added_cflags ${QURT_CMAKE_C_FLAGS}) + set(added_cxx_flags ${QURT_CMAKE_CXX_FLAGS}) + + # FIXME @jgoppert - how to work around issues like this? + # Without changing global variables? + # Clear -rdynamic flag which fails for hexagon + set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") + set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + + # output + foreach(var ${inout_vars}) + string(TOLOWER ${var} lower_var) + set(${${var}} ${${${var}}} ${added_${lower_var}} PARENT_SCOPE) + #message(STATUS "qurt: set(${${var}} ${${${var}}} ${added_${lower_var}} PARENT_SCOPE)") + endforeach() + +endfunction() + +#============================================================================= +# +# px4_os_prebuild_targets +# +# This function generates os dependent targets +# +# Usage: +# px4_os_prebuild_targets( +# OUT +# BOARD +# ) +# +# Input: +# BOARD : board +# THREADS : number of threads for building +# +# Output: +# OUT : the target list +# +# Example: +# px4_os_prebuild_targets(OUT target_list BOARD px4fmu-v2) +# +function(px4_os_prebuild_targets) + px4_parse_function_args( + NAME px4_os_prebuild_targets + ONE_VALUE OUT BOARD THREADS + REQUIRED OUT BOARD + ARGN ${ARGN}) +endfunction() + +#============================================================================= +# +# px4_qurt_add_modules +# +# This function adds target modules +# +# Usage: +# px4_os_prebuild_targets( +# OUT +# BOARD +# ) +# +# Input: +# BOARD : board +# +# Output: +# MODULE_LIST : the updated module list +# +# Example: +# px4_qurt_add_modules(MODULE_LIST module_list BOARD hil) +# +function(px4_qurt_add_modules out_modules BOARD) + include(config-qurt-${BOARD}) + set(config_modules) + px4_set_config_modules(config_modules) + set(${out_modules} ${out_modules} ${config_modules} PARENT_SCOPE) +endfunction() + +# vim: set noet fenc=utf-8 ff=unix nowrap: diff --git a/cmake/qurt/configs/config-qurt-hil.cmake b/cmake/qurt/configs/config-qurt-hil.cmake new file mode 100644 index 0000000000..6c68043868 --- /dev/null +++ b/cmake/qurt/configs/config-qurt-hil.cmake @@ -0,0 +1,85 @@ +function(px4_set_config_modules out_module_list) + set(config_module_list + drivers/device + drivers/boards/sitl + drivers/pwm_out_sim + drivers/led + drivers/rgbled + modules/sensors + + # drivers/blinkm + # drivers/ms5611 + + # + # System commands + # + systemcmds/param + systemcmds/mixer + + # + # General system control + # + # modules/mavlink + + # + # Estimation modules (EKF/ SO3 / other filters) + # + # modules/attitude_estimator_ekf + modules/ekf_att_pos_estimator + modules/attitude_estimator_q + modules/position_estimator_inav + + # + # Vehicle Control + # + modules/mc_att_control + modules/mc_pos_control + + # + # Library modules + # + modules/systemlib + modules/systemlib/mixer + modules/uORB + #MODULES += modules/dataman + #MODULES += modules/sdlog2 + #MODULES += modules/simulator + modules/commander + + # + # Libraries + # + lib/mathlib + lib/mathlib/math/filter + lib/geo + lib/geo_lookup + lib/conversion + modules/controllib + + # + # QuRT port + # + platforms/qurt/px4_layer + platforms/posix/work_queue + # platforms/posix/drivers/accelsim + # platforms/posix/drivers/gyrosim + # platforms/posix/drivers/adcsim + # platforms/posix/drivers/barosim + + # + # Unit tests + # + # platforms/qurt/tests/muorb + # platforms/posix/tests/vcdev_test + # platforms/posix/tests/hrt_test + # platforms/posix/tests/wqueue + + # + # sources for muorb over fastrpc + # + modules/muorb/adsp/ + ) + message(STATUS "modules: ${config_module_list}") + set(${out_module_list} ${config_module_list} PARENT_SCOPE) +endfunction() + diff --git a/cmake/qurt/px4_target_impl.cmake b/cmake/qurt/qurt_funcs.cmake similarity index 67% rename from cmake/qurt/px4_target_impl.cmake rename to cmake/qurt/qurt_funcs.cmake index d9d5a65728..c8a2f46a9f 100644 --- a/cmake/qurt/px4_target_impl.cmake +++ b/cmake/qurt/qurt_funcs.cmake @@ -47,66 +47,34 @@ # set(QURT_APPS_HEADER ${CMAKE_BINARY_DIR}/apps.h) -add_git_submodule(dspal src/lib/dspal) -add_git_submodule(eigen src/lib/eigen-3.2) +px4_add_git_submodule(TARGET git_dspal PATH "src/lib/dspal") +px4_add_git_submodule(TARGET git_eigen32 PATH "src/lib/eigen-3.2") -macro(px4_target_set_flags) - list(APPEND EXE_LINK_LIBS - pthread - ) - set(DSPAL_ROOT src/lib/dspal) - include_directories( - ${DSPAL_ROOT}/include - ${DSPAL_ROOT}/sys - ${DSPAL_ROOT}/sys/sys - ${DSPAL_ROOT}/mpu_spi/inc - ${DSPAL_ROOT}/uart_esc/inc - src/platforms/qurt/include - src/platforms/posix/include - src/lib/eigen-3.2 - ) - add_definitions( - -D__PX4_QURT - -D__PX4_POSIX - -include ${PX4_INCLUDE_DIR}visibility.h - ) - - # Add the toolchain specific flags - set(CMAKE_C_FLAGS ${QURT_CMAKE_C_FLAGS}) - set(CMAKE_CXX_FLAGS ${QURT_CMAKE_CXX_FLAGS}) - set(CMAKE_SHARED_LINKER_FLAGS "") - - message(STATUS "CMAKE_C_FLAGS: -${CMAKE_C_FLAGS}-") - message(STATUS "CMAKE_CXX_FLAGS: -${CMAKE_CXX_FLAGS}-") - - # Clear -rdynamic flag which fails for hexagon - set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") - set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") - -endmacro() - -macro(px4_target_set_modules) - list(APPEND module_directories +function(px4_target_add_modules out_module_directories) + list(APPEND ${out_module_directories} ./src/platforms/qurt/px4_layer ./src/platforms/posix/work_queue + PARENT_SCOPE ) -endmacro() +endfunction() -macro(px4_target_validate_config) - if (${TARGET_NAME} STREQUAL "qurt-hil-simple") - else() +function(px4_target_validate_config) + # FIXME - this can be done in Firmware/CMakeLists.txt + list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/qurt) + + if (NOT EXISTS("${CMAKE_SOURCE_DIR}/cmake/qurt/${TARGET_NAME}.cmake")) message(FATAL_ERROR "not implemented yet: ${TARGET_NAME}") endif() -endmacro() +endfunction() -macro(px4_target_firmware) +function(px4_target_firmware) set(installed_targets) add_library(dspal_main SHARED ./src/platforms/qurt/px4_layer/main.cpp) target_link_libraries(dspal_main ${module_list}) list(APPEND installed_targets dspal_main) -endmacro() +endfunction() -macro(px4_target_rules) +function(px4_target_rules) #============================================================================= # apps # @@ -118,7 +86,7 @@ macro(px4_target_rules) ) add_custom_target(qurt_apps DEPENDS ${QURT_APPS_HEADER}) -endmacro() +endfunction() -macro(px4_target_testing) -endmacro() +function(px4_target_testing) +endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6bf6b25bf7..647797b304 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,35 +1,35 @@ -#============================================================================= -# module subdirectories, need to include first -# -add_subdirectory(./lib) -add_subdirectory(./drivers) -add_subdirectory(./platforms) -add_subdirectory(./systemcmds) -add_subdirectory(./examples) -add_subdirectory(./modules) - #============================================================================= # executable # -# a list of modules that will be linked to main -set(module_list) - -if (${LABEL} STREQUAL "simple") - list(APPEND module_list - drivers__led - drivers__device - platforms__common - modules__systemlib - modules__uORB - examples__px4_simple_app - lib__mathlib__math__filter - lib__conversion - ) -endif() - if (${OS} STREQUAL "nuttx") + #============================================================================= + # module subdirectories, need to include first + # + add_subdirectory(./lib) + add_subdirectory(./drivers) + add_subdirectory(./platforms) + add_subdirectory(./systemcmds) + add_subdirectory(./examples) + add_subdirectory(./modules) + + # a list of modules that will be linked to main + set(module_list) + + if (${LABEL} STREQUAL "simple") + list(APPEND module_list + drivers__led + drivers__device + platforms__common + modules__systemlib + modules__uORB + examples__px4_simple_app + lib__mathlib__math__filter + lib__conversion + ) + endif() + if (${LABEL} STREQUAL "simple") list(APPEND module_list ${module_list_simple}) endif() @@ -70,6 +70,19 @@ if (${OS} STREQUAL "nuttx") px4_add_upload(OUT upload OS ${OS} BOARD ${BOARD} BUNDLE ${CMAKE_CURRENT_BINARY_DIR}/fw_main.px4) + px4_nuttx_generate_romfs(OUT ${CMAKE_CURRENT_BINARY_DIR}/romfs.img + ROOT ${CMAKE_SOURCE_DIR}/ROMFS/px4fmu_common) + +elseif(${OS} STREQUAL "qurt") + set(module_list) + px4_qurt_add_modules(module_list ${BOARD}) + message(STATUS "module list: ${module_list}") + + px4_qurt_generate_builtin_commands( + OUT builtin_commands.c + MODULE_LIST ${module_list}) + + add_executable(mainapp builtin_commands.c) endif() # vim: set noet ft=cmake fenc=utf-8 ff=unix :