Refine the method to find pch and pcm files.
authorZhigang Gong <zhigang.gong@intel.com>
Thu, 9 Jan 2014 09:36:37 +0000 (17:36 +0800)
committerZhigang Gong <zhigang.gong@intel.com>
Fri, 10 Jan 2014 09:27:55 +0000 (17:27 +0800)
When compile user kernels, we need to find the precompiled header
file and the precompiled module file. The previous implementation
will find the build directory then find the system directory.

This is not elegant when it is packaged to a distro. It doesn't
need to search the build directory. So I change the default search
path to the system directory only. And for the deveoper, I change
the build script to set a proper environment variable and make the
gbe bin generator and the utest could find the local pch files and
pcm files firstly.

The only change is now, after the build process. Before the user
run the utests, it need to set up the environment firstly. Just
invoke

. utest/setenv.sh.

Then everything should be the same as previous. This setenv.sh also
set the OCL_KERNEL_PATH, so you don't need to set it manually now.

This patch also update the document.

Signed-off-by: Zhigang Gong <zhigang.gong@intel.com>
backend/CMakeLists.txt
backend/src/CMakeLists.txt
backend/src/GBEConfig.h.in
backend/src/backend/program.cpp
docs/Beignet.mdwn
src/CMakeLists.txt
utests/CMakeLists.txt
utests/utest.cpp

index 476c6f2..dd55a4a 100644 (file)
@@ -91,9 +91,15 @@ elseif (COMPILER STREQUAL "ICC")
   set (CCMAKE_CXX_FLAGS_MINSIZEREL "-Os -DGBE_DEBUG=0")
   set (CMAKE_EXE_LINKER_FLAGS "")
 endif ()
+
 include_directories (${CMAKE_CURRENT_BINARY_DIR})
 ##############################################################
 # Project source code
 ##############################################################
 add_subdirectory (src)
+set(LOCAL_PCH_OBJECT_DIR ${LOCAL_PCH_OBJECT_DIR} PARENT_SCOPE)
+set(LOCAL_PCM_OBJECT_DIR ${LOCAL_PCM_OBJECT_DIR} PARENT_SCOPE)
+set (GBE_BIN_GENERATER
+     OCL_PCM_PATH=${LOCAL_PCM_OBJECT_DIR} OCL_PCH_PATH=${LOCAL_PCH_OBJECT_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src/gbe_bin_generater
+     PARENT_SCOPE)
 
index d19cb50..d15e7b7 100644 (file)
@@ -195,9 +195,13 @@ TARGET_LINK_LIBRARIES(gbe_bin_generater gbe)
 install (FILES ${ocl_blob_file} DESTINATION lib/beignet)
 install (FILES ${pch_object} DESTINATION lib/beignet)
 install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${pcm_lib} DESTINATION lib/beignet)
+# When build beignet itself, we need to export the local precompiled header file and precompiled module
+# file to libcl and utests.
+set (LOCAL_PCH_OBJECT_DIR "${local_pch_object}:${beignet_install_path}/ocl_stdlib.h.pch" PARENT_SCOPE)
+set (LOCAL_PCM_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${pcm_lib}:${beignet_install_path}/${pcm_lib}" PARENT_SCOPE)
 
-set (PCH_OBJECT_DIR "${local_pch_object};${beignet_install_path}/ocl_stdlib.h.pch")
-set (PCM_LIB_DIR "${CMAKE_CURRENT_BINARY_DIR}/${pcm_lib};${beignet_install_path}/${pcm_lib}")
+set (PCH_OBJECT_DIR "${beignet_install_path}/ocl_stdlib.h.pch")
+set (PCM_OBJECT_DIR "${beignet_install_path}/${pcm_lib}")
 configure_file (
   "GBEConfig.h.in"
   "GBEConfig.h"
index 9920d25..5bc09b8 100644 (file)
@@ -2,4 +2,4 @@
 #define LIBGBE_VERSION_MAJOR @LIBGBE_VERSION_MAJOR@
 #define LIBGBE_VERSION_MINOR @LIBGBE_VERSION_MINOR@
 #define PCH_OBJECT_DIR "@PCH_OBJECT_DIR@"
-#define PCM_LIB_DIR "@PCM_LIB_DIR@"
+#define PCM_OBJECT_DIR "@PCM_OBJECT_DIR@"
index 3ab1bc2..284a755 100644 (file)
@@ -465,6 +465,9 @@ namespace gbe {
   }
 
   BVAR(OCL_OUTPUT_BUILD_LOG, false);
+  SVAR(OCL_PCH_PATH, PCH_OBJECT_DIR);
+  SVAR(OCL_PCM_PATH, PCM_OBJECT_DIR);
+
   static bool buildModuleFromSource(const char* input, const char* output, std::string options,
                                     size_t stringSize, char *err, size_t *errSize) {
     // Arguments to pass to the clang frontend
@@ -582,12 +585,13 @@ namespace gbe {
     // Create an action and make the compiler instance carry it out
     llvm::OwningPtr<clang::CodeGenAction> Act(new clang::EmitLLVMOnlyAction());
 
-    std::string dirs = PCM_LIB_DIR, pcmLib;
+    std::string dirs = OCL_PCM_PATH;
+    std::string pcmFileName;
     std::istringstream idirs(dirs);
     bool findPcm = false;
 
-    while (getline(idirs, pcmLib, ';')) {
-      if(access(pcmLib.c_str(), R_OK) == 0) {
+    while (getline(idirs, pcmFileName, ':')) {
+      if(access(pcmFileName.c_str(), R_OK) == 0) {
         findPcm = true;
         break;
       }
@@ -595,7 +599,7 @@ namespace gbe {
 
     GBE_ASSERT(findPcm && "Could not find pre compiled module library.\n");
 
-    Clang.getCodeGenOpts().LinkBitcodeFile = pcmLib;
+    Clang.getCodeGenOpts().LinkBitcodeFile = pcmFileName;
     auto retVal = Clang.ExecuteAction(*Act);
 
     if (err != NULL) {
@@ -651,7 +655,6 @@ namespace gbe {
     char clStr[L_tmpnam+1], llStr[L_tmpnam+1];
     const std::string clName = std::string(tmpnam_r(clStr)) + ".cl"; /* unsafe! */
     const std::string llName = std::string(tmpnam_r(llStr)) + ".ll"; /* unsafe! */
-    std::string pchHeaderName;
     std::string clOpt;
     int optLevel = 1;
 
@@ -730,11 +733,12 @@ namespace gbe {
       clOpt += options;
     }
 
-    std::string dirs = PCH_OBJECT_DIR;
+    std::string dirs = OCL_PCH_PATH;
     std::istringstream idirs(dirs);
+    std::string pchFileName;
 
-    while (getline(idirs, pchHeaderName, ';')) {
-      if(access(pchHeaderName.c_str(), R_OK) == 0) {
+    while (getline(idirs, pchFileName, ':')) {
+      if(access(pchFileName.c_str(), R_OK) == 0) {
         findPCH = true;
         break;
       }
@@ -742,7 +746,7 @@ namespace gbe {
 
     if (usePCH && findPCH) {
       clOpt += " -include-pch ";
-      clOpt += pchHeaderName;
+      clOpt += pchFileName;
       clOpt += " ";
     } else
       fwrite(ocl_stdlib_str.c_str(), strlen(ocl_stdlib_str.c_str()), 1, clFile);
index d05950f..e3b4b1b 100644 (file)
@@ -70,8 +70,10 @@ this code also produces various tests to ensure the compiler and the run-time
 consistency. This small test framework uses a simple c++ registration system to
 register all the unit tests.
 
-You need to set the variable `OCL_KERNEL_PATH` to locate the OCL kernels. They
-are with the run-time in `./kernels`.
+You need to call setenv.sh in the utests/ directory to set some environment variables
+firstly as below:
+
+`> . setenv.sh`
 
 Then in `utests/`:
 
@@ -83,6 +85,20 @@ will run all the unit tests one after the others
 
 will only run `some_unit_test0` and `some_unit_test1` tests
 
+How to install
+--------------
+
+Simply invoke:
+`> make install`
+
+It installs libcl.so and the precompiled header/module files and the ocl_stdlib.h file
+into install_prefix/beignet/ direcotry. If the system support ICD, it also installs the
+intel-beignet.icd to /etc/OpenCL/vendors/.
+
+To make beignet support ICD, you need to have the following two packages installed:
+ocl-icd-dev, ocl-icd-libopencl1 (package name for the ubuntu.)
+before your build beignet.
+
 Supported Hardware
 ------------------
 
index cf53a69..7d4d93d 100644 (file)
@@ -4,7 +4,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}
                     ${CMAKE_CURRENT_SOURCE_DIR}/../backend/src/backend/
                     ${CMAKE_CURRENT_SOURCE_DIR}/../include
                     ${MESA_SOURCE_INCLUDES})
-
 macro (MakeKernelBinStr KERNEL_PATH KERNEL_FILES)
 foreach (KF ${KERNEL_FILES})
   set (input_file ${KERNEL_PATH}/${KF}.cl)
@@ -13,7 +12,7 @@ foreach (KF ${KERNEL_FILES})
   add_custom_command(
     OUTPUT ${output_file}
     COMMAND rm -rf ${output_file}
-    COMMAND ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater -s ${input_file} -o${output_file}
+    COMMAND ${GBE_BIN_GENERATER} -s ${input_file} -o${output_file}
     DEPENDS ${input_file} ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater)
 endforeach (KF)
 endmacro (MakeKernelBinStr)
index b1f0b52..8c64844 100644 (file)
@@ -12,6 +12,11 @@ string(REGEX REPLACE "generated/([^\ ]*)\\.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../
 string(REGEX REPLACE " " ";" KERNEL_MATH_LIST ${KERNEL_MATH_LIST})
 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "generated;${KERNEL_MATH_LIST}")
 
+configure_file (
+  "setenv.sh.in"
+  "setenv.sh"
+  )
+
 link_directories (${LLVM_LIBRARY_DIR})
 set (utests_sources
   utest_error.c
@@ -170,7 +175,7 @@ set (utests_sources
 SET (kernel_bin ${CMAKE_CURRENT_SOURCE_DIR}/../kernels/compiler_ceil)
 ADD_CUSTOM_COMMAND(
     OUTPUT ${kernel_bin}.bin
-    COMMAND ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater ${kernel_bin}.cl -o${kernel_bin}.bin
+    COMMAND ${GBE_BIN_GENERATER} ${kernel_bin}.cl -o${kernel_bin}.bin
     DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater ${kernel_bin}.cl
     )
 
@@ -189,8 +194,8 @@ add_custom_target(utest_generator
 
 if (EGL_FOUND AND MESA_SOURCE_FOUND)
 SET(utests_sources ${utests_sources} compiler_fill_gl_image.cpp)
-SET(CMAKE_CXX_FLAGS "-DHAS_EGL ${CMAKE_CXX_FLAGS}")
-SET(CMAKE_C_FLAGS "-DHAS_EGL ${CMAKE_C_FLAGS}")
+SET(CMAKE_CXX_FLAGS "-DHAS_EGL ${CMAKE_CXX_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")
+SET(CMAKE_C_FLAGS "-DHAS_EGL ${CMAKE_C_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")
 endif (EGL_FOUND AND MESA_SOURCE_FOUND)
 
 ADD_LIBRARY(utests SHARED ${ADDMATHFUNC} ${utests_sources})
index 6d51598..718916f 100644 (file)
@@ -41,8 +41,6 @@ UTest::UTest(Function fn, const char *name, bool haveIssue, bool needDestroyProg
   utestList->push_back(*this);
 }
 
-UTest::UTest(void) : fn(NULL), name(NULL), haveIssue(false) {}
-
 static bool strequal(const char *s1, const char *s2) {
   if (strcmp(s1, s2) == 0) return true;
   return false;