diff options
author | Srujan Vandrangi <srujan.vandrangi@ittiam.com> | 2023-05-25 10:33:34 +0530 |
---|---|---|
committer | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2023-05-25 19:05:30 +0530 |
commit | d84f0f4abceadbc318dfdc414f7be6597fa0ad9e (patch) | |
tree | 383e3131773a0644d4beb08db2da41071b001691 | |
parent | dfce659c5712046a171147324ff151474f7fe288 (diff) | |
download | libmpeg2-d84f0f4abceadbc318dfdc414f7be6597fa0ad9e.tar.gz |
add mpeg2_dec_fuzzer build target
Test: Build
-rw-r--r-- | CMakeLists.txt | 15 | ||||
-rw-r--r-- | cmake/utils.cmake | 114 |
2 files changed, 128 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ef4a43..9c810a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,14 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.9.1) +project(libmpeg2 C CXX) +enable_language(ASM) set(MPEG2_ROOT "${CMAKE_CURRENT_SOURCE_DIR}") set(MPEG2_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}") +set(CMAKE_C_COMPILER clang) +set(CMAKE_CXX_COMPILER clang++) +set(CMAKE_BUILD_TYPE Debug) + if("${MPEG2_ROOT}" STREQUAL "${MPEG2_CONFIG_DIR}") message( FATAL_ERROR @@ -93,3 +99,10 @@ add_executable(mpeg2dec ${MPEG2DEC_SRCS}) set_target_properties(mpeg2dec PROPERTIES COMPILE_FLAGS "-DMD5_DISABLE -DPROFILE_ENABLE") target_link_libraries(mpeg2dec libmpeg2dec Threads::Threads) + +include("${MPEG2_ROOT}/cmake/utils.cmake") +libmpeg2_add_compile_options() +libmpeg2_add_definitions() +libmpeg2_set_link_libraries() + +libmpeg2_add_fuzzer(mpeg2_dec_fuzzer libmpeg2dec SOURCES ${MPEG2_ROOT}/fuzzer/mpeg2_dec_fuzzer.cpp)
\ No newline at end of file diff --git a/cmake/utils.cmake b/cmake/utils.cmake new file mode 100644 index 0000000..559ebe6 --- /dev/null +++ b/cmake/utils.cmake @@ -0,0 +1,114 @@ +include(CheckCXXCompilerFlag) + +# Adds compiler options for all targets +function(libmpeg2_add_compile_options) + if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + add_compile_options(-march=armv8-a) + elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") + add_compile_options(-march=armv7-a -mfpu=neon) + else() + add_compile_options(-msse4.2 -mno-avx) + endif() + + set(CMAKE_REQUIRED_FLAGS -fsanitize=fuzzer-no-link) + check_cxx_compiler_flag(-fsanitize=fuzzer-no-link + COMPILER_HAS_SANITIZE_FUZZER) + unset(CMAKE_REQUIRED_FLAGS) + + if(DEFINED SANITIZE) + set(CMAKE_REQUIRED_FLAGS -fsanitize=${SANITIZE}) + check_cxx_compiler_flag(-fsanitize=${SANITIZE} COMPILER_HAS_SANITIZER) + unset(CMAKE_REQUIRED_FLAGS) + + if(NOT COMPILER_HAS_SANITIZER) + message( + FATAL_ERROR "ERROR: Compiler doesn't support -fsanitize=${SANITIZE}") + return() + endif() + add_compile_options(-fno-omit-frame-pointer -fsanitize=${SANITIZE}) + endif() + +endfunction() + +# Adds defintions for all targets +function(libmpeg2_add_definitions) + if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC -DENABLE_NEON) + elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32") + add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q -DENABLE_NEON + -DDISABLE_NEONINTR) + else() + add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2 + -DDEFAULT_ARCH=D_ARCH_X86_SSE42) + endif() +endfunction() + +# Adds libraries needed for executables +function(libmpeg2_set_link_libraries) + link_libraries(Threads::Threads m) +endfunction() + +# cmake-format: off +# Adds a target for an executable +# +# Arguments: +# NAME: Name of the executatble +# LIB: Library that executable depends on +# SOURCES: Source files +# +# Optional Arguments: +# INCLUDES: Include paths +# LIBS: Additional libraries +# FUZZER: flag to specify if the target is a fuzzer binary +# cmake-format: on + +function(libmpeg2_add_executable NAME LIB) + set(multi_value_args SOURCES INCLUDES LIBS) + set(optional_args FUZZER) + cmake_parse_arguments(ARG "${optional_args}" "${single_value_args}" + "${multi_value_args}" ${ARGN}) + + # Check if compiler supports -fsanitize=fuzzer. If not, skip building fuzzer + # binary + if(ARG_FUZZER) + if(NOT COMPILER_HAS_SANITIZE_FUZZER) + message("Compiler doesn't support -fsanitize=fuzzer. Skipping ${NAME}") + return() + endif() + endif() + + add_executable(${NAME} ${ARG_SOURCES}) + target_include_directories(${NAME} PRIVATE ${ARG_INCLUDES}) + add_dependencies(${NAME} ${LIB} ${ARG_LIBS}) + + target_link_libraries(${NAME} ${LIB} ${ARG_LIBS}) + if(ARG_FUZZER) + target_compile_options(${NAME} + PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17>) + if(DEFINED ENV{LIB_FUZZING_ENGINE}) + set_target_properties(${NAME} PROPERTIES LINK_FLAGS + $ENV{LIB_FUZZING_ENGINE}) + elseif(DEFINED SANITIZE) + set_target_properties(${NAME} PROPERTIES LINK_FLAGS + -fsanitize=fuzzer,${SANITIZE}) + else() + set_target_properties(${NAME} PROPERTIES LINK_FLAGS -fsanitize=fuzzer) + endif() + else() + if(DEFINED SANITIZE) + set_target_properties(${NAME} PROPERTIES LINK_FLAGS + -fsanitize=${SANITIZE}) + endif() + endif() +endfunction() + +# cmake-format: off +# Adds a target for a fuzzer binary +# Calls libhevc_add_executable with all arguments with FUZZER set to 1 +# Arguments: +# Refer to libhevc_add_executable's arguments +# cmake-format: on + +function(libmpeg2_add_fuzzer NAME LIB) + libmpeg2_add_executable(${NAME} ${LIB} FUZZER 1 ${ARGV}) +endfunction() |