##
## Copyright (c) 2016, Alliance for Open Media. All rights reserved
##
## This source code is subject to the terms of the BSD 2 Clause License and
## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
## was not distributed with this source code in the LICENSE file, you can
## obtain it at www.aomedia.org/license/software. 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 www.aomedia.org/license/patent.
##
if (NOT 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 ()

  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 ()

  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 ()

  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 ()

  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} ${flags}")
  else ()
    set(target_link_flags "${flags}")
  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 ()

endif ()  # AOM_BUILD_CMAKE_COMPILER_FLAGS_CMAKE_
