1include(CheckCXXCompilerFlag) 2 3# Adds compiler options for all targets 4function(libhevc_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(libhevc_add_definitions) 35 if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") 36 add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC -DENABLE_NEON) 37 elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") 38 add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q -DENABLE_NEON 39 -DDISABLE_NEONINTR) 40 else() 41 add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2 42 -DDEFAULT_ARCH=D_ARCH_X86_SSE42) 43 endif() 44endfunction() 45 46# Adds libraries needed for executables 47function(libhevc_set_link_libraries) 48 link_libraries(Threads::Threads m) 49endfunction() 50 51# cmake-format: off 52# Adds a target for an executable 53# 54# Arguments: 55# NAME: Name of the executatble 56# LIB: Library that executable depends on 57# SOURCES: Source files 58# 59# Optional Arguments: 60# INCLUDES: Include paths 61# LIBS: Additional libraries 62# FUZZER: flag to specify if the target is a fuzzer binary 63# cmake-format: on 64 65function(libhevc_add_executable NAME LIB) 66 set(multi_value_args SOURCES INCLUDES LIBS) 67 set(optional_args FUZZER) 68 cmake_parse_arguments(ARG "${optional_args}" "${single_value_args}" 69 "${multi_value_args}" ${ARGN}) 70 71 # Check if compiler supports -fsanitize=fuzzer. If not, skip building fuzzer 72 # binary 73 if(ARG_FUZZER) 74 if(NOT COMPILER_HAS_SANITIZE_FUZZER) 75 message("Compiler doesn't support -fsanitize=fuzzer. Skipping ${NAME}") 76 return() 77 endif() 78 endif() 79 80 add_executable(${NAME} ${ARG_SOURCES}) 81 target_include_directories(${NAME} PRIVATE ${ARG_INCLUDES}) 82 add_dependencies(${NAME} ${LIB} ${ARG_LIBS}) 83 84 target_link_libraries(${NAME} ${LIB} ${ARG_LIBS}) 85 if(ARG_FUZZER) 86 target_compile_options(${NAME} 87 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17>) 88 if(DEFINED ENV{LIB_FUZZING_ENGINE}) 89 set_target_properties(${NAME} PROPERTIES LINK_FLAGS 90 $ENV{LIB_FUZZING_ENGINE}) 91 elseif(DEFINED SANITIZE) 92 set_target_properties(${NAME} PROPERTIES LINK_FLAGS 93 -fsanitize=fuzzer,${SANITIZE}) 94 else() 95 set_target_properties(${NAME} PROPERTIES LINK_FLAGS -fsanitize=fuzzer) 96 endif() 97 else() 98 if(DEFINED SANITIZE) 99 set_target_properties(${NAME} PROPERTIES LINK_FLAGS 100 -fsanitize=${SANITIZE}) 101 endif() 102 endif() 103endfunction() 104 105# cmake-format: off 106# Adds a target for a fuzzer binary 107# Calls libhevc_add_executable with all arguments with FUZZER set to 1 108# Arguments: 109# Refer to libhevc_add_executable's arguments 110# cmake-format: on 111 112function(libhevc_add_fuzzer NAME LIB) 113 libhevc_add_executable(${NAME} ${LIB} FUZZER 1 ${ARGV}) 114endfunction() 115