px4-firmware/cmake/px4_add_common_flags.cmake

201 lines
5.7 KiB
CMake

############################################################################
#
# Copyright (c) 2018 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.
#
############################################################################
#=============================================================================
#
# px4_add_common_flags
#
# Set the default build flags.
#
# Usage:
# px4_add_common_flags()
#
function(px4_add_common_flags)
add_compile_options(
-g # always build debug symbols
# optimization options
-fdata-sections
-ffunction-sections
-fomit-frame-pointer
-fmerge-all-constants
#-funsafe-math-optimizations # Enables -fno-signed-zeros, -fno-trapping-math, -fassociative-math and -freciprocal-math
-fno-signed-zeros # Allow optimizations for floating-point arithmetic that ignore the signedness of zero
-fno-trapping-math # Compile code assuming that floating-point operations cannot generate user-visible traps
#-fassociative-math # Allow re-association of operands in series of floating-point operations
-freciprocal-math # Allow the reciprocal of a value to be used instead of dividing by the value if this enables optimizations
-fno-math-errno # Do not set errno after calling math functions that are executed with a single instruction, e.g., sqrt
-fno-strict-aliasing
# visibility
-fvisibility=hidden
-include visibility.h
# Warnings
-Wall
-Wextra
-Werror
-Warray-bounds
-Wcast-align
-Wdisabled-optimization
-Wdouble-promotion
-Wfatal-errors
-Wfloat-equal
-Wformat-security
-Winit-self
-Wlogical-op
-Wpointer-arith
-Wshadow
-Wuninitialized
-Wunknown-pragmas
-Wunused-variable
# disabled warnings
-Wno-missing-field-initializers
-Wno-missing-include-dirs # TODO: fix and enable
-Wno-unused-parameter
)
# compiler specific flags
if (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") OR ("${CMAKE_CXX_COMPILER_ID}" MATCHES "AppleClang"))
add_compile_options(
-fcolor-diagnostics # force color for clang (needed for clang + ccache)
-fdiagnostics-absolute-paths # force absolute paths
-Qunused-arguments
-Wno-c99-designator
-Wno-unknown-warning-option
-Wno-unused-const-variable
-Wno-varargs
)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9)
# force color for gcc > 4.9
add_compile_options(-fdiagnostics-color=always)
endif()
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.3)
add_compile_options(-Wno-stringop-truncation)
endif()
add_compile_options(
-fno-builtin-printf
-fno-strength-reduce
-Wformat=1
-Wunused-but-set-variable
-Wno-format-truncation # TODO: fix
)
# -fcheck-new is a no-op for Clang in general
# and has no effect, but can generate a compile
# error for some OS
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fcheck-new>)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
message(FATAL_ERROR "Intel compiler not yet supported")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
message(FATAL_ERROR "MS compiler not yet supported")
endif()
# C only flags
set(c_flags)
list(APPEND c_flags
-fno-common
-Wnested-externs
-Wstrict-prototypes
)
foreach(flag ${c_flags})
add_compile_options($<$<COMPILE_LANGUAGE:C>:${flag}>)
endforeach()
# CXX only flags
set(cxx_flags)
list(APPEND cxx_flags
-Wreorder
# disabled warnings
-Wno-overloaded-virtual # TODO: fix and remove
)
if((NOT CMAKE_BUILD_TYPE STREQUAL FuzzTesting) AND (NOT PX4_CONFIG MATCHES "px4_sitl"))
list(APPEND cxx_flags
-fno-rtti
)
endif()
foreach(flag ${cxx_flags})
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${flag}>)
endforeach()
include_directories(
${PX4_BINARY_DIR}
${PX4_BINARY_DIR}/src/lib
${PX4_SOURCE_DIR}/platforms/${PX4_PLATFORM}/src/px4/${PX4_CHIP_MANUFACTURER}/${PX4_CHIP}/include
${PX4_SOURCE_DIR}/platforms/${PX4_PLATFORM}/src/px4/common/include
${PX4_SOURCE_DIR}/platforms/common
${PX4_SOURCE_DIR}/platforms/common/include
${PX4_SOURCE_DIR}/src
${PX4_SOURCE_DIR}/src/include
${PX4_SOURCE_DIR}/src/lib
${PX4_SOURCE_DIR}/src/lib/matrix
${PX4_SOURCE_DIR}/src/modules
)
if(EXISTS ${PX4_BOARD_DIR}/include)
include_directories(${PX4_BOARD_DIR}/include)
endif()
add_definitions(
-DCONFIG_ARCH_BOARD_${PX4_BOARD_NAME}
-D__CUSTOM_FILE_IO__
-D__STDC_FORMAT_MACROS
)
endfunction()