mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-06 15:28:52 +08:00
The px4_os_add_flags defined in cmake/posix/px4_impl_posix.cmake did add (threading) libraries to added_exe_linker_flags, which subsequently end up in CMAKE_EXE_LINKER_FLAGS and then have no effect because those flags are passed to the linker before any of the object files and static libraries. Those libraries are already added correctly in the corresponding src/firmware/*/CMakeLists.txt files (for qurt, nuttx AND posix). I left in the non-library linker flag '-pthread' for the bebop board, although it seems very weird to me that this is needed (is it?). If that is needed then it seems weird to link manually (that is, src/firmware/*/CMakeLists.txt) with -lpthread. For linux/g++ -pthread is added to the CXXFLAGS as it should be: this causes the compiler to define _REENTRANT which is needed for (the interface of) certain libraries to become thread-safe. Offically one also can just pass -pthread to the linker, which then causes the right libraries to be linked, but just linking with -lpthread -lm -lrt works too. I ran into this while adding support for libcwd, which explicitly complains that _REENTRANT isn't defined when trying to link with the thread-safe version of libcwd (-lcwd_r) and then tells you to use -pthread.
230 lines
6.8 KiB
CMake
230 lines
6.8 KiB
CMake
############################################################################
|
|
#
|
|
# 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(common/px4_base)
|
|
list(APPEND CMAKE_MODULE_PATH ${PX4_SOURCE_DIR}/cmake/qurt)
|
|
|
|
#=============================================================================
|
|
#
|
|
# px4_qurt_generate_builtin_commands
|
|
#
|
|
# This function generates the builtin_commands.c src for qurt
|
|
#
|
|
# Usage:
|
|
# px4_qurt_generate_builtin_commands(
|
|
# MODULE_LIST <in-list>
|
|
# OUT <file>)
|
|
#
|
|
# Input:
|
|
# MODULE_LIST : list of modules
|
|
#
|
|
# Output:
|
|
# OUT : generated builtin_commands.c src
|
|
#
|
|
# Example:
|
|
# px4_qurt_generate_builtin_commands(
|
|
# OUT <generated-src> 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})
|
|
foreach(property MAIN STACK_MAIN PRIORITY)
|
|
get_target_property(${property} ${module} ${property})
|
|
endforeach()
|
|
if (MAIN)
|
|
set(builtin_apps_string
|
|
"${builtin_apps_string}\tapps[\"${MAIN}\"] = ${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(${PX4_SOURCE_DIR}/cmake/qurt/apps.h_in ${OUT})
|
|
endfunction()
|
|
|
|
#=============================================================================
|
|
#
|
|
# px4_os_add_flags
|
|
#
|
|
# Set the qurt build flags.
|
|
#
|
|
# Usage:
|
|
# px4_os_add_flags(
|
|
# C_FLAGS <inout-variable>
|
|
# CXX_FLAGS <inout-variable>
|
|
# OPTIMIZATION_FLAGS <inout-variable>
|
|
# EXE_LINKER_FLAGS <inout-variable>
|
|
# INCLUDE_DIRS <inout-variable>
|
|
# LINK_DIRS <inout-variable>
|
|
# DEFINITIONS <inout-variable>)
|
|
#
|
|
# 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
|
|
# OPTIMIZATION_FLAGS : optimization compile flags variable
|
|
# EXE_LINKER_FLAGS : executable linker flags variable
|
|
# INCLUDE_DIRS : include directories
|
|
# LINK_DIRS : link directories
|
|
# DEFINITIONS : definitions
|
|
#
|
|
# Note that EXE_LINKER_FLAGS is not suitable for adding libraries because
|
|
# these flags are added before any of the object files and static libraries.
|
|
# Add libraries in src/firmware/qurt/CMakeLists.txt.
|
|
#
|
|
# Example:
|
|
# px4_os_add_flags(
|
|
# C_FLAGS CMAKE_C_FLAGS
|
|
# CXX_FLAGS CMAKE_CXX_FLAGS
|
|
# OPTIMIZATION_FLAGS optimization_flags
|
|
# EXE_LINKER_FLAG CMAKE_EXE_LINKER_FLAGS
|
|
# INCLUDES <list>)
|
|
#
|
|
function(px4_os_add_flags)
|
|
|
|
set(inout_vars
|
|
C_FLAGS CXX_FLAGS OPTIMIZATION_FLAGS EXE_LINKER_FLAGS INCLUDE_DIRS LINK_DIRS DEFINITIONS)
|
|
|
|
px4_parse_function_args(
|
|
NAME px4_os_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}
|
|
OPTIMIZATION_FLAGS ${OPTIMIZATION_FLAGS}
|
|
EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS}
|
|
INCLUDE_DIRS ${INCLUDE_DIRS}
|
|
LINK_DIRS ${LINK_DIRS}
|
|
DEFINITIONS ${DEFINITIONS})
|
|
|
|
set(DSPAL_ROOT src/lib/DriverFramework/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
|
|
)
|
|
|
|
set(added_definitions
|
|
-D__PX4_QURT
|
|
-D__PX4_POSIX
|
|
-D__QAIC_SKEL_EXPORT=__EXPORT
|
|
-include ${PX4_INCLUDE_DIR}visibility.h
|
|
)
|
|
|
|
# Add the toolchain specific flags
|
|
set(added_cflags -O0)
|
|
set(added_cxx_flags -O0)
|
|
|
|
# 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 <out-list_of_targets>
|
|
# BOARD <in-string>
|
|
# )
|
|
#
|
|
# 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})
|
|
add_custom_target(${OUT} DEPENDS git_driverframework)
|
|
|
|
endfunction()
|
|
|
|
# vim: set noet fenc=utf-8 ff=unix nowrap:
|