1include(CheckCXXCompilerFlag) 2 3# Adds compiler options for all targets 4function(libavc_add_compile_options) 5 if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") 6 add_compile_options(-march=armv8-a) 7 elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") 8 add_compile_options(-march=armv7-a -mfpu=neon) 9 else() 10 add_compile_options(-msse4.2 -mno-avx) 11 endif() 12 13 set(CMAKE_REQUIRED_FLAGS -fsanitize=fuzzer-no-link) 14 check_cxx_compiler_flag(-fsanitize=fuzzer-no-link 15 COMPILER_HAS_SANITIZE_FUZZER) 16 unset(CMAKE_REQUIRED_FLAGS) 17 18 if(DEFINED SANITIZE) 19 set(CMAKE_REQUIRED_FLAGS -fsanitize=${SANITIZE}) 20 check_cxx_compiler_flag(-fsanitize=${SANITIZE} COMPILER_HAS_SANITIZER) 21 unset(CMAKE_REQUIRED_FLAGS) 22 23 if(NOT COMPILER_HAS_SANITIZER) 24 message( 25 FATAL_ERROR "ERROR: Compiler doesn't support -fsanitize=${SANITIZE}") 26 return() 27 endif() 28 add_compile_options(-fno-omit-frame-pointer -fsanitize=${SANITIZE}) 29 endif() 30 31endfunction() 32 33# Adds defintions for all targets 34function(libavc_add_definitions) 35 add_definitions(-DPROFILE_ENABLE -DMD5_DISABLE) 36 37 if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") 38 add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC) 39 elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") 40 add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q) 41 else() 42 add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2 43 -DDEFAULT_ARCH=D_ARCH_X86_SSE42) 44 endif() 45endfunction() 46 47# Adds libraries needed for executables 48function(libavc_set_link_libraries) 49 link_libraries(Threads::Threads m) 50endfunction() 51 52# cmake-format: off 53# Adds a target for an executable 54# 55# Arguments: 56# NAME: Name of the executatble 57# LIB: Library that executable depends on 58# SOURCES: Source files 59# 60# Optional Arguments: 61# INCLUDES: Include paths 62# LIBS: Additional libraries 63# FUZZER: flag to specify if the target is a fuzzer binary 64# cmake-format: on 65 66function(libavc_add_executable NAME LIB) 67 set(multi_value_args SOURCES INCLUDES LIBS) 68 set(optional_args FUZZER) 69 cmake_parse_arguments(ARG "${optional_args}" "${single_value_args}" 70 "${multi_value_args}" ${ARGN}) 71 72 # Check if compiler supports -fsanitize=fuzzer. If not, skip building fuzzer 73 # binary 74 if(ARG_FUZZER) 75 if(NOT COMPILER_HAS_SANITIZE_FUZZER) 76 message("Compiler doesn't support -fsanitize=fuzzer. Skipping ${NAME}") 77 return() 78 endif() 79 endif() 80 81 add_executable(${NAME} ${ARG_SOURCES}) 82 target_include_directories(${NAME} PRIVATE ${ARG_INCLUDES}) 83 add_dependencies(${NAME} ${LIB} ${ARG_LIBS}) 84 85 target_link_libraries(${NAME} ${LIB} ${ARG_LIBS}) 86 if(ARG_FUZZER) 87 target_compile_options(${NAME} 88 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17>) 89 if(DEFINED ENV{LIB_FUZZING_ENGINE}) 90 set_target_properties(${NAME} PROPERTIES LINK_FLAGS 91 $ENV{LIB_FUZZING_ENGINE}) 92 elseif(DEFINED SANITIZE) 93 set_target_properties(${NAME} PROPERTIES LINK_FLAGS 94 -fsanitize=fuzzer,${SANITIZE}) 95 else() 96 set_target_properties(${NAME} PROPERTIES LINK_FLAGS -fsanitize=fuzzer) 97 endif() 98 else() 99 if(DEFINED SANITIZE) 100 set_target_properties(${NAME} PROPERTIES LINK_FLAGS 101 -fsanitize=${SANITIZE}) 102 endif() 103 endif() 104endfunction() 105 106# cmake-format: off 107# Adds a target for a fuzzer binary 108# Calls libavc_add_executable with all arguments with FUZZER set to 1 109# Arguments: 110# Refer to libavc_add_executable's arguments 111# cmake-format: on 112 113function(libavc_add_fuzzer NAME LIB) 114 libavc_add_executable(${NAME} ${LIB} FUZZER 1 ${ARGV}) 115endfunction() 116