• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1include(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>)
89    if(DEFINED ENV{LIB_FUZZING_ENGINE})
90      set_target_properties(${NAME} PROPERTIES LINK_FLAGS
91                                               $ENV{LIB_FUZZING_ENGINE})
92    elseif(DEFINED SANITIZE)
93      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()
116