diff options
Diffstat (limited to 'meta/classes/cmake.bbclass')
-rw-r--r-- | meta/classes/cmake.bbclass | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/meta/classes/cmake.bbclass b/meta/classes/cmake.bbclass new file mode 100644 index 0000000000..995ddf1ea2 --- /dev/null +++ b/meta/classes/cmake.bbclass | |||
@@ -0,0 +1,121 @@ | |||
1 | # Path to the CMake file to process. | ||
2 | OECMAKE_SOURCEPATH ?= "${S}" | ||
3 | |||
4 | DEPENDS_prepend = "cmake-native " | ||
5 | B = "${WORKDIR}/build" | ||
6 | |||
7 | # We need to unset CCACHE otherwise cmake gets too confused | ||
8 | CCACHE = "" | ||
9 | |||
10 | # We want the staging and installing functions from autotools | ||
11 | inherit autotools | ||
12 | |||
13 | # C/C++ Compiler (without cpu arch/tune arguments) | ||
14 | OECMAKE_C_COMPILER ?= "`echo ${CC} | sed 's/^\([^ ]*\).*/\1/'`" | ||
15 | OECMAKE_CXX_COMPILER ?= "`echo ${CXX} | sed 's/^\([^ ]*\).*/\1/'`" | ||
16 | |||
17 | # Compiler flags | ||
18 | OECMAKE_C_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CFLAGS}" | ||
19 | OECMAKE_CXX_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS}" | ||
20 | OECMAKE_C_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} ${CFLAGS} -DNDEBUG" | ||
21 | OECMAKE_CXX_FLAGS_RELEASE ?= "${SELECTED_OPTIMIZATION} ${CXXFLAGS} -DNDEBUG" | ||
22 | OECMAKE_C_LINK_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CPPFLAGS} ${LDFLAGS}" | ||
23 | OECMAKE_CXX_LINK_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS} ${LDFLAGS}" | ||
24 | |||
25 | OECMAKE_RPATH ?= "" | ||
26 | OECMAKE_PERLNATIVE_DIR ??= "" | ||
27 | OECMAKE_EXTRA_ROOT_PATH ?= "" | ||
28 | |||
29 | cmake_do_generate_toolchain_file() { | ||
30 | cat > ${WORKDIR}/toolchain.cmake <<EOF | ||
31 | # CMake system name must be something like "Linux". | ||
32 | # This is important for cross-compiling. | ||
33 | set( CMAKE_SYSTEM_NAME `echo ${TARGET_OS} | sed -e 's/^./\u&/' -e 's/^\(Linux\).*/\1/'` ) | ||
34 | set( CMAKE_SYSTEM_PROCESSOR ${TARGET_ARCH} ) | ||
35 | set( CMAKE_C_COMPILER ${OECMAKE_C_COMPILER} ) | ||
36 | set( CMAKE_CXX_COMPILER ${OECMAKE_CXX_COMPILER} ) | ||
37 | set( CMAKE_ASM_COMPILER ${OECMAKE_C_COMPILER} ) | ||
38 | set( CMAKE_C_FLAGS "${OECMAKE_C_FLAGS}" CACHE STRING "CFLAGS" ) | ||
39 | set( CMAKE_CXX_FLAGS "${OECMAKE_CXX_FLAGS}" CACHE STRING "CXXFLAGS" ) | ||
40 | set( CMAKE_ASM_FLAGS "${OECMAKE_C_FLAGS}" CACHE STRING "ASM FLAGS" ) | ||
41 | set( CMAKE_C_FLAGS_RELEASE "${OECMAKE_C_FLAGS_RELEASE}" CACHE STRING "CFLAGS for release" ) | ||
42 | set( CMAKE_CXX_FLAGS_RELEASE "${OECMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "CXXFLAGS for release" ) | ||
43 | set( CMAKE_ASM_FLAGS_RELEASE "${OECMAKE_C_FLAGS_RELEASE}" CACHE STRING "ASM FLAGS for release" ) | ||
44 | set( CMAKE_C_LINK_FLAGS "${OECMAKE_C_LINK_FLAGS}" CACHE STRING "LDFLAGS" ) | ||
45 | set( CMAKE_CXX_LINK_FLAGS "${OECMAKE_CXX_LINK_FLAGS}" CACHE STRING "LDFLAGS" ) | ||
46 | |||
47 | # only search in the paths provided so cmake doesnt pick | ||
48 | # up libraries and tools from the native build machine | ||
49 | set( CMAKE_FIND_ROOT_PATH ${STAGING_DIR_HOST} ${STAGING_DIR_NATIVE} ${CROSS_DIR} ${OECMAKE_PERLNATIVE_DIR} ${OECMAKE_EXTRA_ROOT_PATH} ${EXTERNAL_TOOLCHAIN}) | ||
50 | set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY ) | ||
51 | set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) | ||
52 | set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) | ||
53 | set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) | ||
54 | |||
55 | # Use qt.conf settings | ||
56 | set( ENV{QT_CONF_PATH} ${WORKDIR}/qt.conf ) | ||
57 | |||
58 | # We need to set the rpath to the correct directory as cmake does not provide any | ||
59 | # directory as rpath by default | ||
60 | set( CMAKE_INSTALL_RPATH ${OECMAKE_RPATH} ) | ||
61 | |||
62 | # Use native cmake modules | ||
63 | set( CMAKE_MODULE_PATH ${STAGING_DATADIR}/cmake/Modules/ ) | ||
64 | |||
65 | # add for non /usr/lib libdir, e.g. /usr/lib64 | ||
66 | set( CMAKE_LIBRARY_PATH ${libdir} ${base_libdir}) | ||
67 | |||
68 | EOF | ||
69 | } | ||
70 | |||
71 | addtask generate_toolchain_file after do_patch before do_configure | ||
72 | |||
73 | cmake_do_configure() { | ||
74 | if [ "${OECMAKE_BUILDPATH}" ]; then | ||
75 | bbnote "cmake.bbclass no longer uses OECMAKE_BUILDPATH. The default behaviour is now out-of-tree builds with B=WORKDIR/build." | ||
76 | fi | ||
77 | |||
78 | if [ "${S}" != "${B}" ]; then | ||
79 | rm -rf ${B} | ||
80 | mkdir -p ${B} | ||
81 | cd ${B} | ||
82 | fi | ||
83 | |||
84 | # Just like autotools cmake can use a site file to cache result that need generated binaries to run | ||
85 | if [ -e ${WORKDIR}/site-file.cmake ] ; then | ||
86 | OECMAKE_SITEFILE=" -C ${WORKDIR}/site-file.cmake" | ||
87 | else | ||
88 | OECMAKE_SITEFILE="" | ||
89 | fi | ||
90 | |||
91 | cmake \ | ||
92 | ${OECMAKE_SITEFILE} \ | ||
93 | ${OECMAKE_SOURCEPATH} \ | ||
94 | -DCMAKE_INSTALL_PREFIX:PATH=${prefix} \ | ||
95 | -DCMAKE_INSTALL_BINDIR:PATH=${bindir} \ | ||
96 | -DCMAKE_INSTALL_SBINDIR:PATH=${sbindir} \ | ||
97 | -DCMAKE_INSTALL_LIBEXECDIR:PATH=${libexecdir} \ | ||
98 | -DCMAKE_INSTALL_SYSCONFDIR:PATH=${sysconfdir} \ | ||
99 | -DCMAKE_INSTALL_SHAREDSTATEDIR:PATH=${sharedstatedir} \ | ||
100 | -DCMAKE_INSTALL_LOCALSTATEDIR:PATH=${localstatedir} \ | ||
101 | -DCMAKE_INSTALL_LIBDIR:PATH=${libdir} \ | ||
102 | -DCMAKE_INSTALL_INCLUDEDIR:PATH=${includedir} \ | ||
103 | -DCMAKE_INSTALL_DATAROOTDIR:PATH=${datadir} \ | ||
104 | -DCMAKE_INSTALL_SO_NO_EXE=0 \ | ||
105 | -DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain.cmake \ | ||
106 | -DCMAKE_VERBOSE_MAKEFILE=1 \ | ||
107 | ${EXTRA_OECMAKE} \ | ||
108 | -Wno-dev | ||
109 | } | ||
110 | |||
111 | cmake_do_compile() { | ||
112 | cd ${B} | ||
113 | base_do_compile | ||
114 | } | ||
115 | |||
116 | cmake_do_install() { | ||
117 | cd ${B} | ||
118 | autotools_do_install | ||
119 | } | ||
120 | |||
121 | EXPORT_FUNCTIONS do_configure do_compile do_install do_generate_toolchain_file | ||