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