11find_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)
35set (CYTHON_FLAGS "-t -w \" ${CMAKE_SOURCE_DIR} \" " )
46find_package (Cython REQUIRED)
57
@@ -74,64 +76,6 @@ endif()
7476
7577# at build time create include/ directory and copy header files over
7678set (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
13680set (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} )
203152endfunction ()
204153
205154file (GLOB _cython_sources ${CMAKE_CURRENT_SOURCE_DIR} /*.pyx)
206155list (REMOVE_ITEM _cython_sources ${CMAKE_CURRENT_SOURCE_DIR} /_sycl_queue.pyx)
207156foreach (_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)
210160endforeach ()
211161
212162set (_cy_file ${CMAKE_CURRENT_SOURCE_DIR} /_sycl_queue.pyx)
213163get_filename_component (_trgt ${_cy_file} NAME_WLE)
214164build_dpctl_ext(${_trgt} ${_cy_file} "dpctl" SYCL)
215165# _sycl_queue include _host_task_util.hpp
216166target_include_directories (${_trgt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} )
167+ target_link_libraries (DpctlCAPI INTERFACE ${_trgt} _headers)
217168
218169add_subdirectory (program )
219170add_subdirectory (memory)
0 commit comments