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