if(ITK_USE_GPU) find_package(OpenCL REQUIRED) if(NOT ${OPENCL_FOUND}) message(FATAL "Could not find OpenCL") endif() macro(sourcefile_to_string SOURCE_FILE RESULT_CMAKE_VAR) file(STRINGS ${SOURCE_FILE} FileStrings) foreach(SourceLine ${FileStrings}) # replace all \ with \\ to make the c string constant work string( REGEX REPLACE "\\\\" "\\\\\\\\" TempSourceLine "${SourceLine}") # replace all " with \" to make the c string constant work string( REGEX REPLACE "\"" "\\\\\"" EscapedSourceLine "${TempSourceLine}") set(${RESULT_CMAKE_VAR} "${${RESULT_CMAKE_VAR}}\n\"${EscapedSourceLine}\\n\"") endforeach() endmacro() macro( write_gpu_kernel_to_file OPENCL_FILE GPUFILTER_NAME GPUFILTER_KERNELNAME OUTPUT_FILE SRC_VAR) sourcefile_to_string(${OPENCL_FILE} ${GPUFILTER_KERNELNAME}_SourceString) set(${GPUFILTER_KERNELNAME}_KernelString "#include \"itk${GPUFILTER_NAME}.h\"\n\n") set(${GPUFILTER_KERNELNAME}_KernelString "${${GPUFILTER_KERNELNAME}_KernelString}namespace itk\n") set(${GPUFILTER_KERNELNAME}_KernelString "${${GPUFILTER_KERNELNAME}_KernelString}{\n\n") set(${GPUFILTER_KERNELNAME}_KernelString "${${GPUFILTER_KERNELNAME}_KernelString}const char* ${GPUFILTER_KERNELNAME}::GetOpenCLSource()\n") set(${GPUFILTER_KERNELNAME}_KernelString "${${GPUFILTER_KERNELNAME}_KernelString}{\n") set(${GPUFILTER_KERNELNAME}_KernelString "${${GPUFILTER_KERNELNAME}_KernelString} return ${${GPUFILTER_KERNELNAME}_SourceString};\n") set(${GPUFILTER_KERNELNAME}_KernelString "${${GPUFILTER_KERNELNAME}_KernelString}}\n\n") set(${GPUFILTER_KERNELNAME}_KernelString "${${GPUFILTER_KERNELNAME}_KernelString}}\n") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE} "${${GPUFILTER_KERNELNAME}_KernelString}") configure_file(${OPENCL_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE}.cl COPYONLY) add_custom_target( ${GPUFILTER_KERNELNAME}_Target DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE}.cl) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE} PROPERTIES GENERATED ON) set(${SRC_VAR} ${${SRC_VAR}} ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE}) endmacro() macro(write_gpu_kernels GPUKernels GPU_SRC) foreach(GPUKernel ${GPUKernels}) get_filename_component(FilterName ${GPUKernel} NAME_WE) write_gpu_kernel_to_file( ${GPUKernel} ${FilterName} ${FilterName}Kernel "${FilterName}Kernel.cxx" ${GPU_SRC}) endforeach() endmacro() endif()