diff options
Diffstat (limited to 'third_party/aom/build/cmake/compiler_flags.cmake')
-rw-r--r-- | third_party/aom/build/cmake/compiler_flags.cmake | 346 |
1 files changed, 237 insertions, 109 deletions
diff --git a/third_party/aom/build/cmake/compiler_flags.cmake b/third_party/aom/build/cmake/compiler_flags.cmake index ee6d12bd34..aa34b83aef 100644 --- a/third_party/aom/build/cmake/compiler_flags.cmake +++ b/third_party/aom/build/cmake/compiler_flags.cmake @@ -13,53 +13,93 @@ set(AOM_BUILD_CMAKE_COMPILER_FLAGS_CMAKE_ 1) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) +include("${AOM_ROOT}/build/cmake/compiler_tests.cmake") -# Strings used to cache failed C/CXX flags. +# 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) -# Checks C compiler for support of $c_flag. Adds $c_flag to $CMAKE_C_FLAGS when -# the compile test passes. Caches $c_flag in $AOM_FAILED_C_FLAGS when the test -# fails. +# 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) - unset(C_FLAG_FOUND CACHE) - string(FIND "${CMAKE_C_FLAGS}" "${c_flag}" C_FLAG_FOUND) - unset(C_FLAG_FAILED CACHE) - string(FIND "${AOM_FAILED_C_FLAGS}" "${c_flag}" C_FLAG_FAILED) - - if (${C_FLAG_FOUND} EQUAL -1 AND ${C_FLAG_FAILED} EQUAL -1) - 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) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${c_flag}" CACHE STRING "" FORCE) - else () - set(AOM_FAILED_C_FLAGS "${AOM_FAILED_C_FLAGS} ${c_flag}" CACHE STRING "" - FORCE) - endif () + 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 -# $CMAKE_CXX_FLAGS when the compile test passes. Caches $c_flag in -# $AOM_FAILED_CXX_FLAGS when the test fails. +# 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) - unset(CXX_FLAG_FOUND CACHE) - string(FIND "${CMAKE_CXX_FLAGS}" "${cxx_flag}" CXX_FLAG_FOUND) - unset(CXX_FLAG_FAILED CACHE) - string(FIND "${AOM_FAILED_CXX_FLAGS}" "${cxx_flag}" CXX_FLAG_FAILED) - - if (${CXX_FLAG_FOUND} EQUAL -1 AND ${CXX_FLAG_FAILED} EQUAL -1) - unset(CXX_FLAG_SUPPORTED CACHE) - message("Checking CXX compiler flag support for: " ${cxx_flag}) - check_cxx_compiler_flag("${cxx_flag}" CXX_FLAG_SUPPORTED) - if (CXX_FLAG_SUPPORTED) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${cxx_flag}" CACHE STRING "" - FORCE) - else() - set(AOM_FAILED_CXX_FLAGS "${AOM_FAILED_CXX_FLAGS} ${cxx_flag}" CACHE - STRING "" FORCE) - endif () + 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 () @@ -73,47 +113,78 @@ 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) - unset(C_FLAG_FOUND CACHE) - string(FIND "${CMAKE_C_FLAGS}" "${c_flag}" C_FLAG_FOUND) - - if (${C_FLAG_FOUND} EQUAL -1) - 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 (update_c_flags) - set(CMAKE_C_FLAGS "${c_flag} ${CMAKE_C_FLAGS}" CACHE STRING "" FORCE) - endif () + 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) - unset(CXX_FLAG_FOUND CACHE) - string(FIND "${CMAKE_CXX_FLAGS}" "${cxx_flag}" CXX_FLAG_FOUND) - - if (${CXX_FLAG_FOUND} EQUAL -1) - unset(HAVE_CXX_FLAG CACHE) - message("Checking CXX 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 CXX flag: ${cxx_flag}.") - endif () - if (update_cxx_flags) - set(CMAKE_CXX_FLAGS "${cxx_flag} ${CMAKE_CXX_FLAGS}" CACHE STRING "" - FORCE) - endif () + 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_flag flag update_cmake_flags) +function (require_compiler_flag flag update_cmake_flags) require_c_flag(${flag} ${update_cmake_flags}) require_cxx_flag(${flag} ${update_cmake_flags}) endfunction () @@ -137,7 +208,7 @@ 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_flag_nomsvc flag update_cmake_flags) +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 () @@ -145,25 +216,29 @@ endfunction () # Adds $preproc_def to C compiler command line (as -D$preproc_def) if not # already present. function (add_c_preproc_definition preproc_def) - unset(PREPROC_DEF_FOUND CACHE) - string(FIND "${CMAKE_C_FLAGS}" "${preproc_def}" PREPROC_DEF_FOUND) - - if (${PREPROC_DEF_FOUND} EQUAL -1) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${preproc_def}" CACHE STRING "" - FORCE) + 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) - unset(PREPROC_DEF_FOUND CACHE) - string(FIND "${CMAKE_CXX_FLAGS}" "${preproc_def}" PREPROC_DEF_FOUND) - - if (${PREPROC_DEF_FOUND} EQUAL -1) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${preproc_def}" CACHE STRING "" - FORCE) + 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 @@ -175,32 +250,35 @@ endfunction () # Adds $flag to assembler command line. function (append_as_flag flag) - unset(AS_FLAG_FOUND CACHE) - string(FIND "${AOM_AS_FLAGS}" "${flag}" AS_FLAG_FOUND) - - if (${AS_FLAG_FOUND} EQUAL -1) - set(AOM_AS_FLAGS "${AOM_AS_FLAGS} ${flag}" CACHE STRING "" FORCE) + 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) - unset(C_FLAG_FOUND CACHE) - string(FIND "${CMAKE_C_FLAGS}" "${flag}" C_FLAG_FOUND) - - if (${C_FLAG_FOUND} EQUAL -1) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" CACHE STRING "" FORCE) + 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) - unset(CXX_FLAG_FOUND CACHE) - string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" CXX_FLAG_FOUND) - - if (${CXX_FLAG_FOUND} EQUAL -1) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" CACHE STRING "" FORCE) + 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. @@ -209,30 +287,29 @@ function (append_compiler_flag flag) append_cxx_flag(${flag}) endfunction () -# Adds $flag to the executable linker command line. +# Adds $flag to the executable linker command line when not present. function (append_exe_linker_flag flag) - unset(LINKER_FLAG_FOUND CACHE) - string(FIND "${CMAKE_EXE_LINKER_FLAGS}" "${flag}" LINKER_FLAG_FOUND) - - if (${LINKER_FLAG_FOUND} EQUAL -1) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}" CACHE STRING - "" FORCE) + 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 flags) +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) - unset(link_flag_found) - string(FIND "${target_link_flags}" "${flags}" link_flag_found) - - if (NOT ${link_flag_found} EQUAL -1) + 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}") @@ -241,4 +318,55 @@ function (append_link_flag_to_target target flags) 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_ |