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:
parent
56115dba42
commit
cd9813d276
@ -2351,6 +2351,38 @@ function(add_qt_executable name)
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
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.
|
# This function creates a CMake test target with the specified name for use with CTest.
|
||||||
function(add_qt_test name)
|
function(add_qt_test name)
|
||||||
|
@ -159,7 +159,7 @@ macro(qt_build_tests)
|
|||||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/auto/CMakeLists.txt")
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/auto/CMakeLists.txt")
|
||||||
add_subdirectory(auto)
|
add_subdirectory(auto)
|
||||||
endif()
|
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)
|
add_subdirectory(benchmarks)
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
@ -73,8 +73,16 @@ if(FEATURE_developer_build)
|
|||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
endif()
|
endif()
|
||||||
set(QT_BUILD_TESTING ON)
|
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()
|
else()
|
||||||
set(QT_BUILD_TESTING OFF)
|
set(QT_BUILD_TESTING OFF)
|
||||||
|
set(__build_benchmarks OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
## Set up testing
|
## Set up testing
|
||||||
@ -85,6 +93,9 @@ enable_testing()
|
|||||||
# Set up building of examples.
|
# Set up building of examples.
|
||||||
option(BUILD_EXAMPLES "Build Qt examples" ON)
|
option(BUILD_EXAMPLES "Build Qt examples" ON)
|
||||||
|
|
||||||
|
# Build Benchmarks
|
||||||
|
option(QT_BUILD_BENCHMARKS "Build Qt Benchmarks" ${__build_benchmarks})
|
||||||
|
|
||||||
## Android platform settings
|
## Android platform settings
|
||||||
if(ANDROID)
|
if(ANDROID)
|
||||||
include(QtPlatformAndroid)
|
include(QtPlatformAndroid)
|
||||||
|
@ -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)
|
@lru_cache(maxsize=None)
|
||||||
def find_qmake_conf(project_file_path: str = "") -> str:
|
def find_qmake_conf(project_file_path: str = "") -> str:
|
||||||
if not os.path.isabs(project_file_path):
|
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
|
binary_name = scope.TARGET
|
||||||
assert binary_name
|
assert binary_name
|
||||||
|
|
||||||
|
is_benchmark = is_benchmark_project(scope.file_absolute_path)
|
||||||
|
|
||||||
is_qt_test_helper = "qt_test_helper" in scope.get("_LOADED")
|
is_qt_test_helper = "qt_test_helper" in scope.get("_LOADED")
|
||||||
|
|
||||||
extra = ["GUI"] if gui and not is_qt_test_helper else []
|
extra = ["GUI"] if gui and not is_qt_test_helper else []
|
||||||
cmake_function_call = "add_qt_executable"
|
cmake_function_call = "add_qt_executable"
|
||||||
|
extra_keys = []
|
||||||
|
|
||||||
if is_qt_test_helper:
|
if is_qt_test_helper:
|
||||||
binary_name += "_helper"
|
binary_name += "_helper"
|
||||||
cmake_function_call = "add_qt_test_helper"
|
cmake_function_call = "add_qt_test_helper"
|
||||||
|
|
||||||
target_path = scope.get_string("target.path")
|
if is_benchmark:
|
||||||
if target_path:
|
cmake_function_call = "add_qt_benchmark"
|
||||||
target_path = replace_path_constants(target_path, scope)
|
else:
|
||||||
if not scope.get("DESTDIR"):
|
extra_keys = ["target.path", "INSTALLS"]
|
||||||
extra.append(f'OUTPUT_DIRECTORY "{target_path}"')
|
target_path = scope.get_string("target.path")
|
||||||
if "target" in scope.get("INSTALLS"):
|
if target_path:
|
||||||
extra.append(f'INSTALL_DIRECTORY "{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(
|
write_main_part(
|
||||||
cm_fh,
|
cm_fh,
|
||||||
@ -2687,7 +2704,7 @@ def write_binary(cm_fh: IO[str], scope: Scope, gui: bool = False, *, indent: int
|
|||||||
extra_lines=extra,
|
extra_lines=extra,
|
||||||
indent=indent,
|
indent=indent,
|
||||||
known_libraries={"Qt::Core"},
|
known_libraries={"Qt::Core"},
|
||||||
extra_keys=["target.path", "INSTALLS"],
|
extra_keys=extra_keys,
|
||||||
)
|
)
|
||||||
|
|
||||||
return binary_name
|
return binary_name
|
||||||
|
Loading…
x
Reference in New Issue
Block a user