Skip to content

Commit 1fac073

Browse files
Merge pull request #1587 from IntelPython/feature/include_from_source
Depend on the source headers directly
2 parents 80f4f30 + 1757afe commit 1fac073

38 files changed

+128
-210
lines changed

CMakeLists.txt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
1212
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
1313
# set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1)
1414

15+
if (UNIX)
16+
add_link_options("-fuse-ld=lld")
17+
endif()
18+
1519
# Option to generate code coverage report using llvm-cov and lcov.
1620
option(DPCTL_GENERATE_COVERAGE
1721
"Build dpctl with coverage instrumentation"
@@ -47,9 +51,14 @@ endif()
4751

4852
add_subdirectory(libsyclinterface)
4953

50-
file(GLOB _dpctl_capi_headers dpctl/apis/include/*.h*)
51-
install(FILES ${_dpctl_capi_headers}
52-
DESTINATION dpctl/include
54+
add_library(DpctlCAPI INTERFACE)
55+
target_include_directories(DpctlCAPI INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/dpctl/apis/include)
56+
target_link_libraries(DpctlCAPI INTERFACE DPCTLSyclInterfaceHeaders)
57+
58+
install(DIRECTORY
59+
${CMAKE_CURRENT_SOURCE_DIR}/dpctl/apis/include/
60+
DESTINATION ${CMAKE_INSTALL_PREFIX}/dpctl/include
61+
FILES_MATCHING REGEX "\\.h(pp)?$"
5362
)
5463

5564
# Define CMAKE_INSTALL_xxx: LIBDIR, INCLUDEDIR

docs/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function(_setup_doxygen)
2626
if(DPCTL_ENABLE_DOXYGEN_HTML)
2727
set(GENERATE_HTML "YES")
2828
endif()
29-
set(DOXYGEN_INPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libsyclinterface/include)
29+
set(DOXYGEN_INPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libsyclinterface/include/syclinterface)
3030
set(DOXYGEN_OUTPUT_DIR ${DOC_OUTPUT_DIR}/doxygen)
3131
set(DOXYGEN_INDEX_FILE ${DOXYGEN_OUTPUT_DIR}/xml/index.xml)
3232
set(DOXYFILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)

dpctl/CMakeLists.txt

Lines changed: 48 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
find_package(Python REQUIRED COMPONENTS Development.Module NumPy)
22

3+
# -t is to only Cythonize sources with timestamps newer than existing CXX files (if present)
4+
# -w is to set working directory (and correctly set __pyx_f[] array of filenames)
35
set(CYTHON_FLAGS "-t -w \"${CMAKE_SOURCE_DIR}\"")
46
find_package(Cython REQUIRED)
57

@@ -74,64 +76,6 @@ endif()
7476

7577
# at build time create include/ directory and copy header files over
7678
set(DPCTL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
77-
add_custom_target(_build_time_create_dpctl_include ALL
78-
COMMAND ${CMAKE_COMMAND} -E make_directory ${DPCTL_INCLUDE_DIR}
79-
COMMAND ${CMAKE_COMMAND} -E make_directory ${DPCTL_INCLUDE_DIR}/syclinterface
80-
COMMAND ${CMAKE_COMMAND} -E make_directory ${DPCTL_INCLUDE_DIR}/syclinterface/Support
81-
COMMAND ${CMAKE_COMMAND} -E make_directory ${DPCTL_INCLUDE_DIR}/syclinterface/Config
82-
DEPENDS DPCTLSyclInterface
83-
)
84-
85-
set(_copied_header_files)
86-
file(GLOB _syclinterface_h ${CMAKE_SOURCE_DIR}/libsyclinterface/include/*.h*)
87-
foreach(hf ${_syclinterface_h})
88-
get_filename_component(_header_name ${hf} NAME)
89-
set(_target_header_file ${DPCTL_INCLUDE_DIR}/syclinterface/${_header_name})
90-
list(APPEND _copied_header_files ${_target_header_file})
91-
add_custom_command(OUTPUT ${_target_header_file}
92-
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file}
93-
DEPENDS ${hf} _build_time_create_dpctl_include
94-
VERBATIM
95-
)
96-
endforeach()
97-
98-
file(GLOB _syclinterface_Support_h ${CMAKE_SOURCE_DIR}/libsyclinterface/include/Support/*.h)
99-
foreach(hf ${_syclinterface_Support_h})
100-
get_filename_component(_header_name ${hf} NAME)
101-
set(_target_header_file ${DPCTL_INCLUDE_DIR}/syclinterface/Support/${_header_name})
102-
list(APPEND _copied_header_files ${_target_header_file})
103-
add_custom_command(OUTPUT ${_target_header_file}
104-
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file}
105-
DEPENDS ${hf} _build_time_create_dpctl_include
106-
)
107-
endforeach()
108-
109-
file(GLOB _syclinterface_Config_h ${CMAKE_SOURCE_DIR}/libsyclinterface/include/Config/*.h)
110-
foreach(hf ${_syclinterface_Config_h})
111-
get_filename_component(_header_name ${hf} NAME)
112-
set(_target_header_file ${DPCTL_INCLUDE_DIR}/syclinterface/Config/${_header_name})
113-
list(APPEND _copied_header_files ${_target_header_file})
114-
add_custom_command(OUTPUT ${_target_header_file}
115-
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file}
116-
DEPENDS ${hf} _build_time_create_dpctl_include
117-
)
118-
endforeach()
119-
120-
file(GLOB _apis_h ${CMAKE_CURRENT_SOURCE_DIR}/apis/include/*)
121-
foreach(hf ${_apis_h})
122-
get_filename_component(_header_name ${hf} NAME)
123-
set(_target_header_file ${DPCTL_INCLUDE_DIR}/${_header_name})
124-
list(APPEND _copied_header_files ${_target_header_file})
125-
add_custom_command(OUTPUT ${_target_header_file}
126-
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${hf} ${_target_header_file}
127-
DEPENDS ${hf} _build_time_create_dpctl_include
128-
)
129-
endforeach()
130-
131-
add_custom_target(
132-
_build_time_create_dpctl_include_copy ALL
133-
DEPENDS ${_copied_header_files}
134-
)
13579

13680
set(CMAKE_INSTALL_RPATH "$ORIGIN")
13781

@@ -140,29 +84,29 @@ function(build_dpctl_ext _trgt _src _dest)
14084
cmake_parse_arguments(BUILD_DPCTL_EXT "${options}" "" "" ${ARGN})
14185
add_cython_target(${_trgt} ${_src} CXX OUTPUT_VAR _generated_src)
14286
set(_cythonize_trgt "${_trgt}_cythonize_pyx")
143-
add_custom_target(${_cythonize_trgt} DEPENDS ${_src})
14487
Python_add_library(${_trgt} MODULE WITH_SOABI ${_generated_src})
14588
if (BUILD_DPCTL_EXT_SYCL)
14689
add_sycl_to_target(TARGET ${_trgt} SOURCES ${_generated_src})
147-
if(_dpctl_sycl_targets)
148-
# make fat binary
90+
if(_dpctl_sycl_targets)
91+
# make fat binary
14992
target_compile_options(
15093
${_trgt}
15194
PRIVATE
15295
-fsycl-targets=${_dpctl_sycl_targets}
15396
)
154-
target_link_options(
155-
${_trgt}
156-
PRIVATE
157-
-fsycl-targets=${_dpctl_sycl_targets}
158-
)
159-
endif()
97+
target_link_options(
98+
${_trgt}
99+
PRIVATE
100+
-fsycl-targets=${_dpctl_sycl_targets}
101+
)
102+
endif()
160103
endif()
161-
target_include_directories(${_trgt} PRIVATE ${NumPy_INCLUDE_DIR} ${DPCTL_INCLUDE_DIR})
162-
add_dependencies(${_trgt} _build_time_create_dpctl_include_copy ${_cythonize_trgt})
104+
target_link_libraries(${_trgt} PRIVATE Python::NumPy)
163105
if (DPCTL_GENERATE_COVERAGE)
164106
target_compile_definitions(${_trgt} PRIVATE CYTHON_TRACE=1 CYTHON_TRACE_NOGIL=1)
165-
# target_compile_options(${_trgt} PRIVATE -fno-sycl-use-footer)
107+
if (BUILD_DPCTL_EXT_SYCL)
108+
target_compile_options(${_trgt} PRIVATE -fno-sycl-use-footer)
109+
endif()
166110
endif()
167111
target_link_libraries(${_trgt} PRIVATE DPCTLSyclInterface)
168112
set(_linker_options "LINKER:${DPCTL_LDFLAGS}")
@@ -171,49 +115,56 @@ function(build_dpctl_ext _trgt _src _dest)
171115
get_filename_component(_generated_src_dir ${_generated_src} DIRECTORY)
172116
set(_generated_public_h "${_generated_src_dir}/${_name_wle}.h")
173117
set(_generated_api_h "${_generated_src_dir}/${_name_wle}_api.h")
174-
set(_copy_trgt "${_trgt}_copy_capi_include")
175-
add_custom_target(
176-
${_copy_trgt} ALL
177-
COMMAND ${CMAKE_COMMAND}
178-
-DSOURCE_FILE=${_generated_public_h}
179-
-DDEST=${CMAKE_CURRENT_SOURCE_DIR}
180-
-P ${CMAKE_SOURCE_DIR}/dpctl/cmake/copy_existing.cmake
181-
COMMAND ${CMAKE_COMMAND}
182-
-DSOURCE_FILE=${_generated_api_h}
183-
-DDEST=${CMAKE_CURRENT_SOURCE_DIR}
184-
-P ${CMAKE_SOURCE_DIR}/dpctl/cmake/copy_existing.cmake
185-
DEPENDS ${_trgt}
186-
VERBATIM
187-
COMMENT "Copying Cython-generated headers to dpctl"
188-
)
118+
119+
# TODO: create separate folder inside build folder that contains only
120+
# headers related to this target and appropriate folder structure to
121+
# eliminate shadow dependencies
122+
get_filename_component(_generated_src_dir_dir ${_generated_src_dir} DIRECTORY)
123+
# TODO: do not set directory if we did not generate header
124+
target_include_directories(${_trgt} INTERFACE ${_generated_src_dir_dir})
125+
126+
install(TARGETS ${_trgt}
127+
LIBRARY DESTINATION ${_dest})
128+
install(FILES
129+
${_generated_api_h}
130+
DESTINATION ${CMAKE_INSTALL_PREFIX}/dpctl/include/${_dest}
131+
OPTIONAL)
132+
install(FILES
133+
${_generated_public_h}
134+
DESTINATION ${CMAKE_INSTALL_PREFIX}/dpctl/include/${_dest}
135+
OPTIONAL)
189136
if (DPCTL_GENERATE_COVERAGE)
190-
set(_copy_cxx_trgt "${_trgt}_copy_cxx")
191-
add_custom_target(
192-
${_copy_cxx_trgt} ALL
193-
COMMAND ${CMAKE_COMMAND}
194-
-DSOURCE_FILE=${_generated_src}
195-
-DDEST=${CMAKE_CURRENT_SOURCE_DIR}
196-
-P ${CMAKE_SOURCE_DIR}/dpctl/cmake/copy_existing.cmake
197-
DEPENDS ${_trgt}
198-
VERBATIM
199-
COMMENT "Copying Cython-generated source to dpctl"
200-
)
137+
get_filename_component(_original_src_dir ${_src} DIRECTORY)
138+
file(RELATIVE_PATH _rel_dir ${CMAKE_SOURCE_DIR} ${_original_src_dir})
139+
install(FILES
140+
${_generated_src}
141+
DESTINATION ${CMAKE_INSTALL_PREFIX}/${_rel_dir}
142+
)
201143
endif()
202-
install(TARGETS ${_trgt} LIBRARY DESTINATION ${_dest})
144+
145+
# Create target with headers only, because python is managing all the
146+
# library imports at runtime
147+
set(_trgt_headers ${_trgt}_headers)
148+
add_library(${_trgt_headers} INTERFACE)
149+
add_dependencies(${_trgt_headers} ${_trgt})
150+
get_target_property(_trgt_headers_dir ${_trgt} INTERFACE_INCLUDE_DIRECTORIES)
151+
target_include_directories(${_trgt_headers} INTERFACE ${_trgt_headers_dir})
203152
endfunction()
204153

205154
file(GLOB _cython_sources ${CMAKE_CURRENT_SOURCE_DIR}/*.pyx)
206155
list(REMOVE_ITEM _cython_sources ${CMAKE_CURRENT_SOURCE_DIR}/_sycl_queue.pyx)
207156
foreach(_cy_file ${_cython_sources})
208157
get_filename_component(_trgt ${_cy_file} NAME_WLE)
209158
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl")
159+
target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers)
210160
endforeach()
211161

212162
set(_cy_file ${CMAKE_CURRENT_SOURCE_DIR}/_sycl_queue.pyx)
213163
get_filename_component(_trgt ${_cy_file} NAME_WLE)
214164
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl" SYCL)
215165
# _sycl_queue include _host_task_util.hpp
216166
target_include_directories(${_trgt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
167+
target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers)
217168

218169
add_subdirectory(program)
219170
add_subdirectory(memory)

dpctl/apis/include/dpctl_capi.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,20 @@
3333
#else
3434
#define CYTHON_EXTERN_C
3535
#endif
36-
#include "../_sycl_device.h"
37-
#include "../_sycl_device_api.h"
38-
#include "../_sycl_context.h"
39-
#include "../_sycl_context_api.h"
40-
#include "../_sycl_event.h"
41-
#include "../_sycl_event_api.h"
42-
#include "../_sycl_queue.h"
43-
#include "../_sycl_queue_api.h"
44-
#include "../memory/_memory.h"
45-
#include "../memory/_memory_api.h"
46-
#include "../tensor/_usmarray.h"
47-
#include "../tensor/_usmarray_api.h"
48-
#include "../program/_program.h"
49-
#include "../program/_program_api.h"
36+
#include "dpctl/_sycl_device.h"
37+
#include "dpctl/_sycl_device_api.h"
38+
#include "dpctl/_sycl_context.h"
39+
#include "dpctl/_sycl_context_api.h"
40+
#include "dpctl/_sycl_event.h"
41+
#include "dpctl/_sycl_event_api.h"
42+
#include "dpctl/_sycl_queue.h"
43+
#include "dpctl/_sycl_queue_api.h"
44+
#include "dpctl/memory/_memory.h"
45+
#include "dpctl/memory/_memory_api.h"
46+
#include "dpctl/tensor/_usmarray.h"
47+
#include "dpctl/tensor/_usmarray_api.h"
48+
#include "dpctl/program/_program.h"
49+
#include "dpctl/program/_program_api.h"
5050

5151
// clang-format on
5252

dpctl/cmake/copy_existing.cmake

Lines changed: 0 additions & 3 deletions
This file was deleted.

dpctl/memory/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ file(GLOB _cython_sources *.pyx)
33
foreach(_cy_file ${_cython_sources})
44
get_filename_component(_trgt ${_cy_file} NAME_WLE)
55
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/memory")
6+
target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers)
67
endforeach()

dpctl/program/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ file(GLOB _cython_sources *.pyx)
33
foreach(_cy_file ${_cython_sources})
44
get_filename_component(_trgt ${_cy_file} NAME_WLE)
55
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/program")
6+
target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers)
67
endforeach()

dpctl/tensor/CMakeLists.txt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,18 @@ foreach(_cy_file ${_cython_sources})
33
get_filename_component(_trgt ${_cy_file} NAME_WLE)
44
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/tensor")
55
target_include_directories(${_trgt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
6+
target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers)
67
endforeach()
78

9+
# TODO: do we need to write this dependencies explicitly? Does it even work this
10+
# way?
811
add_custom_target(_usmarray_deps SOURCES
912
${CMAKE_CURRENT_SOURCE_DIR}/_slicing.pxi
1013
${CMAKE_CURRENT_SOURCE_DIR}/_types.pxi
1114
${CMAKE_CURRENT_SOURCE_DIR}/_stride_utils.pxi
1215
)
1316
add_dependencies(_usmarray _usmarray_deps)
1417

15-
add_custom_target(_dpctl4pybind11_deps
16-
DEPENDS
17-
_usmarray_copy_capi_include
18-
_memory_copy_capi_include
19-
_sycl_device_copy_capi_include
20-
_sycl_queue_copy_capi_include
21-
_sycl_context_copy_capi_include
22-
_sycl_event_copy_capi_include
23-
)
24-
2518
if(WIN32)
2619
if (${CMAKE_VERSION} VERSION_LESS "3.23")
2720
# this is a work-around for target_link_options inserting option after -link option, cause
@@ -242,7 +235,6 @@ foreach(python_module_name ${_py_trgts})
242235
target_link_options(${python_module_name} PRIVATE -fsycl-device-code-split=per_kernel)
243236
target_include_directories(${python_module_name}
244237
PRIVATE
245-
${CMAKE_CURRENT_SOURCE_DIR}/../include
246238
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/include
247239
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/
248240
)
@@ -270,6 +262,8 @@ foreach(python_module_name ${_py_trgts})
270262
-fsycl-targets=${_dpctl_sycl_targets}
271263
)
272264
endif()
273-
add_dependencies(${python_module_name} _dpctl4pybind11_deps)
265+
# TODO: update source so they refernece individual libraries instead of
266+
# dpctl4pybind11.hpp. It will allow to simplify dependency tree
267+
target_link_libraries(${python_module_name} PRIVATE DpctlCAPI)
274268
install(TARGETS ${python_module_name} DESTINATION "dpctl/tensor")
275269
endforeach()

dpctl/utils/CMakeLists.txt

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@ foreach(_cy_file ${_cython_sources})
55
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/utils")
66
endforeach()
77

8-
add_custom_target(_dpctl4pybind11_header_ready
9-
DEPENDS
10-
_usmarray_copy_capi_include
11-
_memory_copy_capi_include
12-
_sycl_device_copy_capi_include
13-
_sycl_queue_copy_capi_include
14-
_sycl_context_copy_capi_include
15-
_sycl_event_copy_capi_include
16-
)
17-
188
set(python_module_name _device_queries)
199
set(_module_src ${CMAKE_CURRENT_SOURCE_DIR}/src/device_queries.cpp)
2010
pybind11_add_module(${python_module_name} MODULE
@@ -44,9 +34,5 @@ if(_dpctl_sycl_targets)
4434
-fsycl-targets=${_dpctl_sycl_targets}
4535
)
4636
endif()
47-
target_include_directories(${python_module_name}
48-
PRIVATE
49-
${CMAKE_CURRENT_SOURCE_DIR}/../include
50-
)
51-
add_dependencies(${python_module_name} _dpctl4pybind11_header_ready)
37+
target_link_libraries(${python_module_name} PRIVATE DpctlCAPI)
5238
install(TARGETS ${python_module_name} DESTINATION "dpctl/utils")

0 commit comments

Comments
 (0)