When we use pch file, we need to provide the orignal header files. Otherwise, clang may complain errors. Clang provide a compile option --relocatable-pch to enable pch/header files relocation. We have to use this option when we want to install the header files/pch file into system diretory.
v2: exchange beignet.pch and beignet.local.pch. Signed-off-by: Zhigang Gong <[email protected]> --- backend/src/CMakeLists.txt | 20 ++++++------ backend/src/libocl/CMakeLists.txt | 64 ++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt index dacc3a1..b4555f1 100644 --- a/backend/src/CMakeLists.txt +++ b/backend/src/CMakeLists.txt @@ -1,21 +1,21 @@ set (OCL_BITCODE_BIN "${BEIGNET_INSTALL_DIR}beignet.bc") -set (OCL_HEADER_DIR "${CMAKE_INSTALL_PREFIX}/include/CL/ocl/") +set (OCL_HEADER_DIR "${BEIGNET_INSTALL_DIR}/include") set (OCL_PCH_OBJECT "${BEIGNET_INSTALL_DIR}beignet.pch") set (GBE_OBJECT_DIR "${BEIGNET_INSTALL_DIR}/libgbe.so") set (INTERP_OBJECT_DIR "${BEIGNET_INSTALL_DIR}/libgbeinterp.so") -set (LOCAL_GBE_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libgbe.so" PARENT_SCOPE) -set (LOCAL_OCL_BITCODE_BIN "${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.bc" PARENT_SCOPE) -set (LOCAL_OCL_HEADER_DIR "${CMAKE_CURRENT_BINARY_DIR}/libocl/include/" PARENT_SCOPE) -set (LOCAL_OCL_PCH_OBJECT "${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.pch" PARENT_SCOPE) -set (LOCAL_INTERP_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libgbeinterp.so" PARENT_SCOPE) - configure_file ( "GBEConfig.h.in" "GBEConfig.h" ) add_subdirectory(libocl) +set (LOCAL_GBE_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libgbe.so" PARENT_SCOPE) +set (LOCAL_INTERP_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libgbeinterp.so" PARENT_SCOPE) +set (LOCAL_OCL_BITCODE_BIN "${OCL_OBJECT_DIR}/beignet.bc" PARENT_SCOPE) +set (LOCAL_OCL_HEADER_DIR "${OCL_OBJECT_DIR}/include/" PARENT_SCOPE) +set (LOCAL_OCL_PCH_OBJECT "${OCL_OBJECT_DIR}/beignet.local.pch" PARENT_SCOPE) + add_dependencies(beignet_bitcode libocl) set (GBE_SRC @@ -154,6 +154,6 @@ TARGET_LINK_LIBRARIES(gbe_bin_generater gbe) install (TARGETS gbe LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR}) install (TARGETS gbeinterp LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR}) -install (FILES ${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.bc DESTINATION ${BEIGNET_INSTALL_DIR}) -install (FILES ${CMAKE_CURRENT_BINARY_DIR}/libocl/lib/beignet.pch DESTINATION ${BEIGNET_INSTALL_DIR}) -install (DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/libocl/include/ DESTINATION ${CMAKE_INSTALL_PREFIX}/include/CL/ocl/ PATTERN *.h) +install (FILES ${OCL_OBJECT_DIR}/beignet.bc DESTINATION ${BEIGNET_INSTALL_DIR}) +install (FILES ${OCL_OBJECT_DIR}/beignet.pch DESTINATION ${BEIGNET_INSTALL_DIR}) +install (FILES ${OCL_HEADER_FILES} DESTINATION ${BEIGNET_INSTALL_DIR}/include) diff --git a/backend/src/libocl/CMakeLists.txt b/backend/src/libocl/CMakeLists.txt index b0074b3..d5d1c8a 100644 --- a/backend/src/libocl/CMakeLists.txt +++ b/backend/src/libocl/CMakeLists.txt @@ -1,14 +1,14 @@ PROJECT(LIBOCL) - -SET (OCL_HEADER_FILES ${LIBOCL_BINARY_DIR}/include/ocl_defines.h) +SET (OCL_OBJECT_DIR ${LIBOCL_BINARY_DIR}/${BEIGNET_INSTALL_DIR}) +SET (OCL_HEADER_FILES ${OCL_OBJECT_DIR}/include/ocl_defines.h) SET (OCL_SOURCE_FILES "") -ADD_CUSTOM_COMMAND(OUTPUT ${LIBOCL_BINARY_DIR}/include/ocl_defines.h - COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/ +ADD_CUSTOM_COMMAND(OUTPUT ${OCL_OBJECT_DIR}/include/ocl_defines.h + COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/ # COMMAND echo "cat ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h \\> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h" - COMMAND cat ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h > ${LIBOCL_BINARY_DIR}/include/ocl_defines.h + COMMAND cat ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h > ${OCL_OBJECT_DIR}/include/ocl_defines.h # COMMAND echo "cat ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h \\>\\> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h" - COMMAND cat ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h >> ${LIBOCL_BINARY_DIR}/include/ocl_defines.h + COMMAND cat ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h >> ${OCL_OBJECT_DIR}/include/ocl_defines.h DEPENDS ${LIBOCL_SOURCE_DIR}/tmpl/ocl_defines.tmpl.h ${LIBOCL_SOURCE_DIR}/../ocl_common_defines.h COMMENT "Generate the header: ${LIBOCL_BINARY_DIR}/include/ocl_defines.h" ) @@ -16,13 +16,13 @@ ADD_CUSTOM_COMMAND(OUTPUT ${LIBOCL_BINARY_DIR}/include/ocl_defines.h #other module just copy. MACRO(COPY_THE_HEADER _mod) # Use the python script to generate the header files. - STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/include/\\1.h" output_name ${_mod}) + STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/include/\\1.h" output_name ${_mod}) STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_SOURCE_DIR}/include/\\1.h" orgin_name ${_mod}) SET(OCL_HEADER_FILES ${OCL_HEADER_FILES} ${output_name}) IF(orgin_name STREQUAL output_name) ELSE(orgin_name STREQUAL output_name) ADD_CUSTOM_COMMAND(OUTPUT ${output_name} - COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/ + COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/ #COMMAND echo "cp ${orgin_name} ${output_name}" COMMAND cp ${orgin_name} ${output_name} DEPENDS ${orgin_name} @@ -60,12 +60,12 @@ ENDFOREACH(M) MACRO(GENERATE_HEADER_PY _mod) - STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/include/\\1.h" output_name ${_mod}) + STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/include/\\1.h" output_name ${_mod}) STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_SOURCE_DIR}/tmpl/\\1.tmpl.h" tmpl_name ${_mod}) STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_SOURCE_DIR}/script/\\1.def" def_name ${_mod}) SET(OCL_HEADER_FILES ${OCL_HEADER_FILES} ${output_name}) ADD_CUSTOM_COMMAND(OUTPUT ${output_name} - COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/ + COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/ #COMMAND echo "cat ${tmpl_name} \\> ${output_name}" COMMAND cat ${tmpl_name} > ${output_name} #COMMAND echo "${LIBOCL_SOURCE_DIR}/script/gen_vector.py ${def_name} ${output_name} 1" @@ -99,11 +99,11 @@ ENDFOREACH(M) MACRO(GENERATE_HEADER_BASH _mod) # Use the python script to generate the header files. - STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/include/\\1.h" output_name ${_mod}) + STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/include/\\1.h" output_name ${_mod}) STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_SOURCE_DIR}/script/\\1.sh" sh_name ${_mod}) SET(OCL_HEADER_FILES ${OCL_HEADER_FILES} ${output_name}) ADD_CUSTOM_COMMAND(OUTPUT ${output_name} - COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/include/ + COMMAND mkdir -p ${OCL_OBJECT_DIR}/include/ COMMAND ${sh_name} -p > ${output_name} DEPENDS ${sh_name} COMMENT "Generate the header by script: ${output_name}" @@ -132,11 +132,11 @@ ENDFOREACH(M) SET (CLANG_OCL_FLAGS -fno-builtin -ffp-contract=off -cl-kernel-arg-info -DGEN7_SAMPLER_CLAMP_BORDER_WORKAROUND "-cl-std=CL1.2") MACRO(ADD_CL_TO_BC_TARGET _file) # CMake seems can not add pattern rule, use MACRO to replace. - STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl" "${LIBOCL_BINARY_DIR}/lib/\\1.bc" output_name ${_file}) + STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl" "${OCL_OBJECT_DIR}/\\1.bc" output_name ${_file}) ADD_CUSTOM_COMMAND(OUTPUT ${output_name} - COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/ + COMMAND mkdir -p ${OCL_OBJECT_DIR}/ #COMMAND echo ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -I ${LIBOCL_BINARY_DIR}/include/ -emit-llvm-bc -triple spir -o ${output_name} -x cl ${_file} - COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -I ${LIBOCL_BINARY_DIR}/include/ -emit-llvm-bc -triple spir -o ${output_name} -x cl ${_file} + COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -I ${OCL_OBJECT_DIR}/include/ -emit-llvm-bc -triple spir -o ${output_name} -x cl ${_file} DEPENDS ${_file} ${OCL_HEADER_FILES} COMMENT "Compiling ${_file}" ) @@ -148,7 +148,7 @@ FOREACH(f ${OCL_SOURCE_FILES}) ENDFOREACH(f) FOREACH(f ${OCL_SOURCE_FILES}) - STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl" "${LIBOCL_BINARY_DIR}/lib/\\1.bc" bc_name ${f}) + STRING(REGEX REPLACE "${LIBOCL_BINARY_DIR}/src/\(o.*\)\\.cl" "${OCL_OBJECT_DIR}/\\1.bc" bc_name ${f}) SET(OCL_BC_FILES ${OCL_BC_FILES} ${bc_name}) ENDFOREACH(f) @@ -170,10 +170,10 @@ MACRO(COPY_THE_LL _mod) ENDIF(orgin_name STREQUAL output_name) ENDMACRO(COPY_THE_LL) MACRO(ADD_LL_TO_BC_TARGET M) - STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/lib/\\1.bc" output_name ${M}) + STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/\\1.bc" output_name ${M}) STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/src/\\1.ll" srcll_name ${M}) ADD_CUSTOM_COMMAND(OUTPUT ${output_name} - COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/ + COMMAND mkdir -p ${OCL_OBJECT_DIR}/ #COMMAND echo ${LLVM_INSTALL_DIR}llvm-as -o ${output_name} ${srcll_name} COMMAND ${LLVM_INSTALL_DIR}llvm-as -o ${output_name} ${srcll_name} DEPENDS ${srcll_name} @@ -185,24 +185,34 @@ SET (OCL_LL_MODULES ocl_barrier ocl_memcpy ocl_memset) FOREACH(f ${OCL_LL_MODULES}) COPY_THE_LL(${f}) ADD_LL_TO_BC_TARGET(${f}) - STRING(REGEX REPLACE "\(o.*\)" "${LIBOCL_BINARY_DIR}/lib/\\1.bc" bc_name ${f}) + STRING(REGEX REPLACE "\(o.*\)" "${OCL_OBJECT_DIR}/\\1.bc" bc_name ${f}) SET(OCL_BC_FILES ${OCL_BC_FILES} ${bc_name}) ENDFOREACH(f) -ADD_CUSTOM_COMMAND(OUTPUT ${LIBOCL_BINARY_DIR}/lib/beignet.bc +ADD_CUSTOM_COMMAND(OUTPUT ${OCL_OBJECT_DIR}/beignet.bc COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/ #COMMAND echo llvm-link -o ${LIBOCL_BINARY_DIR}/lib/beignet.bc ${OCL_BC_FILES} - COMMAND ${LLVM_INSTALL_DIR}llvm-link -o ${LIBOCL_BINARY_DIR}/lib/beignet.bc ${OCL_BC_FILES} + COMMAND ${LLVM_INSTALL_DIR}llvm-link -o ${OCL_OBJECT_DIR}/beignet.bc ${OCL_BC_FILES} DEPENDS ${OCL_BC_FILES} - COMMENT "Generate the bitcode file: ${LIBOCL_BINARY_DIR}/lib/beignet.bc" + COMMENT "Generate the bitcode file: ${OCL_OBJECT_DIR}/beignet.bc" ) -ADD_CUSTOM_COMMAND(OUTPUT ${LIBOCL_BINARY_DIR}/lib/beignet.pch - COMMAND mkdir -p ${LIBOCL_BINARY_DIR}/lib/ - COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -triple spir -I ${LIBOCL_BINARY_DIR}/include/ -emit-pch -x cl ${LIBOCL_BINARY_DIR}/include/ocl.h -o ${LIBOCL_BINARY_DIR}/lib/beignet.pch +ADD_CUSTOM_COMMAND(OUTPUT ${OCL_OBJECT_DIR}/beignet.local.pch + COMMAND mkdir -p ${OCL_OBJECT_DIR} + COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -triple spir -I ${OCL_OBJECT_DIR}/include/ -emit-pch -x cl ${OCL_OBJECT_DIR}/include/ocl.h -o ${OCL_OBJECT_DIR}/beignet.local.pch + DEPENDS ${OCL_HEADER_FILES} + COMMENT "Generate the pch file: ${OCL_OBJECT_DIR}/beignet.pch" + ) + +ADD_CUSTOM_COMMAND(OUTPUT ${OCL_OBJECT_DIR}/beignet.pch + COMMAND mkdir -p ${OCL_OBJECT_DIR} + COMMAND ${LLVM_INSTALL_DIR}clang -cc1 ${CLANG_OCL_FLAGS} -triple spir -I ${OCL_OBJECT_DIR}/include/ --relocatable-pch -emit-pch -isysroot ${LIBOCL_BINARY_DIR} -x cl ${OCL_OBJECT_DIR}/include/ocl.h -o ${OCL_OBJECT_DIR}/beignet.pch DEPENDS ${OCL_HEADER_FILES} - COMMENT "Generate the pch file: ${LIBOCL_BINARY_DIR}/lib/beignet.pch" + COMMENT "Generate the pch file: ${OCL_OBJECT_DIR}/beignet.local.pch" ) -add_custom_target(beignet_bitcode ALL DEPENDS ${LIBOCL_BINARY_DIR}/lib/beignet.bc ${LIBOCL_BINARY_DIR}/lib/beignet.pch) + +add_custom_target(beignet_bitcode ALL DEPENDS ${OCL_OBJECT_DIR}/beignet.bc ${OCL_OBJECT_DIR}/beignet.pch ${OCL_OBJECT_DIR}/beignet.local.pch) +SET (OCL_OBJECT_DIR ${OCL_OBJECT_DIR} PARENT_SCOPE) +SET (OCL_HEADER_FILES ${OCL_HEADER_FILES} PARENT_SCOPE) -- 1.8.3.2 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
