diff --git a/.github/workflows/generate-coverage.yaml b/.github/workflows/generate-coverage.yaml index d21da02645..c46af799a8 100644 --- a/.github/workflows/generate-coverage.yaml +++ b/.github/workflows/generate-coverage.yaml @@ -32,9 +32,9 @@ jobs: sudo apt-get install intel-oneapi-compiler-dpcpp-cpp sudo apt-get install intel-oneapi-tbb - - name: Install CMake + - name: Install CMake and Ninja run: | - sudo apt-get install cmake + sudo apt-get install cmake ninja-build - name: Setup Python uses: actions/setup-python@v2 @@ -87,8 +87,18 @@ jobs: source /opt/intel/oneapi/setvars.sh export _SAVED_PATH=${PATH} export PATH=$(dirname $(dirname $(which icx)))/bin-llvm:${PATH} - python setup.py develop -- -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON -DDPCTL_GENERATE_COVERAGE=ON -DDPCTL_BUILD_CAPI_TESTS=ON -DDPCTL_COVERAGE_REPORT_OUTPUT_DIR=$(pwd) - make -C $(find _skbuild -name tests) lcov-genhtml + python setup.py develop -- \ + -G "Ninja" \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_C_COMPILER:PATH=icx \ + -DCMAKE_CXX_COMPILER:PATH=icpx \ + -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON \ + -DDPCTL_GENERATE_COVERAGE=ON \ + -DDPCTL_BUILD_CAPI_TESTS=ON \ + -DDPCTL_COVERAGE_REPORT_OUTPUT_DIR=$(pwd) + pushd $(find _skbuild -name cmake-build) + cmake --build . --target lcov-genhtml || exit 1 + popd export PATH=${_SAVED_PATH} unset _SAVED_PATH python -c "import dpctl; print(dpctl.__version__); dpctl.lsplatform()" || exit 1 @@ -98,7 +108,7 @@ jobs: shell: bash -l {0} run: | sudo gem install coveralls-lcov - pip install coveralls==3.2.0 + pip install coveralls - name: Upload coverage data to coveralls.io shell: bash -l {0} diff --git a/.github/workflows/generate-docs.yml b/.github/workflows/generate-docs.yml index 39bbf2e26a..adf8717192 100644 --- a/.github/workflows/generate-docs.yml +++ b/.github/workflows/generate-docs.yml @@ -35,10 +35,10 @@ jobs: if: ${{ !github.event.pull_request || github.event.action != 'closed' }} run: | sudo apt-get install doxygen - - name: Install CMake + - name: Install CMake and Ninja if: ${{ !github.event.pull_request || github.event.action != 'closed' }} run: | - sudo apt-get install cmake + sudo apt-get install cmake ninja-build - name: Setup Python if: ${{ !github.event.pull_request || github.event.action != 'closed' }} uses: actions/setup-python@v2 @@ -64,7 +64,7 @@ jobs: wget https://github.com/vovkos/doxyrest/releases/download/doxyrest-2.1.2/doxyrest-2.1.2-linux-amd64.tar.xz tar xf doxyrest-2.1.2-linux-amd64.tar.xz python setup.py develop -- \ - -G "Unix Makefiles" \ + -G "Ninja" \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_C_COMPILER:PATH=icx \ -DCMAKE_CXX_COMPILER:PATH=icpx \ diff --git a/.github/workflows/os-llvm-sycl-build.yml b/.github/workflows/os-llvm-sycl-build.yml index 8268bd0683..c1c0329db7 100644 --- a/.github/workflows/os-llvm-sycl-build.yml +++ b/.github/workflows/os-llvm-sycl-build.yml @@ -68,7 +68,7 @@ jobs: - name: Install system components shell: bash -l {0} run: | - sudo apt-get install cmake libtinfo5 + sudo apt-get install cmake ninja-build libtinfo5 - name: Setup Python uses: actions/setup-python@v2 @@ -97,6 +97,6 @@ jobs: export OCL_ICD_FILENAMES=libintelocl.so:libintelocl_emu.so clang++ --version sycl-ls - python setup.py develop -- -G "Unix Makefiles" -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON -DDPCTL_DPCPP_HOME_DIR=$(dirname $(dirname $(which clang))) -DDPCTL_DPCPP_FROM_ONEAPI=OFF + python setup.py develop -- -G Ninja -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON -DDPCTL_DPCPP_HOME_DIR=$(dirname $(dirname $(which clang))) -DDPCTL_DPCPP_FROM_ONEAPI=OFF python -c "import dpctl; dpctl.lsplatform()" || exit 1 SYCL_ENABLE_HOST_DEVICE=1 python -m pytest -v dpctl/tests diff --git a/CMakeLists.txt b/CMakeLists.txt index 8aff7d1d70..858c83c5fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,6 @@ add_subdirectory(libsyclinterface) file(GLOB _dpctl_capi_headers dpctl/apis/include/*.h*) install(FILES ${_dpctl_capi_headers} DESTINATION dpctl/include - COMPONENT DpctlCAPIHeaders ) add_subdirectory(dpctl) diff --git a/conda-recipe/build.sh b/conda-recipe/build.sh index 9d581001fe..5bc85e861e 100755 --- a/conda-recipe/build.sh +++ b/conda-recipe/build.sh @@ -6,7 +6,7 @@ export LDFLAGS="$LDFLAGS -Wl,-rpath,$PREFIX/lib" ${PYTHON} setup.py clean --all -export CMAKE_GENERATOR="Unix Makefiles" +export CMAKE_GENERATOR="Ninja" SKBUILD_ARGS="-- -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON -DDPCTL_DPCPP_HOME_DIR=${BUILD_PREFIX}" echo "${PYTHON} setup.py install ${SKBUILD_ARGS}" diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml index c3087c303a..27322b0030 100644 --- a/conda-recipe/meta.yaml +++ b/conda-recipe/meta.yaml @@ -20,8 +20,7 @@ requirements: - cython - cmake >=3.21 - python - - make # [unix] - - ninja # [win] + - ninja - scikit-build - numpy 1.19 - wheel diff --git a/docs/docfiles/user_guides/QuickStart.rst b/docs/docfiles/user_guides/QuickStart.rst index 8c58acd15a..94b4953ca3 100644 --- a/docs/docfiles/user_guides/QuickStart.rst +++ b/docs/docfiles/user_guides/QuickStart.rst @@ -143,7 +143,7 @@ installed: - ``numpy`` - ``cmake`` - ``scikit-build`` - - ``ninja`` (only on Windows) + - ``ninja`` - ``gtest`` (optional to run C API tests) - ``gmock`` (optional to run C API tests) - ``pytest`` (optional to run Python API tests) @@ -152,15 +152,15 @@ Once the prerequisites are installed, building using ``scikit-build`` involves t .. code-block:: bash - python setup.py install -- -G Unix\ Makefiles -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON + python setup.py install -- -G Ninja -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON , and to develop: .. code-block:: bash - python setup.py develop -G Unix\ Makefiles -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON + python setup.py develop -G Ninja -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON -On Windows, use ``icx`` for both C and CXX compilers, and use :code:`-G Ninja` for cmake generator. +On Windows, use ``icx`` for both C and CXX compilers. Developing on Linux can also be done using driver script: @@ -180,7 +180,7 @@ Following steps in `Build and install with scikit-build`_ use command line optio .. code-block:: bash - python setup.py develop -- -G Unix\ Makefiles -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ONE -DDPCTL_DPCPP_HOME_DIR=${DPCPP_ROOT}/llvm/build -DDPCTL_DPCPP_FROM_ONEAPI=OFF + python setup.py develop -- -G Ninja -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ONE -DDPCTL_DPCPP_HOME_DIR=${DPCPP_ROOT}/llvm/build -DDPCTL_DPCPP_FROM_ONEAPI=OFF Alterantively, the driver script can be used diff --git a/dpctl/CMakeLists.txt b/dpctl/CMakeLists.txt index 3ca3c9a79d..541ef7d5e8 100644 --- a/dpctl/CMakeLists.txt +++ b/dpctl/CMakeLists.txt @@ -2,7 +2,7 @@ find_package(PythonExtensions REQUIRED) find_package(NumPy REQUIRED) -set(CYTHON_FLAGS "-w ${CMAKE_SOURCE_DIR}") +set(CYTHON_FLAGS "-t -w ${CMAKE_SOURCE_DIR}") find_package(Cython REQUIRED) if(WIN32) @@ -78,41 +78,64 @@ add_custom_target(_build_time_create_dpctl_include ALL DEPENDS DPCTLSyclInterface ) +set(_copied_header_files) file(GLOB _syclinterface_h ${CMAKE_SOURCE_DIR}/libsyclinterface/include/*.h) foreach(hf ${_syclinterface_h}) - add_custom_command(TARGET _build_time_create_dpctl_include - COMMAND ${CMAKE_COMMAND} -E copy ${hf} ${DPCTL_INCLUDE_DIR}/syclinterface - ) + get_filename_component(_header_name ${hf} NAME) + set(_target_header_file ${DPCTL_INCLUDE_DIR}/syclinterface/${_header_name}) + list(APPEND _copied_header_files ${_target_header_file}) + add_custom_command(OUTPUT ${_target_header_file} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file} + DEPENDS ${hf} _build_time_create_dpctl_include + VERBATIM + ) endforeach() file(GLOB _syclinterface_Support_h ${CMAKE_SOURCE_DIR}/libsyclinterface/include/Support/*.h) foreach(hf ${_syclinterface_Support_h}) - add_custom_command(TARGET _build_time_create_dpctl_include - COMMAND ${CMAKE_COMMAND} -E copy ${hf} ${DPCTL_INCLUDE_DIR}/syclinterface/Support - ) + get_filename_component(_header_name ${hf} NAME) + set(_target_header_file ${DPCTL_INCLUDE_DIR}/syclinterface/Support/${_header_name}) + list(APPEND _copied_header_files ${_target_header_file}) + add_custom_command(OUTPUT ${_target_header_file} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file} + DEPENDS ${hf} _build_time_create_dpctl_include + ) endforeach() file(GLOB _syclinterface_Config_h ${CMAKE_SOURCE_DIR}/libsyclinterface/include/Config/*.h) foreach(hf ${_syclinterface_Config_h}) - add_custom_command(TARGET _build_time_create_dpctl_include - COMMAND ${CMAKE_COMMAND} -E copy ${hf} ${DPCTL_INCLUDE_DIR}/syclinterface/Config - ) + get_filename_component(_header_name ${hf} NAME) + set(_target_header_file ${DPCTL_INCLUDE_DIR}/syclinterface/Config/${_header_name}) + list(APPEND _copied_header_files ${_target_header_file}) + add_custom_command(OUTPUT ${_target_header_file} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file} + DEPENDS ${hf} _build_time_create_dpctl_include + ) endforeach() file(GLOB _apis_h ${CMAKE_CURRENT_SOURCE_DIR}/apis/include/*) foreach(hf ${_apis_h}) - add_custom_command(TARGET _build_time_create_dpctl_include - COMMAND ${CMAKE_COMMAND} -E copy ${hf} ${DPCTL_INCLUDE_DIR} - ) + get_filename_component(_header_name ${hf} NAME) + set(_target_header_file ${DPCTL_INCLUDE_DIR}/${_header_name}) + list(APPEND _copied_header_files ${_target_header_file}) + add_custom_command(OUTPUT ${_target_header_file} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file} + DEPENDS ${hf} _build_time_create_dpctl_include + ) endforeach() +add_custom_target( + _build_time_create_dpctl_include_copy ALL + DEPENDS ${_copied_header_files} +) + set(CMAKE_INSTALL_RPATH "$ORIGIN") function(build_dpctl_ext _trgt _src _dest) add_cython_target(${_trgt} ${_src} CXX OUTPUT_VAR _generated_src) add_library(${_trgt} MODULE ${_generated_src}) target_include_directories(${_trgt} PRIVATE ${NumPy_INCLUDE_DIR} ${DPCTL_INCLUDE_DIR}) - add_dependencies(${_trgt} _build_time_create_dpctl_include) + add_dependencies(${_trgt} _build_time_create_dpctl_include_copy) if (DPCTL_GENERATE_COVERAGE) target_compile_definitions(${_trgt} PRIVATE CYTHON_TRACE=1 CYTHON_TRACE_NOGIL=1) target_compile_options(${_trgt} PRIVATE -fno-sycl-use-footer) diff --git a/libsyclinterface/CMakeLists.txt b/libsyclinterface/CMakeLists.txt index a6c73f3878..6beed813a8 100644 --- a/libsyclinterface/CMakeLists.txt +++ b/libsyclinterface/CMakeLists.txt @@ -214,9 +214,13 @@ file(GLOB MAIN_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h") file(GLOB SUPPORT_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/Support/*.h") file(GLOB CONFIG_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/Config/*.h") +set(ALL_HEADERS "${MAIN_HEADERS}") +list(APPEND ALL_HEADERS "${SUPPORT_HEADERS}") +list(APPEND ALL_HEADERS "${CONFIG_HEADERS}") + set_target_properties(DPCTLSyclInterface PROPERTIES PUBLIC_HEADER - "${MAIN_HEADERS}" + "${ALL_HEADERS}" ) if (SKBUILD) @@ -241,12 +245,10 @@ install(TARGETS install( FILES ${SUPPORT_HEADERS} DESTINATION ${_include_destination}/Support - COMPONENT SupportHeaders ) install( FILES ${CONFIG_HEADERS} DESTINATION ${_include_destination}/Config - COMPONENT ConfigHeaders ) # Enable code coverage related settings diff --git a/libsyclinterface/tests/CMakeLists.txt b/libsyclinterface/tests/CMakeLists.txt index dc180ec70d..36037b1d4b 100644 --- a/libsyclinterface/tests/CMakeLists.txt +++ b/libsyclinterface/tests/CMakeLists.txt @@ -61,7 +61,6 @@ if(DPCTL_GENERATE_COVERAGE) ${CMAKE_DL_LIBS} ) add_custom_target(llvm-cov - COMMAND ${CMAKE_MAKE_PROGRAM} dpctl_c_api_tests COMMAND ${CMAKE_COMMAND} -E env DPCTL_VERBOSITY=warning ${CMAKE_CURRENT_BINARY_DIR}/dpctl_c_api_tests COMMAND ${LLVMProfdata_EXE} merge @@ -75,10 +74,10 @@ if(DPCTL_GENERATE_COVERAGE) ${dpctl_sources} ${helper_sources} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS dpctl_c_api_tests ) add_custom_target(lcov-genhtml - COMMAND ${CMAKE_MAKE_PROGRAM} llvm-cov COMMAND ${LLVMCov_EXE} export -format=lcov @@ -91,6 +90,7 @@ if(DPCTL_GENERATE_COVERAGE) --output-directory ${COVERAGE_OUTPUT_DIR}/dpctl-c-api-coverage WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS llvm-cov ) else() file(GLOB_RECURSE sources ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) diff --git a/scripts/build_locally.py b/scripts/build_locally.py index 19b811f376..acd1a4a6a0 100644 --- a/scripts/build_locally.py +++ b/scripts/build_locally.py @@ -32,7 +32,7 @@ def run( build_system = None if "linux" in sys.platform: - build_system = "Unix Makefiles" + build_system = "Ninja" elif sys.platform in ["win32", "cygwin"]: build_system = "Ninja" else: diff --git a/scripts/gen_coverage.py b/scripts/gen_coverage.py index 43cffd1cd9..611327689a 100644 --- a/scripts/gen_coverage.py +++ b/scripts/gen_coverage.py @@ -27,6 +27,7 @@ def run( compiler_root=None, run_pytest=False, bin_llvm=None, + gtest_config=None, ): IS_LIN = False @@ -48,7 +49,7 @@ def run( "develop", "--", "-G", - "Unix Makefiles", + "Ninja", "-DCMAKE_BUILD_TYPE=Debug", "-DCMAKE_C_COMPILER:PATH=" + c_compiler, "-DCMAKE_CXX_COMPILER:PATH=" + cxx_compiler, @@ -66,18 +67,22 @@ def run( if bin_llvm: env = { "PATH": ":".join((os.environ.get("PATH", ""), bin_llvm)), + "LLVM_TOOLS_HOME": bin_llvm, } env.update({k: v for k, v in os.environ.items() if k != "PATH"}) + if gtest_config: + cmake_args += ["-DCMAKE_PREFIX_PATH=" + gtest_config] subprocess.check_call(cmake_args, shell=False, cwd=setup_dir, env=env) - test_dir = ( + cmake_build_dir = ( subprocess.check_output( - ["find", "_skbuild", "-name", "tests"], cwd=setup_dir + ["find", "_skbuild", "-name", "cmake-build"], cwd=setup_dir ) .decode("utf-8") .strip("\n") ) subprocess.check_call( - ["make", "-C", test_dir, "lcov-genhtml"], cwd=setup_dir + ["cmake", "--build", ".", "--target", "lcov-genhtml"], + cwd=cmake_build_dir, ) subprocess.check_call( [ @@ -135,6 +140,11 @@ def run( driver.add_argument( "--bin-llvm", help="Path to folder where llvm-cov can be found" ) + driver.add_argument( + "--gtest-config", + help="Path to the GTestConfig.cmake file to locate a " + + "custom GTest installation.", + ) args = parser.parse_args() if args.oneapi: @@ -170,4 +180,5 @@ def run( compiler_root=args.compiler_root, run_pytest=args.run_pytest, bin_llvm=args.bin_llvm, + gtest_config=args.gtest_config, ) diff --git a/scripts/gen_docs.py b/scripts/gen_docs.py index 9b5435c475..087bb32230 100644 --- a/scripts/gen_docs.py +++ b/scripts/gen_docs.py @@ -48,7 +48,7 @@ def run( "develop", "--", "-G", - "Unix Makefiles", + "Ninja", "-DCMAKE_BUILD_TYPE=Debug", "-DCMAKE_C_COMPILER:PATH=" + c_compiler, "-DCMAKE_CXX_COMPILER:PATH=" + cxx_compiler,