buildroot/package/cmake/cmake.mk

97 lines
3.3 KiB
Makefile
Raw Normal View History

################################################################################
#
# cmake
#
################################################################################
support/dependencies: introduce BR2_HOST_CMAKE_AT_LEAST Some packages (e.g. libjxl) requires a quite recent cmake version, that is not yet available in most distributions, especially those LTS versions. Currently, when we bump the minimum cmake version we require, it gets bumped for all packages, regardless of their own minimum required version, which means that a given configuration will trigger the build of our host-cmake even if the packages that require it are not enabled and those that are would be content with the system-provided cmake. Since host-cmake can take quite some time to build, this can get a bit annoying to pay the price of a host-cmake build that would otherwise not be needed. Some packages even use an alternative build system when available since they requires a more recent version of cmake than the our minimum cmake version (wpewebkit use Ninja: 78d499409f71d8a22b0632c8ebc06f67ee6ae6dd). We introduce config options that packages can select to indicate what minimal cmake version they require, and use that version as the required minimal version required by the current configuration [0]. We would like to ensure that the currently selected minimum cmake version is indeed lower (or equal) to the cmake version we package, but that is not possible: dependencies.mk is parsed before we parse packages, so we do not yet know the cmake version we have, and we can't invert the parsing order as we need to know the required dependencies before we parse packages (so that we can build their dependency rules in Makefile). So we can only add comments in both places, that refer to the other location. [0] note that this is yet not optimal, as in such a case, host-cmake would be in the dependency chain of all cmake-based packages, even for those packages that do not require it. The optimum would be for each package to gain such a dependency on an as-needed basis, but this is by far more complex to achieve, and would only speed up cases where a single package is built from scratch (e.g. with: make clean; make foo), which is not worth optimising (yet?) Signed-off-by: Romain Naour <romain.naour@gmail.com> Cc: Julien Olivain <ju.o@free.fr> Cc: Arnout Vandecappelle <arnout@mind.be> Cc: Peter Korsgaard <peter@korsgaard.com> Cc: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2023-06-05 17:56:06 +08:00
# When updating the version, please also update BR2_HOST_CMAKE_AT_LEAST_X_Y
CMAKE_VERSION_MAJOR = 3.28
CMAKE_VERSION = $(CMAKE_VERSION_MAJOR).3
CMAKE_SITE = https://cmake.org/files/v$(CMAKE_VERSION_MAJOR)
CMAKE_LICENSE = BSD-3-Clause
CMAKE_LICENSE_FILES = Copyright.txt
CMAKE_CPE_ID_VALID = YES
# Tool download MITM attack warning if using npm package to install cmake
CMAKE_IGNORE_CVES = CVE-2016-10642
# CMake is a particular package:
# * CMake can be built using the generic infrastructure or the cmake one.
# Since Buildroot has no requirement regarding the host system cmake
# program presence, it uses the generic infrastructure to build the
# host-cmake package, then the (target-)cmake package can be built
# using the cmake infrastructure;
# * CMake bundles its dependencies within its sources. This is the
# reason why the host-cmake package has no dependencies:, whereas
# the (target-)cmake package has a lot of dependencies, using only
# the system-wide libraries instead of rebuilding and statically
# linking with the ones bundled into the CMake sources.
CMAKE_DEPENDENCIES = zlib jsoncpp libcurl libarchive expat bzip2 xz libuv rhash
CMAKE_CONF_OPTS = \
-DKWSYS_LFS_WORKS=TRUE \
-DKWSYS_CHAR_IS_SIGNED=TRUE \
-DCMAKE_USE_SYSTEM_LIBRARIES=1 \
-DCTEST_USE_XMLRPC=OFF \
-DCMake_ENABLE_DEBUGGER=0 \
-DBUILD_CursesDialog=OFF
cmake: don't use any header available in $(HOST_DIR)/usr/include The -I<dir> options added to CMAKE_C_FLAGS are passed to the compiler before the -I<dir> options of the cmake internal headers, so when the host-xz package was already built, a #include <lzma.h> directive loads the host-xz header instead of the cmake internal one. Because we don't want to use any header avaiable in -I$(HOST_DIR)/usr/include, just get rid of the -I<dir> options in the HOST_CFLAGS. Fix build failure: make host-xz host-cmake .../output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:17:1: error: conflicting types for ‘lzma_block_buffer_decode’ lzma_block_buffer_decode(lzma_block *block, lzma_allocator *allocator, ^ In file included from /home/tetsuya/buildroot/br2/output/host/usr/include/lzma.h:296:0, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/common.h:34, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_decoder.h:16, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:13: /home/tetsuya/buildroot/br2/output/host/usr/include/lzma/block.h:577:27: note: previous declaration of ‘lzma_block_buffer_decode’ was here extern LZMA_API(lzma_ret) lzma_block_buffer_decode( ^ Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/build.make:261: recipe for target 'Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o' failed make[3]: *** [Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o] Error 1 Fixes: http://autobuild.buildroot.org/results/4edf6e169dc4a00d8a8bd16a86eba2316cbbd9e5 http://autobuild.buildroot.org/results/a9ff38b22a36a2f8427d33085d3263a8cbfbd746 http://autobuild.buildroot.org/results/ecaa0227249207b5450519832a193c1585ac8177 [Thomas: - simplify the sed expression. Instead of trying to remove '-I <something>' from $(HOST_CFLAGS), simply remove $(HOST_CPPFLAGS) from $(HOST_CFLAGS). - add the same logic for HOST_CXXFLAGS.] Signed-off-by: Fabio Porcedda <fabio.porcedda@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Baruch Siach <baruch@tkos.co.il> Cc: Samuel Martin <s.martin49@gmail.com> Tested-by: Samuel Martin <s.martin49@gmail.com> Acked-by: Samuel Martin <s.martin49@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2015-03-07 16:27:55 +08:00
# Get rid of -I* options from $(HOST_CPPFLAGS) to prevent that a
# header available in $(HOST_DIR)/include is used instead of a
cmake: don't use any header available in $(HOST_DIR)/usr/include The -I<dir> options added to CMAKE_C_FLAGS are passed to the compiler before the -I<dir> options of the cmake internal headers, so when the host-xz package was already built, a #include <lzma.h> directive loads the host-xz header instead of the cmake internal one. Because we don't want to use any header avaiable in -I$(HOST_DIR)/usr/include, just get rid of the -I<dir> options in the HOST_CFLAGS. Fix build failure: make host-xz host-cmake .../output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:17:1: error: conflicting types for ‘lzma_block_buffer_decode’ lzma_block_buffer_decode(lzma_block *block, lzma_allocator *allocator, ^ In file included from /home/tetsuya/buildroot/br2/output/host/usr/include/lzma.h:296:0, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/common.h:34, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_decoder.h:16, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:13: /home/tetsuya/buildroot/br2/output/host/usr/include/lzma/block.h:577:27: note: previous declaration of ‘lzma_block_buffer_decode’ was here extern LZMA_API(lzma_ret) lzma_block_buffer_decode( ^ Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/build.make:261: recipe for target 'Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o' failed make[3]: *** [Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o] Error 1 Fixes: http://autobuild.buildroot.org/results/4edf6e169dc4a00d8a8bd16a86eba2316cbbd9e5 http://autobuild.buildroot.org/results/a9ff38b22a36a2f8427d33085d3263a8cbfbd746 http://autobuild.buildroot.org/results/ecaa0227249207b5450519832a193c1585ac8177 [Thomas: - simplify the sed expression. Instead of trying to remove '-I <something>' from $(HOST_CFLAGS), simply remove $(HOST_CPPFLAGS) from $(HOST_CFLAGS). - add the same logic for HOST_CXXFLAGS.] Signed-off-by: Fabio Porcedda <fabio.porcedda@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Baruch Siach <baruch@tkos.co.il> Cc: Samuel Martin <s.martin49@gmail.com> Tested-by: Samuel Martin <s.martin49@gmail.com> Acked-by: Samuel Martin <s.martin49@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2015-03-07 16:27:55 +08:00
# CMake internal header, e.g. lzma* headers of the xz package
HOST_CMAKE_CFLAGS = $(shell echo $(HOST_CFLAGS) | sed -r "s%$(HOST_CPPFLAGS)%%")
HOST_CMAKE_CXXFLAGS = $(shell echo $(HOST_CXXFLAGS) | sed -r "s%$(HOST_CPPFLAGS)%%")
# We may be a ccache dependency, so we can't use ccache
HOST_CMAKE_CONFIGURE_OPTS = \
$(HOST_CONFIGURE_OPTS) \
CC="$(HOSTCC_NOCCACHE)" \
GCC="$(HOSTCC_NOCCACHE)" \
CXX="$(HOSTCXX_NOCCACHE)"
define HOST_CMAKE_CONFIGURE_CMDS
(cd $(@D); \
$(HOST_CMAKE_CONFIGURE_OPTS) \
cmake: don't use any header available in $(HOST_DIR)/usr/include The -I<dir> options added to CMAKE_C_FLAGS are passed to the compiler before the -I<dir> options of the cmake internal headers, so when the host-xz package was already built, a #include <lzma.h> directive loads the host-xz header instead of the cmake internal one. Because we don't want to use any header avaiable in -I$(HOST_DIR)/usr/include, just get rid of the -I<dir> options in the HOST_CFLAGS. Fix build failure: make host-xz host-cmake .../output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:17:1: error: conflicting types for ‘lzma_block_buffer_decode’ lzma_block_buffer_decode(lzma_block *block, lzma_allocator *allocator, ^ In file included from /home/tetsuya/buildroot/br2/output/host/usr/include/lzma.h:296:0, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/common.h:34, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_decoder.h:16, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:13: /home/tetsuya/buildroot/br2/output/host/usr/include/lzma/block.h:577:27: note: previous declaration of ‘lzma_block_buffer_decode’ was here extern LZMA_API(lzma_ret) lzma_block_buffer_decode( ^ Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/build.make:261: recipe for target 'Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o' failed make[3]: *** [Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o] Error 1 Fixes: http://autobuild.buildroot.org/results/4edf6e169dc4a00d8a8bd16a86eba2316cbbd9e5 http://autobuild.buildroot.org/results/a9ff38b22a36a2f8427d33085d3263a8cbfbd746 http://autobuild.buildroot.org/results/ecaa0227249207b5450519832a193c1585ac8177 [Thomas: - simplify the sed expression. Instead of trying to remove '-I <something>' from $(HOST_CFLAGS), simply remove $(HOST_CPPFLAGS) from $(HOST_CFLAGS). - add the same logic for HOST_CXXFLAGS.] Signed-off-by: Fabio Porcedda <fabio.porcedda@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Baruch Siach <baruch@tkos.co.il> Cc: Samuel Martin <s.martin49@gmail.com> Tested-by: Samuel Martin <s.martin49@gmail.com> Acked-by: Samuel Martin <s.martin49@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2015-03-07 16:27:55 +08:00
CFLAGS="$(HOST_CMAKE_CFLAGS)" \
./bootstrap --prefix=$(HOST_DIR) \
--parallel=$(PARALLEL_JOBS) -- \
cmake: don't use any header available in $(HOST_DIR)/usr/include The -I<dir> options added to CMAKE_C_FLAGS are passed to the compiler before the -I<dir> options of the cmake internal headers, so when the host-xz package was already built, a #include <lzma.h> directive loads the host-xz header instead of the cmake internal one. Because we don't want to use any header avaiable in -I$(HOST_DIR)/usr/include, just get rid of the -I<dir> options in the HOST_CFLAGS. Fix build failure: make host-xz host-cmake .../output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:17:1: error: conflicting types for ‘lzma_block_buffer_decode’ lzma_block_buffer_decode(lzma_block *block, lzma_allocator *allocator, ^ In file included from /home/tetsuya/buildroot/br2/output/host/usr/include/lzma.h:296:0, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/common.h:34, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_decoder.h:16, from /home/tetsuya/buildroot/br2/output/build/host-cmake-3.1.3/Utilities/cmliblzma/liblzma/common/block_buffer_decoder.c:13: /home/tetsuya/buildroot/br2/output/host/usr/include/lzma/block.h:577:27: note: previous declaration of ‘lzma_block_buffer_decode’ was here extern LZMA_API(lzma_ret) lzma_block_buffer_decode( ^ Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/build.make:261: recipe for target 'Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o' failed make[3]: *** [Utilities/cmliblzma/CMakeFiles/cmliblzma.dir/liblzma/common/block_buffer_decoder.c.o] Error 1 Fixes: http://autobuild.buildroot.org/results/4edf6e169dc4a00d8a8bd16a86eba2316cbbd9e5 http://autobuild.buildroot.org/results/a9ff38b22a36a2f8427d33085d3263a8cbfbd746 http://autobuild.buildroot.org/results/ecaa0227249207b5450519832a193c1585ac8177 [Thomas: - simplify the sed expression. Instead of trying to remove '-I <something>' from $(HOST_CFLAGS), simply remove $(HOST_CPPFLAGS) from $(HOST_CFLAGS). - add the same logic for HOST_CXXFLAGS.] Signed-off-by: Fabio Porcedda <fabio.porcedda@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Baruch Siach <baruch@tkos.co.il> Cc: Samuel Martin <s.martin49@gmail.com> Tested-by: Samuel Martin <s.martin49@gmail.com> Acked-by: Samuel Martin <s.martin49@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2015-03-07 16:27:55 +08:00
-DCMAKE_C_FLAGS="$(HOST_CMAKE_CFLAGS)" \
-DCMAKE_CXX_FLAGS="$(HOST_CMAKE_CXXFLAGS)" \
-DCMAKE_EXE_LINKER_FLAGS="$(HOST_LDFLAGS)" \
-DCMAKE_USE_OPENSSL:BOOL=OFF \
-DBUILD_CursesDialog=OFF \
)
endef
define HOST_CMAKE_BUILD_CMDS
$(HOST_MAKE_ENV) $(MAKE) -C $(@D)
endef
define HOST_CMAKE_INSTALL_CMDS
$(HOST_MAKE_ENV) $(MAKE) -C $(@D) install/fast
endef
define CMAKE_REMOVE_EXTRA_DATA
rm $(TARGET_DIR)/usr/bin/{cmake,cpack}
rm -fr $(TARGET_DIR)/usr/share/cmake-$(CMAKE_VERSION_MAJOR)/{completions,editors}
rm -fr $(TARGET_DIR)/usr/share/cmake-$(CMAKE_VERSION_MAJOR)/{Help,include}
endef
define CMAKE_INSTALL_CTEST_CFG_FILE
$(INSTALL) -m 0644 -D $(@D)/Modules/CMake.cmake \
$(TARGET_DIR)/usr/share/cmake-$(CMAKE_VERSION_MAJOR)/Modules/CMake.cmake.ctest
endef
CMAKE_POST_INSTALL_TARGET_HOOKS += CMAKE_REMOVE_EXTRA_DATA
CMAKE_POST_INSTALL_TARGET_HOOKS += CMAKE_INSTALL_CTEST_CFG_FILE
define CMAKE_INSTALL_TARGET_CMDS
(cd $(@D); \
$(HOST_MAKE_ENV) DESTDIR=$(TARGET_DIR) \
cmake -P cmake_install.cmake \
)
endef
$(eval $(cmake-package))
$(eval $(host-generic-package))