diff --git a/CMakeLists.txt b/CMakeLists.txt index 7688ff040c..eb1346a423 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,10 @@ file(GLOB _cmake_scripts ${CMAKE_SOURCE_DIR}/cmake/*.cmake) install(FILES ${_cmake_scripts} DESTINATION dpctl/resources/cmake ) +install(FILES + ${CMAKE_SOURCE_DIR}/cmake/dpctl-config.cmake + DESTINATION lib/cmake/dpctl +) if (DPCTL_GENERATE_DOCS) add_subdirectory(docs) diff --git a/cmake/FindDpctl.cmake b/cmake/dpctl-config.cmake similarity index 83% rename from cmake/FindDpctl.cmake rename to cmake/dpctl-config.cmake index 149c75bd51..fa3f136b47 100644 --- a/cmake/FindDpctl.cmake +++ b/cmake/dpctl-config.cmake @@ -6,14 +6,17 @@ # # ``Dpctl_FOUND`` # True if DPCTL was found. -# ``Dpctl_INCLUDE_DIRS`` -# The include directories needed to use Dpctl. +# ``Dpctl_INCLUDE_DIR`` +# The include directory needed to use dpctl. +# ``Dpctl_TENSOR_INCLUDE_DIR`` +# The include directory for tensor kernels implementation. # ``Dpctl_VERSION`` -# The version of DPCTL found. +# The version of dpctl found. # -# The module will also explicitly define one cache variable: +# The module will also explicitly define two cache variables: # # ``Dpctl_INCLUDE_DIR`` +# ``Dpctl_TENSOR_INCLUDE_DIR`` # if(NOT Dpctl_FOUND) @@ -22,7 +25,7 @@ if(NOT Dpctl_FOUND) if(Python_EXECUTABLE) execute_process(COMMAND "${Python_EXECUTABLE}" - -c "import dpctl; print(dpctl.get_include())" + -m dpctl --include-dir OUTPUT_VARIABLE _dpctl_include_dir OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET diff --git a/dpctl/__main__.py b/dpctl/__main__.py index 78c5f7fde0..9b51d74903 100644 --- a/dpctl/__main__.py +++ b/dpctl/__main__.py @@ -15,42 +15,57 @@ # limitations under the License. import argparse +import importlib import os import os.path import platform import sys import warnings -import dpctl - def _dpctl_dir() -> str: - abs_path = os.path.abspath(dpctl.__file__) - dpctl_dir = os.path.dirname(abs_path) - return dpctl_dir + dpctl_dir = importlib.util.find_spec("dpctl").submodule_search_locations[0] + abs_dpctl_dir = os.path.abspath(dpctl_dir) + return abs_dpctl_dir -def print_includes() -> None: +def get_include_dir() -> str: "Prints include flags for dpctl and SyclInterface library" - print("-I " + dpctl.get_include()) + return os.path.join(_dpctl_dir(), "include") -def print_tensor_includes() -> None: +def print_include_flags() -> None: "Prints include flags for dpctl and SyclInterface library" + print("-I " + get_include_dir()) + + +def get_tensor_include_dir() -> str: dpctl_dir = _dpctl_dir() libtensor_dir = os.path.join(dpctl_dir, "tensor", "libtensor", "include") + return libtensor_dir + + +def print_tensor_include_flags() -> None: + "Prints include flags for dpctl and SyclInterface library" + libtensor_dir = get_tensor_include_dir() print("-I " + libtensor_dir) def print_cmake_dir() -> None: "Prints directory with FindDpctl.cmake" dpctl_dir = _dpctl_dir() - print(os.path.join(dpctl_dir, "resources", "cmake")) + cmake_dir = os.path.join(dpctl_dir, "resources", "cmake") + print(cmake_dir) + + +def get_library_dir() -> str: + dpctl_dir = _dpctl_dir() + return dpctl_dir def print_library() -> None: "Prints linker flags for SyclInterface library" - dpctl_dir = _dpctl_dir() + dpctl_dir = get_library_dir() plt = platform.platform() ld_flags = "-L " + dpctl_dir if plt != "Windows": @@ -73,6 +88,8 @@ def _warn_if_any_set(args, li) -> None: def print_lsplatform(verbosity: int) -> None: + import dpctl + dpctl.lsplatform(verbosity=verbosity) @@ -84,11 +101,21 @@ def main() -> None: action="store_true", help="Include flags for dpctl headers.", ) + parser.add_argument( + "--include-dir", + action="store_true", + help="Path to dpctl include directory.", + ) parser.add_argument( "--tensor-includes", action="store_true", help="Include flags for dpctl libtensor headers.", ) + parser.add_argument( + "--tensor-include-dir", + action="store_true", + help="Path to dpctl libtensor include directory.", + ) parser.add_argument( "--cmakedir", action="store_true", @@ -99,6 +126,11 @@ def main() -> None: action="store_true", help="Linker flags for SyclInterface library.", ) + parser.add_argument( + "--library-dir", + action="store_true", + help="Path to directory containing DPCTLSyclInterface library", + ) parser.add_argument( "-f", "--full-list", @@ -139,13 +171,19 @@ def main() -> None: print_lsplatform(0) return if args.includes: - print_includes() + print_include_flags() + if args.include_dir: + print(get_include_dir()) if args.tensor_includes: - print_tensor_includes() + print_tensor_include_flags() + if args.tensor_include_dir: + print(get_tensor_include_dir()) if args.cmakedir: print_cmake_dir() if args.library: print_library() + if args.library_dir: + print(get_library_dir()) if __name__ == "__main__": diff --git a/dpctl/tests/test_service.py b/dpctl/tests/test_service.py index f16ff51227..328e1371a0 100644 --- a/dpctl/tests/test_service.py +++ b/dpctl/tests/test_service.py @@ -173,13 +173,30 @@ def test_syclinterface(): raise RuntimeError("Unsupported system") +def test_main_include_dir(): + res = subprocess.run( + [sys.executable, "-m", "dpctl", "--include-dir"], capture_output=True + ) + assert res.returncode == 0 + assert res.stdout + dir_path = res.stdout.decode("utf-8").strip() + assert os.path.exists(dir_path) + + def test_main_includes(): res = subprocess.run( [sys.executable, "-m", "dpctl", "--includes"], capture_output=True ) assert res.returncode == 0 assert res.stdout - assert res.stdout.decode("utf-8").startswith("-I") + flags = res.stdout.decode("utf-8") + res = subprocess.run( + [sys.executable, "-m", "dpctl", "--include-dir"], capture_output=True + ) + assert res.returncode == 0 + assert res.stdout + dir = res.stdout.decode("utf-8") + assert flags == "-I " + dir def test_main_library(): @@ -191,6 +208,34 @@ def test_main_library(): assert res.stdout.decode("utf-8").startswith("-L") +def test_tensor_includes(): + res = subprocess.run( + [sys.executable, "-m", "dpctl", "--tensor-includes"], + capture_output=True, + ) + assert res.returncode == 0 + assert res.stdout + flags = res.stdout.decode("utf-8") + res = subprocess.run( + [sys.executable, "-m", "dpctl", "--tensor-include-dir"], + capture_output=True, + ) + assert res.returncode == 0 + assert res.stdout + dir = res.stdout.decode("utf-8") + assert flags == "-I " + dir + + +def test_main_library_dir(): + res = subprocess.run( + [sys.executable, "-m", "dpctl", "--library-dir"], capture_output=True + ) + assert res.returncode == 0 + assert res.stdout + dir_path = res.stdout.decode("utf-8").strip() + assert os.path.exists(dir_path) + + def test_cmakedir(): res = subprocess.run( [sys.executable, "-m", "dpctl", "--cmakedir"], capture_output=True @@ -198,7 +243,7 @@ def test_cmakedir(): assert res.returncode == 0 assert res.stdout cmake_dir = res.stdout.decode("utf-8").strip() - assert os.path.exists(os.path.join(cmake_dir, "FindDpctl.cmake")) + assert os.path.exists(os.path.join(cmake_dir, "dpctl-config.cmake")) def test_main_full_list():