Add support for benchmark conversion

Convert benchmark executables to add_qt_benchmark().

Currently add_qt_benchmark just calls add_qt_executable() and
ensures that it they build under CMAKE_CURRENT_BUILD_DIR and do not
install.

Add QT_BUILD_BENCHMARKS option to enable/disable building of benchmarks.

Change-Id: Id0bc676698d21d50048d97d9abef51d92ccb6638
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Leander Beernaert 2019-10-28 15:35:47 +01:00
parent 56115dba42
commit cd9813d276
4 changed files with 69 additions and 9 deletions

View File

@ -2351,6 +2351,38 @@ function(add_qt_executable name)
endif()
endfunction()
# Simple wrapper around add_qt_executable for benchmarks which insure that
# the binary is built under ${CMAKE_CURRENT_BINARY_DIR} and never installed.
# See add_qt_executable() for more details.
function(add_qt_benchmark target)
qt_parse_all_arguments(arg "add_qt_benchmark"
"${__add_qt_executable_optional_args}"
"${__add_qt_executable_single_args}"
"${__add_qt_executable_multi_args}"
${ARGN}
)
qt_remove_args(exec_args
ARGS_TO_REMOVE
${target}
OUTPUT_DIRECTORY
INSTALL_DIRECTORY
ALL_ARGS
"${__add_qt_executable_optional_args}"
"${__add_qt_executable_single_args}"
"${__add_qt_executable_multi_args}"
ARGS
${ARGV}
)
add_qt_executable(${target}
NO_INSTALL # we don't install benchmarks
OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" # avoid polluting bin directory
${exec_args}
)
endfunction()
# This function creates a CMake test target with the specified name for use with CTest.
function(add_qt_test name)

View File

@ -159,7 +159,7 @@ macro(qt_build_tests)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/auto/CMakeLists.txt")
add_subdirectory(auto)
endif()
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/CMakeLists.txt")
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/CMakeLists.txt" AND QT_BUILD_BENCHMARKS)
add_subdirectory(benchmarks)
endif()
endmacro()

View File

@ -73,8 +73,16 @@ if(FEATURE_developer_build)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
endif()
set(QT_BUILD_TESTING ON)
set(__build_benchmarks ON)
# Disable benchmarks for single configuration generators which do not build
# with release configuration.
if (CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE STREQUAL Release)
set(__build_benchmarks OFF)
endif()
else()
set(QT_BUILD_TESTING OFF)
set(__build_benchmarks OFF)
endif()
## Set up testing
@ -85,6 +93,9 @@ enable_testing()
# Set up building of examples.
option(BUILD_EXAMPLES "Build Qt examples" ON)
# Build Benchmarks
option(QT_BUILD_BENCHMARKS "Build Qt Benchmarks" ${__build_benchmarks})
## Android platform settings
if(ANDROID)
include(QtPlatformAndroid)

View File

@ -233,6 +233,16 @@ def is_config_test_project(project_file_path: str = "") -> bool:
)
def is_benchmark_project(project_file_path: str = "") -> bool:
qmake_conf_path = find_qmake_conf(project_file_path)
qmake_conf_dir_path = os.path.dirname(qmake_conf_path)
project_relative_path = os.path.relpath(project_file_path, qmake_conf_dir_path)
# If the project file is found in a subdir called 'tests/benchmarks'
# relative to the repo source dir, then it must be benchmark
return project_relative_path.startswith("tests/benchmarks")
@lru_cache(maxsize=None)
def find_qmake_conf(project_file_path: str = "") -> str:
if not os.path.isabs(project_file_path):
@ -2661,22 +2671,29 @@ def write_binary(cm_fh: IO[str], scope: Scope, gui: bool = False, *, indent: int
binary_name = scope.TARGET
assert binary_name
is_benchmark = is_benchmark_project(scope.file_absolute_path)
is_qt_test_helper = "qt_test_helper" in scope.get("_LOADED")
extra = ["GUI"] if gui and not is_qt_test_helper else []
cmake_function_call = "add_qt_executable"
extra_keys = []
if is_qt_test_helper:
binary_name += "_helper"
cmake_function_call = "add_qt_test_helper"
target_path = scope.get_string("target.path")
if target_path:
target_path = replace_path_constants(target_path, scope)
if not scope.get("DESTDIR"):
extra.append(f'OUTPUT_DIRECTORY "{target_path}"')
if "target" in scope.get("INSTALLS"):
extra.append(f'INSTALL_DIRECTORY "{target_path}"')
if is_benchmark:
cmake_function_call = "add_qt_benchmark"
else:
extra_keys = ["target.path", "INSTALLS"]
target_path = scope.get_string("target.path")
if target_path:
target_path = replace_path_constants(target_path, scope)
if not scope.get("DESTDIR"):
extra.append(f'OUTPUT_DIRECTORY "{target_path}"')
if "target" in scope.get("INSTALLS"):
extra.append(f'INSTALL_DIRECTORY "{target_path}"')
write_main_part(
cm_fh,
@ -2687,7 +2704,7 @@ def write_binary(cm_fh: IO[str], scope: Scope, gui: bool = False, *, indent: int
extra_lines=extra,
indent=indent,
known_libraries={"Qt::Core"},
extra_keys=["target.path", "INSTALLS"],
extra_keys=extra_keys,
)
return binary_name