[oe] [PATCH] Add toolchain file generation to cmake bbclass
Valentin Longchamp
valentin.longchamp at epfl.ch
Tue Aug 25 09:07:47 UTC 2009
Matthew Dombroski wrote:
> It is possible to make cmake use a toolchain file that defines flags,
> search
> paths and any other cmake options.
>
> The main reason for making openembedded generate a toolchain file is
> to enable the building of complex packages. Without it a package
> requiring Qt4 or boost (or one of many other packages) probably wont find
> the right libs and won't build properly.
I have had no problem with boost and with Qt4, I have been able to
achieve similar results without the toolchain file, only by using a
qt.conf file as Zecke had suggested to me.
Although the toolchain file is the preferred value according to the
cmake documentation, it has not been necessary to me.
I attach the recipe I use below (and have added a small comment in your
patch inline):
> DESCRIPTION = "aseba is an event-based architecture for distributed robots control"
> HOMEPAGE = "http://mobots.epfl.ch/aseba.html"
> LICENCE = "GPL"
> PR = "r1"
>
> PV = "svn${SRCDATE}"
> DEPENDS = "dashel qt4-embedded"
> LEAD_SONAME = "libasebacore.so"
>
> SRC_URI = "svn://svn.gna.org/svn/aseba;module=trunk"
>
> S = "${WORKDIR}/trunk"
>
> inherit qt4e cmake
>
> EXTRA_OECMAKE += "-DSHARED_LIBS:BOOL=ON -DCMD_LINE:BOOL=ON \
> -DQT_LIBRARY_DIR=${OE_QMAKE_LIBDIR_QT} \
> -DQT_INSTALL_LIBS=${OE_QMAKE_LIBDIR_QT} \
> -DQT_INCLUDE_DIR=${OE_QMAKE_INCDIR_QT} \
> -DQT_MOC_EXECUTABLE=${OE_QMAKE_MOC} \
> -DQT_UIC_EXECUTABLE=${OE_QMAKE_UIC} \
> -DQT_UIC3_EXECUTABLE=${OE_QMAKE_UIC3} \
> -DQT_RCC_EXECUTABLE=${OE_QMAKE_RCC} \
> -DQT_QMAKE_EXECUTABLE=${OE_QMAKE_QMAKE} \
> -DQT_QTCORE_INCLUDE_DIR=${OE_QMAKE_INCDIR_QT}/QtCore \
> -DQT_DBUSXML2CPP_EXECUTABLE=/usr/bin/qdbusxml2cpp \
> -DQT_DBUSCPP2XML_EXECUTABLE=/usr/bin/qdbuscpp2xml \
> "
>
> export QT_CONF_PATH="${WORKDIR}/trunk/qt.conf"
>
> do_configure_prepend() {
> echo "[Paths]" > $QT_CONF_PATH
> echo "Prefix=${STAGING_DIR}/${HOST_SYS}/usr" >> $QT_CONF_PATH
> echo "Documentation=${docdir}/${QT_DIR_NAME}" >> $QT_CONF_PATH
> echo "Headers=${STAGING_INCDIR}/${QT_DIR_NAME}" >> $QT_CONF_PATH
> echo "Libraries=${STAGING_LIBDIR}" >> $QT_CONF_PATH
> echo "Binaries=${STAGING_BINDIR_NATIVE}" >> $QT_CONF_PATH
> echo "Plugins=${libdir}/${QT_DIR_NAME}/plugins" >> $QT_CONF_PATH
> echo "Data=${datadir}/${QT_DIR_NAME}" >> $QT_CONF_PATH
> echo "Translations=${datadir}/${QT_DIR_NAME}/translations" >> $QT_CONF_PATH
> echo "Settings=${sysconfdir}/${QT_DIR_NAME}" >> $QT_CONF_PATH
> echo "Examples=${bindir}/${QT_DIR_NAME}/examples" >> $QT_CONF_PATH
> echo "Demos=${bindir}/${QT_DIR_NAME}/demos" >> $QT_CONF_PATH
> }
>
> do_stage() {
> oe_libinstall -so libasebacore ${STAGING_LIBDIR}
> oe_libinstall -so libasebacompiler ${STAGING_LIBDIR}
> oe_libinstall -so libasebavm ${STAGING_LIBDIR}
>
> install -d ${STAGING_INCDIR}/aseba
> install -d ${STAGING_INCDIR}/aseba/common
> install -m 0644 common/consts.h ${STAGING_INCDIR}/aseba/common
> install -m 0644 common/types.h ${STAGING_INCDIR}/aseba/common
> install -d ${STAGING_INCDIR}/aseba/msg
> install -m 0644 msg/descriptions-manager.h ${STAGING_INCDIR}/aseba/msg
> install -m 0644 msg/msg.h ${STAGING_INCDIR}/aseba/msg
> install -d ${STAGING_INCDIR}/aseba/utils
> install -m 0644 utils/FormatableString.h ${STAGING_INCDIR}/aseba/utils
> install -m 0644 utils/utils.h ${STAGING_INCDIR}/aseba/utils
> }
>
> FILES_${PN} += "${libdir}/libasebacore.so"
> FILES_${PN} += "${libdir}/libasebacompiler.so"
> FILES_${PN} += "${libdir}/libasebavm.so"
>
> I have added compiler flags mainly for use outside of openembedded, so I
> can copy the generated toolchain file and use it manually.
> ---
> classes/cmake.bbclass | 67
> ++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 66 insertions(+), 1 deletions(-)
>
> diff --git a/classes/cmake.bbclass b/classes/cmake.bbclass
> index b5b7b86..38bed63 100644
> --- a/classes/cmake.bbclass
> +++ b/classes/cmake.bbclass
> @@ -11,6 +11,67 @@ OECMAKE_SOURCEPATH ?= "."
> # "-C ${OECMAKE_BUILDPATH}". So it will run the right makefiles.
> OECMAKE_BUILDPATH ?= ""
>
> +# C/C++ Compiler (without cpu arch/tune arguments)
> +OECMAKE_C_COMPILER ?= "`echo ${CC} | sed 's/^\([^ ]*\).*/\1/'`"
> +OECMAKE_CXX_COMPILER ?= "`echo ${CXX} | sed 's/^\([^ ]*\).*/\1/'`"
> +
> +# Compiler flags
> +OECMAKE_C_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}
> ${BUILD_CPPFLAGS}"
> +OECMAKE_CXX_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}
> ${BUILD_CPPFLAGS} -fpermissive"
> +OECMAKE_C_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} -DNDEBUG"
> +OECMAKE_CXX_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} -DNDEBUG"
> +
> +
> +#
> +# Generate cmake toolchain file
> +#
> +cmake_generate_toolchain_file() {
> + rm -f ${WORKDIR}/toolchain.cmake
> + touch ${WORKDIR}/toolchain.cmake
> +
> +# CMake system name must be something like "Linux".
> +# This is important for cross-compiling.
> + echo "set( CMAKE_SYSTEM_NAME" `echo ${SDK_OS} | sed 's/^./\u&/'` ")"
> >> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_C_COMPILER ${OECMAKE_C_COMPILER} )" >>
> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_CXX_COMPILER ${OECMAKE_CXX_COMPILER} )" >>
> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_C_FLAGS \"${OECMAKE_C_FLAGS}\" CACHE STRING
> \"OpenEmbedded CFLAGS\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_CXX_FLAGS \"${OECMAKE_CXX_FLAGS}\" CACHE STRING
> \"OpenEmbedded CXXFLAGS\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_C_FLAGS_RELEASE \"${OECMAKE_C_FLAGS_RELEASE}\" CACHE
> STRING \"CFLAGS for release\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_CXX_FLAGS_RELEASE \"${OECMAKE_CXX_FLAGS_RELEASE}\"
> CACHE STRING \"CXXFLAGS for release\" )" >> ${WORKDIR}/toolchain.cmake
> +
> +# only search in the paths provided (from openembedded) so cmake doesnt
> pick
> +# up libraries and tools from the native build machine
> + echo "set( CMAKE_FIND_ROOT_PATH ${STAGING_DIR_HOST}
> ${STAGING_DIR_NATIVE} ${CROSS_DIR} )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )" >>
> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )" >>
> ${WORKDIR}/toolchain.cmake
> + echo "set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )" >>
> ${WORKDIR}/toolchain.cmake
> +# Use native cmake modules
> + echo "set( CMAKE_MODULE_PATH
> ${STAGING_DIR_NATIVE}/usr/share/cmake-2.6/Modules/ )" >>
> ${WORKDIR}/toolchain.cmake
> +
> +# Boost libraries have an unusual naming convention thanks to bjam
> + echo "set( Boost_COMPILER \"-gcc\" CACHE STRING \"Boost gcc string\"
> )" >> ${WORKDIR}/toolchain.cmake
> +
> +# Qt4 support is complex because FindQt4.cmake requires a lot of
> information
> +# about the Qt environment.
> + if [ ${QMAKESPEC} ]
> + then
> +# In the bbfile inherit one of qmake2/qt4e/qt4x11 and this section will be
> +# filled out
> + echo "set( QT_HEADERS_DIR ${OE_QMAKE_INCDIR_QT} CACHE STRING \"Qt4
> include dir\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_LIBRARY_DIR ${OE_QMAKE_LIBDIR_QT} CACHE STRING \"Qt4
> library dir\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_QMAKE_EXECUTABLE ${OE_QMAKE_QMAKE} CACHE STRING
> \"qmake2 binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_MOC_EXECUTABLE ${OE_QMAKE_MOC} CACHE STRING \"Qt4 moc
> binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_UIC_EXECUTABLE ${OE_QMAKE_UIC} CACHE STRING \"Qt4 uic
> binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_UIC3_EXECUTABLE ${OE_QMAKE_UIC3} CACHE STRING \"Qt4
> uic3 binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_RCC_EXECUTABLE ${OE_QMAKE_RCC} CACHE STRING \"Qt4 rcc
> binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_DBUSXML2CPP_EXECUTABLE ${OE_QMAKE_QDBUSXML2CPP} CACHE
> STRING \"Qt4 dbus xml2cpp binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_DBUSCPP2XML_EXECUTABLE ${OE_QMAKE_QDBUSCPP2XML} CACHE
> STRING \"Qt4 dbus cpp2xml binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_LRELEASE_EXECUTABLE ${OE_QMAKE_LRELEASE} CACHE STRING
> \"Qt4 lrelease binary\" )" >> ${WORKDIR}/toolchain.cmake
> + echo "set( QT_LUPDATE_EXECUTABLE ${OE_QMAKE_LUPDATE} CACHE STRING
> \"Qt4 lupdate binary\" )" >> ${WORKDIR}/toolchain.cmake
> + fi
> +}
> +
> +
> cmake_do_configure() {
> if [ ${OECMAKE_BUILDPATH} ]
> then
> @@ -18,9 +79,13 @@ cmake_do_configure() {
> cd ${OECMAKE_BUILDPATH}
> fi
>
> + cmake_generate_toolchain_file
> +
> cmake ${OECMAKE_SOURCEPATH} \
> + -DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain.cmake \
> -DCMAKE_INSTALL_PREFIX:PATH=${prefix} \
> - -DCMAKE_FIND_ROOT_PATH=${STAGING_DIR_HOST} \
> + -DCMAKE_VERBOSE_MAKEFILE=1 \
> + -DCMAKE_BUILD_TYPE=Release \
> ${EXTRA_OECMAKE} \
> -Wno-dev
With my above config file, here is what I have to the cmake command:
> cmake ${OECMAKE_SOURCEPATH} \
> -DCMAKE_INSTALL_PREFIX:PATH=${prefix} \
> -DCMAKE_FIND_ROOT_PATH="${STAGING_DIR_HOST};${STAGING_DIR_NATIVE}" \
> -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=BOTH \
> -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
> -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
> ${EXTRA_OECMAKE} \
> -Wno-dev
which is similar to what you had in your toolchain.cmake file.
> }
> --
> 1.6.3.3
More information about the Openembedded-devel
mailing list