@@ -19,14 +19,68 @@ else(USE_PREBUILT_LLVM)
1919endif (USE_PREBUILT_LLVM)
2020copy_file (${OPENCL_HEADERS_DIR} /opencl-c.h opencl-c.h)
2121copy_file (${OPENCL_HEADERS_DIR} /opencl-c-base.h opencl-c-base.h)
22+ copy_file (${CMAKE_CURRENT_SOURCE_DIR} /module.modulemap module.modulemap)
2223
2324add_custom_target (
2425 opencl.headers.target
2526 DEPENDS
27+ module.modulemap
2628 opencl-c.h
2729 opencl-c-base.h
2830)
2931
32+ function (create_pcm DST MODULE HEADER OPTS DEPS)
33+ add_custom_command (
34+ OUTPUT ${DST}
35+ MAIN_DEPENDENCY ${MODMAP}
36+ DEPENDS ${HEADER} ${DEPS}
37+ COMMAND
38+ ${CLANG_COMMAND} -cc1 -x cl
39+ -I. -O0 ${OPTS}
40+ -fmodules -fmodule-name =${MODULE} -fmodule-map-file-home-is-cwd
41+ -emit-module "module.modulemap"
42+ -fno-validate-pch
43+ -o ${DST}
44+ VERBATIM
45+ COMMENT "Generating ${DST} "
46+ )
47+ endfunction (create_pcm)
48+
49+ set (CL12 "-cl-std=CL1.2" )
50+ set (CL20 "-cl-std=CL2.0" )
51+
52+ set (SPIR_TRIPLE "-triple;spir-unknown-unknown" )
53+ set (SPIR64_TRIPLE "-triple;spir64-unknown-unknown" )
54+ if (BUILD_X64)
55+ set (HOST_TRIPLE "${SPIR64_TRIPLE} " )
56+ else ()
57+ set (HOST_TRIPLE "${SPIR_TRIPLE} " )
58+ endif ()
59+
60+ set (OPTS -cl-ext =-cl_khr_fp64)
61+ create_pcm(opencl-c-12-spir.pcm cl12spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
62+ create_pcm(opencl-c-20-spir.pcm cl20spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
63+ create_pcm(opencl-c-12-spir64.pcm cl12spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
64+ create_pcm(opencl-c-20-spir64.pcm cl20spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
65+ set (OPTS -cl-ext =+cl_khr_fp64)
66+ create_pcm(opencl-c-12-spir-fp64.pcm cl12spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
67+ create_pcm(opencl-c-20-spir-fp64.pcm cl20spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
68+ create_pcm(opencl-c-12-spir64-fp64.pcm cl12spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
69+ create_pcm(opencl-c-20-spir64-fp64.pcm cl20spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
70+
71+ add_custom_target (
72+ opencl.pcm.target
73+ DEPENDS
74+ opencl.headers.target
75+ opencl-c-12-spir.pcm
76+ opencl-c-20-spir.pcm
77+ opencl-c-12-spir64.pcm
78+ opencl-c-20-spir64.pcm
79+ opencl-c-12-spir-fp64.pcm
80+ opencl-c-20-spir-fp64.pcm
81+ opencl-c-12-spir64-fp64.pcm
82+ opencl-c-20-spir64-fp64.pcm
83+ )
3084
3185function (pack_to_obj SRC DST TAG)
3286 add_custom_command (
@@ -40,16 +94,45 @@ endfunction(pack_to_obj)
4094if (WIN32 )
4195 list (APPEND CL_HEADERS_SRC OpenCL.rc)
4296else ()
97+
4398 pack_to_obj(opencl-c.h opencl-c.h.cpp "PCM_OPENCL_C_H" )
4499 pack_to_obj(opencl-c-base.h opencl-c-base.h.cpp "PCM_OPENCL_C_BASE_H" )
45100 list (APPEND CL_HEADERS_SRC
46101 opencl-c.h.cpp
47102 opencl-c-base.h.cpp
103+ opencl-c-12-spir.mod.cpp
104+ opencl-c-20-spir.mod.cpp
105+ opencl-c-12-spir64.mod.cpp
106+ opencl-c-20-spir64.mod.cpp
107+ opencl-c-12-spir-fp64.mod.cpp
108+ opencl-c-20-spir-fp64.mod.cpp
109+ opencl-c-12-spir64-fp64.mod.cpp
110+ opencl-c-20-spir64-fp64.mod.cpp
111+ module.modulemap.cpp
48112 )
113+ # note the .pcm -> .mod extension change
114+ # this is a workaround for CMake bug that caused
115+ # dependency cycle in generated build rules
116+ pack_to_obj(opencl-c-12-spir.pcm opencl-c-12-spir.mod.cpp "PCM_OPENCL_C_12_SPIR_PCM" )
117+ pack_to_obj(opencl-c-20-spir.pcm opencl-c-20-spir.mod.cpp "PCM_OPENCL_C_20_SPIR_PCM" )
118+ pack_to_obj(opencl-c-12-spir64.pcm opencl-c-12-spir64.mod.cpp "PCM_OPENCL_C_12_SPIR64_PCM" )
119+ pack_to_obj(opencl-c-20-spir64.pcm opencl-c-20-spir64.mod.cpp "PCM_OPENCL_C_20_SPIR64_PCM" )
120+ pack_to_obj(opencl-c-12-spir-fp64.pcm opencl-c-12-spir-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR_FP64_PCM" )
121+ pack_to_obj(opencl-c-20-spir-fp64.pcm opencl-c-20-spir-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR_FP64_PCM" )
122+ pack_to_obj(opencl-c-12-spir64-fp64.pcm opencl-c-12-spir64-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR64_FP64_PCM" )
123+ pack_to_obj(opencl-c-20-spir64-fp64.pcm opencl-c-20-spir64-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR64_FP64_PCM" )
124+ pack_to_obj(module.modulemap module.modulemap.cpp "PCM_OPENCL_C_MODULE_MAP" )
125+
49126endif ()
50127
51128add_library (${CL_HEADERS_LIB} OBJECT
52129 ${CL_HEADERS_SRC}
53130)
54131
55132add_dependencies (${CL_HEADERS_LIB} opencl.headers.target )
133+ install (FILES
134+ ${CMAKE_CURRENT_BINARY_DIR} /opencl-c.h
135+ ${CMAKE_CURRENT_BINARY_DIR} /opencl-c-base.h
136+ ${CMAKE_CURRENT_BINARY_DIR} /module.modulemap
137+ DESTINATION include /cclang
138+ )
0 commit comments