#
# Copyright (c) 2021, Alliance for Open Media. All rights reserved
#
# This source code is subject to the terms of the BSD 3-Clause Clear License and
# the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
# License was not distributed with this source code in the LICENSE file, you can
# obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  If the Alliance
# for Open Media Patent License 1.0 was not distributed with this source code in
# the PATENTS file, you can obtain it at aomedia.org/license/patent-license/.
#
if(AOM_BUILD_CMAKE_COMPILER_FLAGS_CMAKE_)
  return()
endif() # AOM_BUILD_CMAKE_COMPILER_FLAGS_CMAKE_
set(AOM_BUILD_CMAKE_COMPILER_FLAGS_CMAKE_ 1)

include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include("${AOM_ROOT}/build/cmake/compiler_tests.cmake")

# Strings used to cache flags.
set(AOM_C_FLAGS)
set(AOM_CXX_FLAGS)
set(AOM_EXE_LINKER_FLAGS)
set(AOM_FAILED_C_FLAGS)
set(AOM_FAILED_CXX_FLAGS)

# Sets variable named by $out_is_present to YES in the caller's scope when $flag
# is found in the string variable named by $flag_cache. Sets the var to NO
# otherwise.
function(is_flag_present flag_cache flag out_is_present)
  string(FIND "${${flag_cache}}" "${flag}" flag_pos)
  if(${flag_pos} EQUAL -1)
    set(${out_is_present}
        NO
        PARENT_SCOPE)
  else()
    set(${out_is_present}
        YES
        PARENT_SCOPE)
  endif()
endfunction()

# Appends $flag to $flags. Ignores scope via use of FORCE with set() call.
function(append_flag flags flag)
  string(FIND "${${flags}}" "${flag}" found)
  if(${found} EQUAL -1)
    set(${flags}
        "${${flags}} ${flag}"
        CACHE STRING "" FORCE)
  endif()
endfunction()

# Checks C compiler for support of $c_flag. Adds $c_flag to all
# $CMAKE_C_FLAGS_<CONFIG>s stored in AOM_C_CONFIGS when the compile test passes.
# Caches $c_flag in $AOM_C_FLAGS or $AOM_FAILED_C_FLAGS depending on test
# outcome.
function(add_c_flag_if_supported c_flag)
  if(DEBUG_CMAKE_DISABLE_COMPILER_TESTS)
    return()
  endif()

  is_flag_present(AOM_C_FLAGS "${c_flag}" flag_ok)
  is_flag_present(AOM_FAILED_C_FLAGS "${c_flag}" flag_failed)
  if(${flag_ok} OR ${flag_failed})
    return()
  endif()

  unset(C_FLAG_SUPPORTED CACHE)
  message("Checking C compiler flag support for: " ${c_flag})
  check_c_compiler_flag("${c_flag}" C_FLAG_SUPPORTED)

  if(${C_FLAG_SUPPORTED})
    append_flag(AOM_C_FLAGS "${c_flag}")
    foreach(config ${AOM_C_CONFIGS})
      unset(C_FLAG_FOUND)
      append_flag("${config}" "${c_flag}")
    endforeach()
  else()
    append_flag(AOM_FAILED_C_FLAGS "${c_flag}")
  endif()
endfunction()

# Checks C++ compiler for support of $cxx_flag. Adds $cxx_flag to all
# $CMAKE_CXX_FLAGS_<CONFIG>s stored in AOM_CXX_CONFIGS when the compile test
# passes. Caches $cxx_flag in $AOM_CXX_FLAGS or $AOM_FAILED_CXX_FLAGS depending
# on test outcome.
function(add_cxx_flag_if_supported cxx_flag)
  if(DEBUG_CMAKE_DISABLE_COMPILER_TESTS)
    return()
  endif()

  is_flag_present(AOM_CXX_FLAGS "${cxx_flag}" flag_ok)
  is_flag_present(AOM_FAILED_CXX_FLAGS "${cxx_flag}" flag_failed)
  if(${flag_ok} OR ${flag_failed})
    return()
  endif()

  unset(CXX_FLAG_SUPPORTED CACHE)
  message("Checking C++ compiler flag support for: " ${cxx_flag})
  check_cxx_compiler_flag("${cxx_flag}" CXX_FLAG_SUPPORTED)

  if(${CXX_FLAG_SUPPORTED})
    append_flag(AOM_CXX_FLAGS "${cxx_flag}")
    foreach(config ${AOM_CXX_CONFIGS})
      unset(CXX_FLAG_FOUND)
      append_flag("${config}" "${cxx_flag}")
    endforeach()
  else()
    append_flag(AOM_FAILED_CXX_FLAGS "${cxx_flag}")
  endif()
endfunction()

# Convenience method for adding a flag to both the C and C++ compiler command
# lines.
function(add_compiler_flag_if_supported flag)
  add_c_flag_if_supported(${flag})
  add_cxx_flag_if_supported(${flag})
endfunction()

# Checks C compiler for support of $c_flag and terminates generation when
# support is not present.
function(require_c_flag c_flag update_c_flags)
  if(DEBUG_CMAKE_DISABLE_COMPILER_TESTS)
    return()
  endif()

  is_flag_present(AOM_C_FLAGS "${c_flag}" flag_ok)
  if(${flag_ok})
    return()
  endif()

  if(NOT "${AOM_EXE_LINKER_FLAGS}" STREQUAL "")
    aom_push_var(CMAKE_EXE_LINKER_FLAGS "${AOM_EXE_LINKER_FLAGS}")
  endif()

  unset(HAVE_C_FLAG CACHE)
  message("Checking C compiler flag support for: " ${c_flag})
  check_c_compiler_flag("${c_flag}" HAVE_C_FLAG)
  if(NOT HAVE_C_FLAG)
    message(
      FATAL_ERROR "${PROJECT_NAME} requires support for C flag: ${c_flag}.")
  endif()

  if(NOT "${AOM_EXE_LINKER_FLAGS}" STREQUAL "")
    aom_pop_var(CMAKE_EXE_LINKER_FLAGS)
  endif()

  append_flag(AOM_C_FLAGS "${c_flag}")
  if(update_c_flags)
    foreach(config ${AOM_C_CONFIGS})
      set(${config}
          "${${config}} ${c_flag}"
          CACHE STRING "" FORCE)
    endforeach()
  endif()
endfunction()

# Checks CXX compiler for support of $cxx_flag and terminates generation when
# support is not present.
function(require_cxx_flag cxx_flag update_cxx_flags)
  if(DEBUG_CMAKE_DISABLE_COMPILER_TESTS)
    return()
  endif()

  is_flag_present(AOM_CXX_FLAGS "${cxx_flag}" flag_ok)
  if(${flag_ok})
    return()
  endif()

  if(NOT "${AOM_EXE_LINKER_FLAGS}" STREQUAL "")
    aom_push_var(CMAKE_EXE_LINKER_FLAGS "${AOM_EXE_LINKER_FLAGS}")
  endif()

  unset(HAVE_CXX_FLAG CACHE)
  message("Checking C compiler flag support for: " ${cxx_flag})
  check_cxx_compiler_flag("${cxx_flag}" HAVE_CXX_FLAG)
  if(NOT HAVE_CXX_FLAG)
    message(
      FATAL_ERROR "${PROJECT_NAME} requires support for C flag: ${cxx_flag}.")
  endif()

  if(NOT "${AOM_EXE_LINKER_FLAGS}" STREQUAL "")
    aom_pop_var(CMAKE_EXE_LINKER_FLAGS)
  endif()

  append_flag(AOM_CXX_FLAGS "${cxx_flag}")
  if(update_cxx_flags)
    foreach(config ${AOM_CXX_CONFIGS})
      set(${config}
          "${${config}} ${cxx_flag}"
          CACHE STRING "" FORCE)
    endforeach()
  endif()
endfunction()

# Checks for support of $flag by both the C and CXX compilers. Terminates
# generation when support is not present in both compilers.
function(require_compiler_flag flag update_cmake_flags)
  require_c_flag(${flag} ${update_cmake_flags})
  require_cxx_flag(${flag} ${update_cmake_flags})
endfunction()

# Checks only non-MSVC targets for support of $c_flag and terminates generation
# when support is not present.
function(require_c_flag_nomsvc c_flag update_c_flags)
  if(NOT MSVC)
    require_c_flag(${c_flag} ${update_c_flags})
  endif()
endfunction()

# Checks only non-MSVC targets for support of $cxx_flag and terminates
# generation when support is not present.
function(require_cxx_flag_nomsvc cxx_flag update_cxx_flags)
  if(NOT MSVC)
    require_cxx_flag(${cxx_flag} ${update_cxx_flags})
  endif()
endfunction()

# Checks only non-MSVC targets for support of $flag by both the C and CXX
# compilers. Terminates generation when support is not present in both
# compilers.
function(require_compiler_flag_nomsvc flag update_cmake_flags)
  require_c_flag_nomsvc(${flag} ${update_cmake_flags})
  require_cxx_flag_nomsvc(${flag} ${update_cmake_flags})
endfunction()

# Adds $preproc_def to C compiler command line (as -D$preproc_def) if not
# already present.
function(add_c_preproc_definition preproc_def)
  set(preproc_def "-D${preproc_def}")
  is_flag_present(AOM_C_FLAGS "${preproc_def}" flag_cached)
  if(${flag_cached})
    return()
  endif()

  foreach(config ${AOM_C_CONFIGS})
    set(${config}
        "${${config}} ${preproc_def}"
        CACHE STRING "" FORCE)
  endforeach()
endfunction()

# Adds $preproc_def to CXX compiler command line (as -D$preproc_def) if not
# already present.
function(add_cxx_preproc_definition preproc_def)
  set(preproc_def "-D${preproc_def}")
  is_flag_present(AOM_CXX_FLAGS "${preproc_def}" flag_cached)
  if(${flag_cached})
    return()
  endif()

  foreach(config ${AOM_CXX_CONFIGS})
    set(${config}
        "${${config}} ${preproc_def}"
        CACHE STRING "" FORCE)
  endforeach()
endfunction()

# Adds $preproc_def to C and CXX compiler command line (as -D$preproc_def) if
# not already present.
function(add_preproc_definition preproc_def)
  add_c_preproc_definition(${preproc_def})
  add_cxx_preproc_definition(${preproc_def})
endfunction()

# Adds $flag to assembler command line.
function(append_as_flag flag)
  is_flag_present(AOM_AS_FLAGS "${flag}" flag_cached)
  if(${flag_cached})
    return()
  endif()
  append_flag(AOM_AS_FLAGS "${flag}")
endfunction()

# Adds $flag to the C compiler command line.
function(append_c_flag flag)
  is_flag_present(AOM_C_FLAGS "${flag}" flag_cached)
  if(${flag_cached})
    return()
  endif()

  foreach(config ${AOM_C_CONFIGS})
    append_flag(${config} "${flag}")
  endforeach()
endfunction()

# Adds $flag to the CXX compiler command line.
function(append_cxx_flag flag)
  is_flag_present(AOM_CXX_FLAGS "${flag}" flag_cached)
  if(${flag_cached})
    return()
  endif()

  foreach(config ${AOM_CXX_CONFIGS})
    append_flag(${config} "${flag}")
  endforeach()
endfunction()

# Adds $flag to the C and CXX compiler command lines.
function(append_compiler_flag flag)
  append_c_flag(${flag})
  append_cxx_flag(${flag})
endfunction()

# Adds $flag to the executable linker command line when not present.
function(append_exe_linker_flag flag)
  is_flag_present(AOM_EXE_LINKER_FLAGS "${flag}" flag_cached)
  if(${flag_cached})
    return()
  endif()

  append_flag(AOM_EXE_LINKER_FLAGS "${flag}")
  foreach(config ${AOM_EXE_LINKER_CONFIGS})
    append_flag(${config} "${flag}")
  endforeach()
endfunction()

# Adds $flag to the link flags for $target.
function(append_link_flag_to_target target flag)
  unset(target_link_flags)
  get_target_property(target_link_flags ${target} LINK_FLAGS)

  if(target_link_flags)
    is_flag_present(target_link_flags "${flag}" flag_found)
    if(${flag_found})
      return()
    endif()
    set(target_link_flags "${target_link_flags} ${flag}")
  else()
    set(target_link_flags "${flag}")
  endif()

  set_target_properties(${target} PROPERTIES LINK_FLAGS ${target_link_flags})
endfunction()

# Adds $flag to executable linker flags, and makes sure C/CXX builds still work.
function(require_linker_flag flag)
  if(DEBUG_CMAKE_DISABLE_COMPILER_TESTS)
    return()
  endif()

  append_exe_linker_flag(${flag})

  unset(c_passed)
  aom_check_c_compiles("LINKER_FLAG_C_TEST(${flag})" "" c_passed)
  unset(cxx_passed)
  aom_check_cxx_compiles("LINKER_FLAG_CXX_TEST(${flag})" "" cxx_passed)

  if(NOT c_passed OR NOT cxx_passed)
    message(FATAL_ERROR "Linker flag test for ${flag} failed.")
  endif()
endfunction()

# Appends flags in $AOM_EXTRA_<TYPE>_FLAGS variables to the flags used at build
# time.
function(set_user_flags)

  # Linker flags are handled first because some C/CXX flags require that a
  # linker flag is present at link time.
  if(AOM_EXTRA_EXE_LINKER_FLAGS)
    is_flag_present(AOM_EXE_LINKER_FLAGS "${AOM_EXTRA_EXE_LINKER_FLAGS}"
                    extra_present)
    if(NOT ${extra_present})
      require_linker_flag("${AOM_EXTRA_EXE_LINKER_FLAGS}")
    endif()
  endif()
  if(AOM_EXTRA_AS_FLAGS)

    # TODO(tomfinegan): assembler flag testing would be a good thing to have.
    is_flag_present(AOM_AS_FLAGS "${AOM_EXTRA_AS_FLAGS}" extra_present)
    if(NOT ${extra_present})
      append_flag(AOM_AS_FLAGS "${AOM_EXTRA_AS_FLAGS}")
    endif()
  endif()
  if(AOM_EXTRA_C_FLAGS)
    is_flag_present(AOM_C_FLAGS "${AOM_EXTRA_C_FLAGS}" extra_present)
    if(NOT ${extra_present})
      require_c_flag("${AOM_EXTRA_C_FLAGS}" YES)
    endif()
  endif()
  if(AOM_EXTRA_CXX_FLAGS)
    is_flag_present(AOM_CXX_FLAGS "${AOM_EXTRA_CXX_FLAGS}" extra_present)
    if(NOT ${extra_present})
      require_cxx_flag("${AOM_EXTRA_CXX_FLAGS}" YES)
    endif()
  endif()
endfunction()
