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