mirror of
https://git.yoctoproject.org/poky
synced 2026-02-21 08:59:41 +01:00
Setting VERBOSE always, while is fine on one hand for debugging, its coming at an expense of creating lots and lots of logs, e.g. qtwebkit compile logs alone with VERBOSE is 163MB, there are many other large packages which use cmake e.g. WPE, webkitgtk etc which are in same range with out this option on, the logs reduce to 861K and also speeds up build a notch If user needs to disable these logs for a recipe or globally CMAKE_VERBOSE = "" in recipe or in global metadata e.g. local.conf (From OE-Core rev: f8d2cd0025f97819898da26041f353d527a27952) Signed-off-by: Khem Raj <raj.khem@gmail.com> Cc: Ross Burton <ross.burton@intel.com> Cc: Andre McCurdy <armccurdy@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
207 lines
8.1 KiB
Plaintext
207 lines
8.1 KiB
Plaintext
# Path to the CMake file to process.
|
|
OECMAKE_SOURCEPATH ??= "${S}"
|
|
|
|
DEPENDS_prepend = "cmake-native "
|
|
B = "${WORKDIR}/build"
|
|
|
|
# What CMake generator to use.
|
|
# The supported options are "Unix Makefiles" or "Ninja".
|
|
OECMAKE_GENERATOR ?= "Ninja"
|
|
|
|
python() {
|
|
generator = d.getVar("OECMAKE_GENERATOR")
|
|
if "Unix Makefiles" in generator:
|
|
args = "-G '" + generator + "' -DCMAKE_MAKE_PROGRAM=" + d.getVar("MAKE")
|
|
d.setVar("OECMAKE_GENERATOR_ARGS", args)
|
|
d.setVarFlag("do_compile", "progress", "percent")
|
|
elif "Ninja" in generator:
|
|
args = "-G '" + generator + "' -DCMAKE_MAKE_PROGRAM=ninja"
|
|
d.appendVar("DEPENDS", " ninja-native")
|
|
d.setVar("OECMAKE_GENERATOR_ARGS", args)
|
|
d.setVarFlag("do_compile", "progress", r"outof:^\[(\d+)/(\d+)\]\s+")
|
|
else:
|
|
bb.fatal("Unknown CMake Generator %s" % generator)
|
|
|
|
# C/C++ Compiler (without cpu arch/tune arguments)
|
|
if not d.getVar('OECMAKE_C_COMPILER'):
|
|
cc_list = d.getVar('CC').split()
|
|
if cc_list[0] == 'ccache':
|
|
d.setVar('OECMAKE_C_COMPILER_LAUNCHER', cc_list[0])
|
|
d.setVar('OECMAKE_C_COMPILER', cc_list[1])
|
|
else:
|
|
d.setVar('OECMAKE_C_COMPILER', cc_list[0])
|
|
|
|
if not d.getVar('OECMAKE_CXX_COMPILER'):
|
|
cxx_list = d.getVar('CXX').split()
|
|
if cxx_list[0] == 'ccache':
|
|
d.setVar('OECMAKE_CXX_COMPILER_LAUNCHER', cxx_list[0])
|
|
d.setVar('OECMAKE_CXX_COMPILER', cxx_list[1])
|
|
else:
|
|
d.setVar('OECMAKE_CXX_COMPILER', cxx_list[0])
|
|
}
|
|
OECMAKE_AR ?= "${AR}"
|
|
|
|
# Compiler flags
|
|
OECMAKE_C_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CFLAGS}"
|
|
OECMAKE_CXX_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS}"
|
|
OECMAKE_C_FLAGS_RELEASE ?= "-DNDEBUG"
|
|
OECMAKE_CXX_FLAGS_RELEASE ?= "-DNDEBUG"
|
|
OECMAKE_C_LINK_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CPPFLAGS} ${LDFLAGS}"
|
|
OECMAKE_CXX_LINK_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS} ${LDFLAGS}"
|
|
CXXFLAGS += "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
|
|
CFLAGS += "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
|
|
|
|
OECMAKE_C_COMPILER_LAUNCHER ?= ""
|
|
OECMAKE_CXX_COMPILER_LAUNCHER ?= ""
|
|
|
|
OECMAKE_RPATH ?= ""
|
|
OECMAKE_PERLNATIVE_DIR ??= ""
|
|
OECMAKE_EXTRA_ROOT_PATH ?= ""
|
|
|
|
OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "ONLY"
|
|
OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM_class-native = "BOTH"
|
|
|
|
EXTRA_OECMAKE_append = " ${PACKAGECONFIG_CONFARGS}"
|
|
|
|
EXTRA_OECMAKE_BUILD_prepend_task-compile = "${PARALLEL_MAKE} "
|
|
EXTRA_OECMAKE_BUILD_prepend_task-install = "${PARALLEL_MAKEINST} "
|
|
|
|
OECMAKE_TARGET_COMPILE ?= "all"
|
|
OECMAKE_TARGET_INSTALL ?= "install"
|
|
|
|
# CMake expects target architectures in the format of uname(2),
|
|
# which do not always match TARGET_ARCH, so all the necessary
|
|
# conversions should happen here.
|
|
def map_target_arch_to_uname_arch(target_arch):
|
|
if target_arch == "powerpc":
|
|
return "ppc"
|
|
if target_arch == "powerpc64":
|
|
return "ppc64"
|
|
return target_arch
|
|
|
|
cmake_do_generate_toolchain_file() {
|
|
if [ "${BUILD_SYS}" = "${HOST_SYS}" ]; then
|
|
cmake_crosscompiling="set( CMAKE_CROSSCOMPILING FALSE )"
|
|
fi
|
|
cat > ${WORKDIR}/toolchain.cmake <<EOF
|
|
# CMake system name must be something like "Linux".
|
|
# This is important for cross-compiling.
|
|
$cmake_crosscompiling
|
|
set( CMAKE_SYSTEM_NAME `echo ${TARGET_OS} | sed -e 's/^./\u&/' -e 's/^\(Linux\).*/\1/'` )
|
|
set( CMAKE_SYSTEM_PROCESSOR ${@map_target_arch_to_uname_arch(d.getVar('TARGET_ARCH'))} )
|
|
set( CMAKE_C_COMPILER ${OECMAKE_C_COMPILER} )
|
|
set( CMAKE_CXX_COMPILER ${OECMAKE_CXX_COMPILER} )
|
|
set( CMAKE_C_COMPILER_LAUNCHER ${OECMAKE_C_COMPILER_LAUNCHER} )
|
|
set( CMAKE_CXX_COMPILER_LAUNCHER ${OECMAKE_CXX_COMPILER_LAUNCHER} )
|
|
set( CMAKE_ASM_COMPILER ${OECMAKE_C_COMPILER} )
|
|
set( CMAKE_AR ${OECMAKE_AR} CACHE FILEPATH "Archiver" )
|
|
set( CMAKE_C_FLAGS "${OECMAKE_C_FLAGS}" CACHE STRING "CFLAGS" )
|
|
set( CMAKE_CXX_FLAGS "${OECMAKE_CXX_FLAGS}" CACHE STRING "CXXFLAGS" )
|
|
set( CMAKE_ASM_FLAGS "${OECMAKE_C_FLAGS}" CACHE STRING "ASM FLAGS" )
|
|
set( CMAKE_C_FLAGS_RELEASE "${OECMAKE_C_FLAGS_RELEASE}" CACHE STRING "Additional CFLAGS for release" )
|
|
set( CMAKE_CXX_FLAGS_RELEASE "${OECMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "Additional CXXFLAGS for release" )
|
|
set( CMAKE_ASM_FLAGS_RELEASE "${OECMAKE_C_FLAGS_RELEASE}" CACHE STRING "Additional ASM FLAGS for release" )
|
|
set( CMAKE_C_LINK_FLAGS "${OECMAKE_C_LINK_FLAGS}" CACHE STRING "LDFLAGS" )
|
|
set( CMAKE_CXX_LINK_FLAGS "${OECMAKE_CXX_LINK_FLAGS}" CACHE STRING "LDFLAGS" )
|
|
|
|
# only search in the paths provided so cmake doesnt pick
|
|
# up libraries and tools from the native build machine
|
|
set( CMAKE_FIND_ROOT_PATH ${STAGING_DIR_HOST} ${STAGING_DIR_NATIVE} ${CROSS_DIR} ${OECMAKE_PERLNATIVE_DIR} ${OECMAKE_EXTRA_ROOT_PATH} ${EXTERNAL_TOOLCHAIN} ${HOSTTOOLS_DIR})
|
|
set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
|
|
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ${OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM} )
|
|
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
|
|
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
|
|
set( CMAKE_PROGRAM_PATH "/" )
|
|
|
|
# Use qt.conf settings
|
|
set( ENV{QT_CONF_PATH} ${WORKDIR}/qt.conf )
|
|
|
|
# We need to set the rpath to the correct directory as cmake does not provide any
|
|
# directory as rpath by default
|
|
set( CMAKE_INSTALL_RPATH ${OECMAKE_RPATH} )
|
|
|
|
# Use RPATHs relative to build directory for reproducibility
|
|
set( CMAKE_BUILD_RPATH_USE_ORIGIN ON )
|
|
|
|
# Use our cmake modules
|
|
list(APPEND CMAKE_MODULE_PATH "${STAGING_DATADIR}/cmake/Modules/")
|
|
|
|
# add for non /usr/lib libdir, e.g. /usr/lib64
|
|
set( CMAKE_LIBRARY_PATH ${libdir} ${base_libdir})
|
|
|
|
# add include dir to implicit includes in case it differs from /usr/include
|
|
list(APPEND CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES ${includedir})
|
|
list(APPEND CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES ${includedir})
|
|
|
|
EOF
|
|
}
|
|
|
|
addtask generate_toolchain_file after do_patch before do_configure
|
|
|
|
CONFIGURE_FILES = "CMakeLists.txt"
|
|
|
|
cmake_do_configure() {
|
|
if [ "${OECMAKE_BUILDPATH}" ]; then
|
|
bbnote "cmake.bbclass no longer uses OECMAKE_BUILDPATH. The default behaviour is now out-of-tree builds with B=WORKDIR/build."
|
|
fi
|
|
|
|
if [ "${S}" != "${B}" ]; then
|
|
rm -rf ${B}
|
|
mkdir -p ${B}
|
|
cd ${B}
|
|
else
|
|
find ${B} -name CMakeFiles -or -name Makefile -or -name cmake_install.cmake -or -name CMakeCache.txt -delete
|
|
fi
|
|
|
|
# Just like autotools cmake can use a site file to cache result that need generated binaries to run
|
|
if [ -e ${WORKDIR}/site-file.cmake ] ; then
|
|
oecmake_sitefile="-C ${WORKDIR}/site-file.cmake"
|
|
else
|
|
oecmake_sitefile=
|
|
fi
|
|
|
|
cmake \
|
|
${OECMAKE_GENERATOR_ARGS} \
|
|
$oecmake_sitefile \
|
|
${OECMAKE_SOURCEPATH} \
|
|
-DCMAKE_INSTALL_PREFIX:PATH=${prefix} \
|
|
-DCMAKE_INSTALL_BINDIR:PATH=${@os.path.relpath(d.getVar('bindir'), d.getVar('prefix') + '/')} \
|
|
-DCMAKE_INSTALL_SBINDIR:PATH=${@os.path.relpath(d.getVar('sbindir'), d.getVar('prefix') + '/')} \
|
|
-DCMAKE_INSTALL_LIBEXECDIR:PATH=${@os.path.relpath(d.getVar('libexecdir'), d.getVar('prefix') + '/')} \
|
|
-DCMAKE_INSTALL_SYSCONFDIR:PATH=${sysconfdir} \
|
|
-DCMAKE_INSTALL_SHAREDSTATEDIR:PATH=${@os.path.relpath(d.getVar('sharedstatedir'), d. getVar('prefix') + '/')} \
|
|
-DCMAKE_INSTALL_LOCALSTATEDIR:PATH=${localstatedir} \
|
|
-DCMAKE_INSTALL_LIBDIR:PATH=${@os.path.relpath(d.getVar('libdir'), d.getVar('prefix') + '/')} \
|
|
-DCMAKE_INSTALL_INCLUDEDIR:PATH=${@os.path.relpath(d.getVar('includedir'), d.getVar('prefix') + '/')} \
|
|
-DCMAKE_INSTALL_DATAROOTDIR:PATH=${@os.path.relpath(d.getVar('datadir'), d.getVar('prefix') + '/')} \
|
|
-DCMAKE_INSTALL_SO_NO_EXE=0 \
|
|
-DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain.cmake \
|
|
-DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 \
|
|
${EXTRA_OECMAKE} \
|
|
-Wno-dev
|
|
}
|
|
|
|
# To disable verbose cmake logs for a given recipe or globally config metadata e.g. local.conf
|
|
# add following
|
|
#
|
|
# CMAKE_VERBOSE = ""
|
|
#
|
|
|
|
CMAKE_VERBOSE ??= "VERBOSE=1"
|
|
|
|
# Then run do_compile again
|
|
cmake_runcmake_build() {
|
|
bbnote ${DESTDIR:+DESTDIR=${DESTDIR} }${CMAKE_VERBOSE} cmake --build '${B}' "$@" -- ${EXTRA_OECMAKE_BUILD}
|
|
eval ${DESTDIR:+DESTDIR=${DESTDIR} }${CMAKE_VERBOSE} cmake --build '${B}' "$@" -- ${EXTRA_OECMAKE_BUILD}
|
|
}
|
|
|
|
cmake_do_compile() {
|
|
cmake_runcmake_build --target ${OECMAKE_TARGET_COMPILE}
|
|
}
|
|
|
|
cmake_do_install() {
|
|
DESTDIR='${D}' cmake_runcmake_build --target ${OECMAKE_TARGET_INSTALL}
|
|
}
|
|
|
|
EXPORT_FUNCTIONS do_configure do_compile do_install do_generate_toolchain_file
|