[waffle] [PATCH v3 2/4] waffle: add support for building Waffle using NaCl toolchain

Tapani Pälli tapani.palli at intel.com
Sun Jan 4 23:36:12 PST 2015


Patch adds changes required to use NaCl compiler and libraries to
build Waffle. Build can be configured to use specific version of
the NaCl SDK, toolchain for the build needs to be selected with
cmake variable CMAKE_TOOLCHAIN_FILE.

Example command line to configure a build:

cmake -Dwaffle_has_nacl=ON \
      -Dnacl_sdk_path=/home/tpalli/nacl/nacl_sdk \
      -Dnacl_version=pepper_39 \
      -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-nacl-x86_64-glibc.cmake \
      -DCMAKE_BUILD_TYPE=Release \
      .

v2: cmake fixes, create toolchain files for nacl (Emil Velikov)
v3: rename toolchain files, cmake fixes (Chad Versace, Emil Velikov)

Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
---
 Options.cmake                                 |  5 ++++
 cmake/Modules/WaffleDefineCompilerFlags.cmake |  4 +++
 cmake/Modules/WaffleValidateOptions.cmake     | 31 ++++++++++++++++++--
 cmake/toolchain-nacl-x86_32-glibc.cmake       | 41 +++++++++++++++++++++++++++
 cmake/toolchain-nacl-x86_64-glibc.cmake       | 41 +++++++++++++++++++++++++++
 examples/CMakeLists.txt                       |  4 +++
 src/utils/CMakeLists.txt                      |  4 +++
 src/waffle/CMakeLists.txt                     |  7 +++++
 8 files changed, 135 insertions(+), 2 deletions(-)
 create mode 100644 cmake/toolchain-nacl-x86_32-glibc.cmake
 create mode 100644 cmake/toolchain-nacl-x86_64-glibc.cmake

diff --git a/Options.cmake b/Options.cmake
index c316070..4f097a0 100644
--- a/Options.cmake
+++ b/Options.cmake
@@ -28,6 +28,11 @@ if(waffle_on_linux)
     option(waffle_has_wayland "Build support for Wayland" ${wayland_default})
     option(waffle_has_x11_egl "Build support for X11/EGL" ${x11_egl_default})
     option(waffle_has_gbm "Build support for GBM" ${gbm_default})
+    option(waffle_has_nacl "Build support for NaCl" OFF)
+
+    # NaCl specific settings.
+    set(nacl_sdk_path "" CACHE STRING "Set nacl_sdk path here")
+    set(nacl_version "pepper_39" CACHE STRING "Set NaCl bundle here")
 endif()
 
 option(waffle_build_tests "Build tests" ON)
diff --git a/cmake/Modules/WaffleDefineCompilerFlags.cmake b/cmake/Modules/WaffleDefineCompilerFlags.cmake
index 710b7e0..7532a91 100644
--- a/cmake/Modules/WaffleDefineCompilerFlags.cmake
+++ b/cmake/Modules/WaffleDefineCompilerFlags.cmake
@@ -125,6 +125,10 @@ if(waffle_on_linux)
     add_definitions(-D_XOPEN_SOURCE=600)
 endif()
 
+if(waffle_has_nacl)
+    add_definitions(-DWAFFLE_HAS_NACL)
+endif()
+
 if(waffle_on_windows)
     add_definitions(-DWAFFLE_HAS_WGL)
 endif()
diff --git a/cmake/Modules/WaffleValidateOptions.cmake b/cmake/Modules/WaffleValidateOptions.cmake
index ea60b0e..1275463 100644
--- a/cmake/Modules/WaffleValidateOptions.cmake
+++ b/cmake/Modules/WaffleValidateOptions.cmake
@@ -46,11 +46,38 @@ endif()
 
 if(waffle_on_linux)
     if(NOT waffle_has_glx AND NOT waffle_has_wayland AND
-       NOT waffle_has_x11_egl AND NOT waffle_has_gbm)
+       NOT waffle_has_x11_egl AND NOT waffle_has_gbm AND
+       NOT waffle_has_nacl)
         message(FATAL_ERROR
                 "Must enable at least one of: "
                 "waffle_has_glx, waffle_has_wayland, "
-                "waffle_has_x11_egl, waffle_has_gbm.")
+                "waffle_has_x11_egl, waffle_has_gbm, "
+                "waffle_has_nacl.")
+    endif()
+    if(waffle_has_nacl)
+        if(NOT EXISTS ${nacl_sdk_path})
+            message(FATAL_ERROR "NaCl SDK path not found : ${nacl_sdk_path}")
+        endif()
+
+        if(NOT EXISTS ${CMAKE_TOOLCHAIN_FILE})
+            message(FATAL_ERROR "Toolchain for Nacl not found. This must be "
+                                "configured using CMAKE_TOOLCHAIN_FILE.")
+        endif()
+
+        # Warn the user that building tests is disabled.
+        if(waffle_build_tests)
+            message(WARNING "Building the tests with the NaCl backend "
+                            "is not supported, skipping tests.")
+            set(waffle_build_tests OFF)
+        endif()
+
+        # When building for NaCl, disable incompatible backends.
+        set(waffle_has_gbm OFF)
+        set(waffle_has_egl OFF)
+        set(waffle_has_glx OFF)
+        set(waffle_has_x11 OFF)
+        set(waffle_has_x11_egl OFF)
+        set(waffle_has_wayland OFF)
     endif()
     if(waffle_has_gbm)
         if(NOT gbm_FOUND)
diff --git a/cmake/toolchain-nacl-x86_32-glibc.cmake b/cmake/toolchain-nacl-x86_32-glibc.cmake
new file mode 100644
index 0000000..ec5779f
--- /dev/null
+++ b/cmake/toolchain-nacl-x86_32-glibc.cmake
@@ -0,0 +1,41 @@
+#
+# NaCl toolchain file for 32bit x86 using glibc C library
+#
+
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+    set(CMAKE_SYSTEM_NAME "Linux")
+    set(nacl_host_os "linux")
+else()
+    message(FATAL_ERROR "TODO: NaCl support on ${CMAKE_HOST_SYSTEM_NAME}")
+endif()
+
+set(nacl_target_arch "i686")
+set(nacl_ports "glibc_x86_32")
+set(nacl_toolchain "${nacl_host_os}_x86_glibc")
+
+# setup paths for nacl
+set(nacl_root ${nacl_sdk_path}/${nacl_version})
+set(nacl_toolpath ${nacl_root}/toolchain/${nacl_toolchain}/bin)
+
+# setup compilers from toolchain
+set(CMAKE_C_COMPILER ${nacl_toolpath}/${nacl_target_arch}-nacl-gcc)
+set(CMAKE_CXX_COMPILER ${nacl_toolpath}/${nacl_target_arch}-nacl-g++)
+
+set(CMAKE_FIND_ROOT_PATH ${nacl_root})
+
+# for FIND_LIBRARY|INCLUDE use ${nacl_root} only,
+# for helper programs during build time, use host
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# setup nacl includes and required libraries
+set(nacl_INCLUDE_DIRS ${nacl_INCLUDE_DIRS} ${nacl_sdk_path}/${nacl_version}/include)
+set(nacl_LIBS ${nacl_sdk_path}/${nacl_version}/lib/${nacl_ports}/${CMAKE_BUILD_TYPE})
+set(nacl_LDFLAGS
+    -L${nacl_LIBS}
+    -lppapi_cpp
+    -lppapi
+    -lpthread
+    -ldl
+    )
diff --git a/cmake/toolchain-nacl-x86_64-glibc.cmake b/cmake/toolchain-nacl-x86_64-glibc.cmake
new file mode 100644
index 0000000..f3109ab
--- /dev/null
+++ b/cmake/toolchain-nacl-x86_64-glibc.cmake
@@ -0,0 +1,41 @@
+#
+# NaCl toolchain file for 64bit x86 using glibc C library
+#
+
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+    set(CMAKE_SYSTEM_NAME "Linux")
+    set(nacl_host_os "linux")
+else()
+    message(FATAL_ERROR "TODO: NaCl support on ${CMAKE_HOST_SYSTEM_NAME}")
+endif()
+
+set(nacl_target_arch "x86_64")
+set(nacl_ports "glibc_x86_64")
+set(nacl_toolchain "${nacl_host_os}_x86_glibc")
+
+# setup paths for nacl
+set(nacl_root ${nacl_sdk_path}/${nacl_version})
+set(nacl_toolpath ${nacl_root}/toolchain/${nacl_toolchain}/bin)
+
+# setup compilers from toolchain
+set(CMAKE_C_COMPILER ${nacl_toolpath}/${nacl_target_arch}-nacl-gcc)
+set(CMAKE_CXX_COMPILER ${nacl_toolpath}/${nacl_target_arch}-nacl-g++)
+
+set(CMAKE_FIND_ROOT_PATH ${nacl_root})
+
+# for FIND_LIBRARY|INCLUDE use ${nacl_root} only,
+# for helper programs during build time, use host
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# setup nacl includes and required libraries
+set(nacl_INCLUDE_DIRS ${nacl_INCLUDE_DIRS} ${nacl_sdk_path}/${nacl_version}/include)
+set(nacl_LIBS ${nacl_sdk_path}/${nacl_version}/lib/${nacl_ports}/${CMAKE_BUILD_TYPE})
+set(nacl_LDFLAGS
+    -L${nacl_LIBS}
+    -lppapi_cpp
+    -lppapi
+    -lpthread
+    -ldl
+    )
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index c700a72..fc0bda2 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -20,6 +20,10 @@ endif()
 # Target: gl_basic (executable)
 # ----------------------------------------------------------------------------
 
+if(waffle_has_nacl)
+    return()
+endif()
+
 add_executable(gl_basic gl_basic.c)
 target_link_libraries(gl_basic ${waffle_libname} ${GETOPT_LIBRARIES})
 
diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt
index 9cb6cc7..22edc6e 100644
--- a/src/utils/CMakeLists.txt
+++ b/src/utils/CMakeLists.txt
@@ -2,6 +2,10 @@
 # Target: wflinfo (executable)
 # ----------------------------------------------------------------------------
 
+if(waffle_has_nacl)
+    return()
+endif()
+
 add_executable(wflinfo wflinfo.c)
 target_link_libraries(wflinfo ${waffle_libname} ${GETOPT_LIBRARIES})
 
diff --git a/src/waffle/CMakeLists.txt b/src/waffle/CMakeLists.txt
index d76e029..c62b45d 100644
--- a/src/waffle/CMakeLists.txt
+++ b/src/waffle/CMakeLists.txt
@@ -25,6 +25,7 @@ include_directories(
     ${gl_INCLUDE_DIRS}
     ${GLEXT_INCLUDE_DIR}
     ${libudev_INCLUDE_DIRS}
+    ${nacl_INCLUDE_DIRS}
     ${wayland-client_INCLUDE_DIRS}
     ${wayland-egl_INCLUDE_DIRS}
     ${x11-xcb_INCLUDE_DIRS}
@@ -57,6 +58,12 @@ if(waffle_on_linux)
     endif()
 endif()
 
+if(waffle_has_nacl)
+    list(APPEND waffle_libdeps
+        ${nacl_LDFLAGS}
+        )
+endif()
+
 set(waffle_sources
     api/api_priv.c
     api/waffle_attrib_list.c
-- 
1.9.3



More information about the waffle mailing list