blob: 85ada3befe37d896e64094b7f5b87b9061c67901 [file] [log] [blame]
Ashwin Natesanca68f612022-01-04 13:44:43 +05301include(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>)
Harish Mahendrakarb6680032022-02-09 10:59:16 -080089 if(DEFINED ENV{LIB_FUZZING_ENGINE})
90 set_target_properties(${NAME} PROPERTIES LINK_FLAGS
91 $ENV{LIB_FUZZING_ENGINE})
92 elseif(DEFINED SANITIZE)
Ashwin Natesanca68f612022-01-04 13:44:43 +053093 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()