[waffle] [PATCH 1/2] waffle: add support for building Waffle using NaCl toolchain
Emil Velikov
emil.l.velikov at gmail.com
Mon Dec 15 12:23:35 PST 2014
On 15/12/14 12:59, Tapani Pälli wrote:
> 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 but currently toolchain is fixed to glibc and target
> architecture hardcoded as 64bit x86.
>
If I understand things correctly, you're hard-coding within the cmake
what is essentially the toolchain file. I would kindly ask you to not do
that.
> Example command line to configure a build:
>
> cmake -Dwaffle_has_nacl=ON \
> -Dnacl_sdk_path=/home/tpalli/nacl/nacl_sdk \
> -DCMAKE_BUILD_TYPE=Release \
> .
>
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
> Options.cmake | 13 +++++++++++++
> cmake/Modules/WaffleDefineCompilerFlags.cmake | 23 +++++++++++++++++++++++
> cmake/Modules/WaffleDefineInternalOptions.cmake | 4 ++++
> cmake/Modules/WaffleValidateOptions.cmake | 11 +++++++++--
> examples/CMakeLists.txt | 18 ++++++++++--------
> src/CMakeLists.txt | 7 +++++--
> src/waffle/CMakeLists.txt | 10 ++++++++++
> 7 files changed, 74 insertions(+), 12 deletions(-)
>
> diff --git a/Options.cmake b/Options.cmake
> index c316070..a7f4c26 100644
> --- a/Options.cmake
> +++ b/Options.cmake
> @@ -28,6 +28,19 @@ 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()
> +
> +# When building for NaCl, disable uncompatible backends.
> +if(waffle_has_nacl)
> + set(waffle_has_glx OFF)
> + set(waffle_has_x11_egl OFF)
> + set(waffle_has_gbm OFF)
> + set(waffle_has_wayland OFF)
> endif()
s/uncompatible/incompatible/
Is that incompatibility a temporary or a permanent one ?
I was under the impression by replacing the dynamic linking with
dlopen/dlsym we essentially make waffle more versatile.
Afaict you will need a check in WaffleValidateOptions.cmake as the user
can override the values you set in here.
>
> option(waffle_build_tests "Build tests" ON)
> diff --git a/cmake/Modules/WaffleDefineCompilerFlags.cmake b/cmake/Modules/WaffleDefineCompilerFlags.cmake
> index 710b7e0..79d214c 100644
> --- a/cmake/Modules/WaffleDefineCompilerFlags.cmake
> +++ b/cmake/Modules/WaffleDefineCompilerFlags.cmake
> @@ -122,6 +122,29 @@ if(waffle_on_linux)
> add_definitions(-DWAFFLE_HAS_TLS_MODEL_INITIAL_EXEC)
> endif()
>
> + if(waffle_has_nacl)
> + add_definitions(-DWAFFLE_HAS_NACL)
> +
> + # setup architecture and toolchain to use, note that this is
> + # currently hardcoded for 64bit x86 with glibc toolchain
> + set(nacl_target_arch "x86_64")
> + set(nacl_ports "glibc_x86_64")
> + set(nacl_toolchain "linux_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++")
> +
> + # setup nacl include and library paths
> + 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")
> + endif()
> +
See the toolchain comment above. Imho adding a toolchain file to git,
similar to the Archlinux/Debian build scripts, won't be a bad idea.
> add_definitions(-D_XOPEN_SOURCE=600)
> endif()
>
> diff --git a/cmake/Modules/WaffleDefineInternalOptions.cmake b/cmake/Modules/WaffleDefineInternalOptions.cmake
> index 3ef7a25..34dbb61 100644
> --- a/cmake/Modules/WaffleDefineInternalOptions.cmake
> +++ b/cmake/Modules/WaffleDefineInternalOptions.cmake
> @@ -9,3 +9,7 @@ if(waffle_has_glx OR waffle_has_x11_egl)
> else()
> set(waffle_has_x11 FALSE)
> endif()
> +
> +if(waffle_has_nacl)
> + set(waffle_build_tests FALSE)
> +endif()
Move this to Options.cmake.
> diff --git a/cmake/Modules/WaffleValidateOptions.cmake b/cmake/Modules/WaffleValidateOptions.cmake
> index ea60b0e..69eb34a 100644
> --- a/cmake/Modules/WaffleValidateOptions.cmake
> +++ b/cmake/Modules/WaffleValidateOptions.cmake
> @@ -46,11 +46,13 @@ 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_gbm)
> if(NOT gbm_FOUND)
> @@ -122,6 +124,11 @@ if(waffle_on_linux)
> message(FATAL_ERROR "x11_egl dependency is missing: ${x11_egl_missing_deps}")
> endif()
> endif()
> + if(waffle_has_nacl)
> + if(NOT EXISTS ${nacl_sdk_path})
> + message(FATAL_ERROR "NaCl SDK path not found : ${nacl_sdk_path}")
> + endif()
> + endif()
Perhaps you can check a header/library's presence and error out.
Otherwise thing will blow up, if one makes a typo while setting the
variable.
Imho you can add an extra check here:
if(waffle_build_tests)
message(FATAL_ERROR "Building the tests with the NaCl backend is not
supported")
endif()
> elseif(waffle_on_mac)
> if(waffle_has_gbm)
> message(FATAL_ERROR "Option is not supported on Darwin: waffle_has_gbm.")
> diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
> index 281ef47..ede3797 100644
> --- a/examples/CMakeLists.txt
> +++ b/examples/CMakeLists.txt
> @@ -11,7 +11,7 @@ install(
> # Target: simple-x11-egl (executable)
> # ----------------------------------------------------------------------------
>
> -if(waffle_on_linux)
> +if((waffle_on_linux) AND (waffle_has_x11_egl))
That's a nice independent fix. Maybe split it out ?
> add_executable(simple-x11-egl simple-x11-egl.c)
> target_link_libraries(simple-x11-egl ${waffle_libname})
> endif()
> @@ -20,12 +20,14 @@ endif()
> # Target: gl_basic (executable)
> # ----------------------------------------------------------------------------
>
> -add_executable(gl_basic gl_basic.c)
> -target_link_libraries(gl_basic ${waffle_libname} ${GETOPT_LIBRARIES})
> +if(!waffle_has_nacl)
> + add_executable(gl_basic gl_basic.c)
> + target_link_libraries(gl_basic ${waffle_libname} ${GETOPT_LIBRARIES})
Adding the following seems shorter/cleaner, imho.
if(waffle_has_nacl)
return()
endif()
>
> -if(waffle_on_mac)
> - set_target_properties(gl_basic
> - PROPERTIES
> - COMPILE_FLAGS "-ObjC"
> - )
> + if(waffle_on_mac)
> + set_target_properties(gl_basic
> + PROPERTIES
> + COMPILE_FLAGS "-ObjC"
> + )
> + endif()
> endif()
> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
> index aa6d3c3..a47ef10 100644
> --- a/src/CMakeLists.txt
> +++ b/src/CMakeLists.txt
> @@ -1,6 +1,9 @@
> -if(waffle_build_tests)
> +if((waffle_build_tests) AND (!waffle_has_nacl))
> add_subdirectory(waffle_test)
> endif()
>
With the WaffleValidateOptions.cmake change you can drop this.
> -add_subdirectory(utils)
> +if(!waffle_has_nacl)
> + add_subdirectory(utils)
> +endif()
> +
Replace ! with NOT. Optionally add the following in utils/CMakefile.txt
if(waffle_has_nacl)
return()
endif()
> add_subdirectory(waffle)
> diff --git a/src/waffle/CMakeLists.txt b/src/waffle/CMakeLists.txt
> index d76e029..b4dd63f 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}
> @@ -55,6 +56,11 @@ if(waffle_on_linux)
> ${libudev_LDFLAGS}
> )
> endif()
> + if(waffle_has_nacl)
> + list(APPEND waffle_libdeps
> + ${nacl_LDFLAGS}
> + )
> + endif()
> endif()
>
> set(waffle_sources
> @@ -278,6 +284,10 @@ function(add_unittest unittest_name)
> return()
> endif()
>
> + if(waffle_has_nacl)
> + return()
> + endif()
> +
With the WaffleValidateOptions.cmake change you can drop this hunk.
Nicely done Tapani. Must admit that you're work with cmake is way better
than my first attempts :P
-Emil
More information about the waffle
mailing list