#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

set(ALL_LOG4CXX_FUZZERS
    PatternLayoutFuzzer
    XMLLayoutFuzzer
    HTMLLayoutFuzzer 
    JSONLayoutFuzzer
    PatternParserFuzzer
    TimeBasedRollingPolicyFuzzer
    PatternConverterFuzzer
    DOMConfiguratorFuzzer
)

# Get the most recent Git commit ID
execute_process(
    COMMAND git rev-parse HEAD
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_COMMIT_ID
    OUTPUT_STRIP_TRAILING_WHITESPACE)

# If we are building the fuzzers in the OSS-Fuzz environment
# we use their linker flag.
if(DEFINED ENV{LIB_FUZZING_ENGINE})
  set(FUZZER_SANITIZE_FLAGS $ENV{LIB_FUZZING_ENGINE})
  set(FUZZER_COMPILE_DEFINITIONS "-DGIT_COMMIT_ID=\"${GIT_COMMIT_ID}\"")
else()
  set(FUZZER_SANITIZE_FLAGS "-fsanitize=fuzzer,address,signed-integer-overflow")
  set(FUZZER_COMPILE_DEFINITIONS "-DCOMPILE_DEFINITIONS=${FUZZER_SANITIZE_FLAGS}" "-DGIT_COMMIT_ID=\"${GIT_COMMIT_ID}\"")
endif()


if(WIN32)
  include(win32_target_environment_path)
  get_target_environment_path(ESCAPED_PATH)
elseif(CMAKE_BUILD_TYPE)
  string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
  if (UPPER_BUILD_TYPE STREQUAL "DEBUG")
    list(APPEND FUZZER_COMPILE_DEFINITIONS _DEBUG)
  endif()
else()
  list(APPEND FUZZER_COMPILE_DEFINITIONS _DEBUG)
endif()

foreach(fuzzerName IN LISTS ALL_LOG4CXX_FUZZERS)
  set(PROGRAM_NAME "${fuzzerName}-${LOG4CXX_CHAR}")
  add_executable(${PROGRAM_NAME} ${fuzzerName}.cpp)
  target_compile_definitions(${PROGRAM_NAME}
    PRIVATE
      ${FUZZER_COMPILE_DEFINITIONS}
      ${LOG4CXX_COMPILE_DEFINITIONS}
      ${APR_COMPILE_DEFINITIONS}
      ${APR_UTIL_COMPILE_DEFINITIONS})
  target_include_directories(${PROGRAM_NAME}
    PRIVATE
      ${CMAKE_CURRENT_LIST_DIR}
      $<TARGET_PROPERTY:log4cxx,INCLUDE_DIRECTORIES>)
  target_link_libraries(${PROGRAM_NAME}
    PRIVATE
      ${FUZZER_SANITIZE_FLAGS}
      log4cxx
      ${APR_UTIL_LIBRARIES}
      ${EXPAT_LIBRARIES}
      ${APR_LIBRARIES}
      ${APR_SYSTEM_LIBS})
  if(WIN32)
      set_target_properties(${PROGRAM_NAME}
        PROPERTIES
          VS_DEBUGGER_ENVIRONMENT "PATH=${ESCAPED_PATH}"
          VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
          FOLDER Fuzzers)
  endif()
endforeach()
