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