• px4_impl_posix_cmake学习


      1 ############################################################################
      2 #
      3 # Copyright (c) 2015 PX4 Development Team. All rights reserved.
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 #
      9 # 1. Redistributions of source code must retain the above copyright
     10 #    notice, this list of conditions and the following disclaimer.
     11 # 2. Redistributions in binary form must reproduce the above copyright
     12 #    notice, this list of conditions and the following disclaimer in
     13 #    the documentation and/or other materials provided with the
     14 #    distribution.
     15 # 3. Neither the name PX4 nor the names of its contributors may be
     16 #    used to endorse or promote products derived from this software
     17 #    without specific prior written permission.
     18 #
     19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     22 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     23 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     24 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     25 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     26 # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     27 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     28 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     29 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30 # POSSIBILITY OF SUCH DAMAGE.
     31 #
     32 ############################################################################
     33 
     34 #=============================================================================
     35 #
     36 #    Defined functions in this file
     37 #
     38 #     OS Specific Functions
     39 #
     40 #        * px4_posix_add_firmware
     41 #        * px4_posix_generate_builtin_commands
     42 #        * px4_posix_add_export
     43 #        * px4_posix_generate_romfs
     44 #
     45 #     Required OS Interface Functions
     46 #
     47 #         * px4_os_add_flags
     48 #        * px4_os_prebuild_targets
     49 #
     50 
     51 include(common/px4_base)
     52 list(APPEND CMAKE_MODULE_PATH ${PX4_SOURCE_DIR}/cmake/posix)
     53 
     54 #=============================================================================
     55 #
     56 #    px4_posix_generate_builtin_commands
     57 #
     58 #    This function generates the builtin_commands.c src for posix
     59 #
     60 #    Usage:
     61 #        px4_posix_generate_builtin_commands(
     62 #            MODULE_LIST <in-list>
     63 #            OUT <file>)
     64 #
     65 #    Input:
     66 #        MODULE_LIST    : list of modules
     67 #
     68 #    Output:
     69 #        OUT    : stem of generated apps.cpp/apps.h ("apps")
     70 #
     71 #    Example:
     72 #        px4_posix_generate_builtin_commands(
     73 #            OUT <generated-src> MODULE_LIST px4_simple_app)
     74 #
     75 function(px4_posix_generate_builtin_commands)
     76     px4_parse_function_args(
     77         NAME px4_posix_generate_builtin_commands
     78         ONE_VALUE OUT
     79         MULTI_VALUE MODULE_LIST
     80         REQUIRED MODULE_LIST OUT
     81         ARGN ${ARGN})
     82 
     83     set(builtin_apps_string)
     84     set(builtin_apps_decl_string)
     85     set(command_count 0)
     86     foreach(module ${MODULE_LIST})
     87         # default
     88         set(MAIN_DEFAULT MAIN-NOTFOUND)
     89         set(STACK_DEFAULT 1024)
     90         set(PRIORITY_DEFAULT SCHED_PRIORITY_DEFAULT)
     91         foreach(property MAIN STACK PRIORITY)
     92             get_target_property(${property} ${module} ${property})
     93             if(NOT ${property})
     94                 set(${property} ${${property}_DEFAULT})
     95             endif()
     96         endforeach()
     97         if (MAIN)
     98             set(builtin_apps_string
     99                 "${builtin_apps_string}	apps["${MAIN}"] = ${MAIN}_main;
    ")
    100             set(builtin_apps_decl_string
    101                 "${builtin_apps_decl_string}int ${MAIN}_main(int argc, char *argv[]);
    ")
    102             math(EXPR command_count "${command_count}+1")
    103         endif()
    104     endforeach()
    105     configure_file(${PX4_SOURCE_DIR}/src/platforms/apps.cpp.in ${OUT}.cpp)
    106     configure_file(${PX4_SOURCE_DIR}/src/platforms/apps.h.in ${OUT}.h)
    107 endfunction()
    108 
    109 #=============================================================================
    110 #
    111 #    px4_os_add_flags
    112 #
    113 #    Set the posix build flags.
    114 #
    115 #    Usage:
    116 #        px4_os_add_flags(
    117 #            C_FLAGS <inout-variable>
    118 #            CXX_FLAGS <inout-variable>
    119 #            OPTIMIZATION_FLAGS <inout-variable>
    120 #            EXE_LINKER_FLAGS <inout-variable>
    121 #            INCLUDE_DIRS <inout-variable>
    122 #            LINK_DIRS <inout-variable>
    123 #            DEFINITIONS <inout-variable>)
    124 #
    125 #    Input:
    126 #        BOARD                    : flags depend on board/posix config
    127 #
    128 #    Input/Output: (appends to existing variable)
    129 #        C_FLAGS                    : c compile flags variable
    130 #        CXX_FLAGS                : c++ compile flags variable
    131 #        OPTIMIZATION_FLAGS            : optimization compile flags variable
    132 #        EXE_LINKER_FLAGS            : executable linker flags variable
    133 #        INCLUDE_DIRS                : include directories
    134 #        LINK_DIRS                : link directories
    135 #        DEFINITIONS                : definitions
    136 #
    137 #    Note that EXE_LINKER_FLAGS is not suitable for adding libraries because
    138 #    these flags are added before any of the object files and static libraries.
    139 #    Add libraries in src/firmware/posix/CMakeLists.txt.
    140 #
    141 #    Example:
    142 #        px4_os_add_flags(
    143 #            C_FLAGS CMAKE_C_FLAGS
    144 #            CXX_FLAGS CMAKE_CXX_FLAGS
    145 #            OPTIMIZATION_FLAGS optimization_flags
    146 #            EXE_LINKER_FLAG CMAKE_EXE_LINKER_FLAGS
    147 #            INCLUDES <list>)
    148 #
    149 function(px4_os_add_flags)
    150 
    151     set(inout_vars
    152         C_FLAGS CXX_FLAGS OPTIMIZATION_FLAGS EXE_LINKER_FLAGS INCLUDE_DIRS LINK_DIRS DEFINITIONS)
    153 
    154     px4_parse_function_args(
    155         NAME px4_os_add_flags
    156         ONE_VALUE ${inout_vars} BOARD
    157         REQUIRED ${inout_vars} BOARD
    158         ARGN ${ARGN})
    159 
    160     px4_add_common_flags(
    161         BOARD ${BOARD}
    162         C_FLAGS ${C_FLAGS}
    163         CXX_FLAGS ${CXX_FLAGS}
    164         OPTIMIZATION_FLAGS ${OPTIMIZATION_FLAGS}
    165         EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS}
    166         INCLUDE_DIRS ${INCLUDE_DIRS}
    167         LINK_DIRS ${LINK_DIRS}
    168         DEFINITIONS ${DEFINITIONS})
    169 
    170     set(added_include_dirs
    171         src/platforms/posix/include
    172         )
    173 
    174     # This block sets added_definitions and added_cxx_flags.
    175     if(UNIX AND APPLE)
    176         set(added_definitions
    177             -D__PX4_POSIX
    178             -D__PX4_DARWIN
    179             -D__DF_DARWIN
    180             -Dnoreturn_function=__attribute__((noreturn))
    181             )
    182 
    183         set(added_cxx_flags)
    184 
    185         if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
    186             message(FATAL_ERROR "PX4 Firmware requires XCode 8 or newer on Mac OS. Version installed on this system: ${CMAKE_CXX_COMPILER_VERSION}")
    187         endif()
    188 
    189         EXEC_PROGRAM(uname ARGS -v  OUTPUT_VARIABLE DARWIN_VERSION)
    190         STRING(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION})
    191         # message(STATUS "PX4 Darwin Version: ${DARWIN_VERSION}")
    192         if (DARWIN_VERSION LESS 16)
    193             list(APPEND added_definitions
    194                 -DCLOCK_MONOTONIC=1
    195                 -DCLOCK_REALTIME=0
    196                 -D__PX4_APPLE_LEGACY
    197                 )
    198         endif()
    199 
    200     else()
    201 
    202         set(added_definitions
    203             -D__PX4_POSIX
    204             -D__PX4_LINUX
    205             -D__DF_LINUX
    206             -Dnoreturn_function=__attribute__((noreturn))
    207             )
    208 
    209         # Use -pthread For linux/g++.
    210         set(added_cxx_flags
    211             -pthread
    212             )
    213 
    214     endif()
    215 
    216     set(added_exe_linker_flags)
    217 
    218     # This block sets added_c_flags (appends to others).
    219     if ("${BOARD}" STREQUAL "eagle")
    220 
    221         if ("$ENV{HEXAGON_ARM_SYSROOT}" STREQUAL "")
    222             message(FATAL_ERROR "HEXAGON_ARM_SYSROOT not set")
    223         else()
    224             set(HEXAGON_ARM_SYSROOT $ENV{HEXAGON_ARM_SYSROOT})
    225         endif()
    226 
    227         # Add the toolchain specific flags
    228         set(added_cflags ${POSIX_CMAKE_C_FLAGS} --sysroot=${HEXAGON_ARM_SYSROOT})
    229 
    230         list(APPEND added_cxx_flags
    231             ${POSIX_CMAKE_CXX_FLAGS}
    232             --sysroot=${HEXAGON_ARM_SYSROOT}
    233             )
    234 
    235         list(APPEND added_exe_linker_flags
    236             -Wl,-rpath-link,${HEXAGON_ARM_SYSROOT}/usr/lib
    237             -Wl,-rpath-link,${HEXAGON_ARM_SYSROOT}/lib
    238             --sysroot=${HEXAGON_ARM_SYSROOT}
    239             )
    240     # This block sets added_c_flags (appends to others).
    241     elseif ("${BOARD}" STREQUAL "excelsior")
    242 
    243         if ("$ENV{HEXAGON_ARM_SYSROOT}" STREQUAL "")
    244             message(FATAL_ERROR "HEXAGON_ARM_SYSROOT not set")
    245         else()
    246             set(HEXAGON_ARM_SYSROOT $ENV{HEXAGON_ARM_SYSROOT})
    247         endif()
    248 
    249         # Add the toolchain specific flags
    250 
    251         set(added_cflags ${POSIX_CMAKE_C_FLAGS} --sysroot=${HEXAGON_ARM_SYSROOT}/lib32-apq8096  -mfloat-abi=softfp -mfpu=neon -mthumb-interwork)
    252 
    253         list(APPEND added_cxx_flags
    254             ${POSIX_CMAKE_CXX_FLAGS}
    255             --sysroot=${HEXAGON_ARM_SYSROOT}/lib32-apq8096  -mfloat-abi=softfp -mfpu=neon -mthumb-interwork
    256 
    257             )
    258 
    259         list(APPEND added_exe_linker_flags
    260             -Wl,-rpath-link,${HEXAGON_ARM_SYSROOT}/lib32-apq8096/usr/lib
    261             -Wl,-rpath-link,${HEXAGON_ARM_SYSROOT}/lib32-apq8096/lib
    262 
    263             --sysroot=${HEXAGON_ARM_SYSROOT}/lib32-apq8096  -mfloat-abi=softfp -mfpu=neon -mthumb-interwork
    264 
    265             )
    266     elseif ("${BOARD}" STREQUAL "rpi")
    267         SET(RPI_COMPILE_FLAGS
    268             -mcpu=cortex-a53
    269             -mfpu=neon
    270             -mfloat-abi=hard
    271         )
    272         LIST(APPEND added_c_flags ${RPI_COMPILE_FLAGS})
    273         LIST(APPEND added_cxx_flags ${RPI_COMPILE_FLAGS})
    274 
    275         FIND_PROGRAM(CXX_COMPILER_PATH ${CMAKE_CXX_COMPILER})
    276 
    277         GET_FILENAME_COMPONENT(CXX_COMPILER_PATH ${CXX_COMPILER_PATH} DIRECTORY)
    278         GET_FILENAME_COMPONENT(CXX_COMPILER_PATH "${CXX_COMPILER_PATH}/../" ABSOLUTE)
    279 
    280         IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
    281             set(CLANG_COMPILE_FLAGS
    282                 --target=arm-pc-linux-gnueabihf
    283                 -ccc-gcc-name arm-linux-gnueabihf-gcc
    284                 --sysroot=${CXX_COMPILER_PATH}/arm-linux-gnueabihf/libc
    285                 -I${CXX_COMPILER_PATH}/arm-linux-gnueabihf/libc/usr/include/
    286             )
    287 
    288             set(added_c_flags ${POSIX_CMAKE_C_FLAGS} ${CLANG_COMPILE_FLAGS})
    289             list(APPEND added_cxx_flags ${POSIX_CMAKE_CXX_FLAGS} ${CLANG_COMPILE_FLAGS})
    290             list(APPEND added_exe_linker_flags ${POSIX_CMAKE_EXE_LINKER_FLAGS} ${CLANG_COMPILE_FLAGS}
    291                 -B${CXX_COMPILER_PATH}/arm-linux-gnueabihf/libc/usr/lib
    292                 -L${CXX_COMPILER_PATH}/arm-linux-gnueabihf/libc/usr/lib
    293             )
    294         ENDIF()
    295     endif()
    296 
    297     # output
    298     foreach(var ${inout_vars})
    299         string(TOLOWER ${var} lower_var)
    300         #message(STATUS "posix: set(${${var}} ${${${var}}} ${added_${lower_var}} PARENT_SCOPE)")
    301         set(${${var}} ${${${var}}} ${added_${lower_var}} PARENT_SCOPE)
    302     endforeach()
    303 
    304 endfunction()
    305 
    306 #=============================================================================
    307 #
    308 #    px4_os_prebuild_targets
    309 #
    310 #    This function generates os dependent targets
    311 #
    312 #    Usage:
    313 #        px4_os_prebuild_targets(
    314 #            OUT <out-list_of_targets>
    315 #            BOARD <in-string>
    316 #            )
    317 #
    318 #    Input:
    319 #        BOARD         : board
    320 #        THREADS     : number of threads for building
    321 #
    322 #    Output:
    323 #        OUT    : the target list
    324 #
    325 #    Example:
    326 #        px4_os_prebuild_targets(OUT target_list BOARD px4fmu-v2)
    327 #
    328 function(px4_os_prebuild_targets)
    329     px4_parse_function_args(
    330             NAME px4_os_prebuild_targets
    331             ONE_VALUE OUT BOARD THREADS
    332             REQUIRED OUT BOARD
    333             ARGN ${ARGN})
    334     add_custom_target(${OUT})
    335 endfunction()
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    vue03
    vue02
    vue01
    VMware下Linux配置局域网和外网访问
    以太坊solidity编程常见错误(不定期更新)
    elasticsearch的探索之路
    一个rails项目连多个mongo数据库
    分析rails日志,计算响应率
    PostgreSQL新手上路PG::ConnectionBad (FATAL: Peer authentication failed
    cache目录没有权限
  • 原文地址:https://www.cnblogs.com/ch122633/p/7779074.html
Copyright © 2020-2023  润新知