Cmake emits its build.ninja into build/, while configure.py emits build.ninja into ./. test.py uses this difference to choose the directory structure to test. The problem is that vscode will randomly call cmake to understand the directory structure, so we end up with both build.ninja set up. Invert the logic to look for ./build.ninja to determine the mode (instead of build/build.ninja which can exist even if the user uses traditional configuration). It can still happen that a stray ./build.ninja exists (for example due to switching branches), but that is rarer than having vscode auto-create it. Closes scylladb/scylladb#24269
40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
#
|
|
# Copyright (C) 2025-present ScyllaDB
|
|
#
|
|
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
|
|
#
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
__all__ = ["ALL_MODES", "BUILD_DIR", "DEBUG_MODES", "TEST_DIR", "TEST_RUNNER", "TOP_SRC_DIR", "COMBINED_TESTS", "path_to"]
|
|
|
|
|
|
TEST_RUNNER = os.environ.get("SCYLLA_TEST_RUNNER", "pytest")
|
|
|
|
TOP_SRC_DIR = Path(__file__).parent.parent # ScyllaDB's source code root directory
|
|
TEST_DIR = TOP_SRC_DIR / "test"
|
|
BUILD_DIR = TOP_SRC_DIR / "build"
|
|
COMBINED_TESTS = Path('test/boost/combined_tests')
|
|
|
|
ALL_MODES = {
|
|
"debug": "Debug",
|
|
'release': "RelWithDebInfo",
|
|
"dev": "Dev",
|
|
"sanitize": "Sanitize",
|
|
"coverage": "Coverage",
|
|
}
|
|
DEBUG_MODES = {"debug", "sanitize"}
|
|
|
|
|
|
def path_to(mode: str, *components: str) -> str:
|
|
"""Resolve path to built executable."""
|
|
|
|
# cmake places build.ninja in build/, traditional is in ./.
|
|
# We choose to test for traditional, not cmake, because IDEs may
|
|
# invoke cmake to learn the configuration and generate false positives
|
|
if not TOP_SRC_DIR.joinpath("build.ninja").exists():
|
|
*dir_components, basename = components
|
|
return str(BUILD_DIR.joinpath(*dir_components, ALL_MODES[mode], basename))
|
|
return str(BUILD_DIR.joinpath(mode, *components))
|