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