486253db30
This also requires moving a few include directives below the "all:" target in the main Makefile, otherwise the new target to create the toolchain file in pkg-cmaketargets.mk gets used as the default make target instead of "all:". Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
222 lines
7.3 KiB
Makefile
222 lines
7.3 KiB
Makefile
################################################################################
|
|
# CMake package infrastructure
|
|
#
|
|
# This file implements an infrastructure that eases development of
|
|
# package .mk files for CMake packages. It should be used for all
|
|
# packages that use CMake as their build system.
|
|
#
|
|
# See the Buildroot documentation for details on the usage of this
|
|
# infrastructure
|
|
#
|
|
# In terms of implementation, this CMake infrastructure requires
|
|
# the .mk file to only specify metadata informations about the
|
|
# package: name, version, download URL, etc.
|
|
#
|
|
# We still allow the package .mk file to override what the different
|
|
# steps are doing, if needed. For example, if <PKG>_BUILD_CMDS is
|
|
# already defined, it is used as the list of commands to perform to
|
|
# build the package, instead of the default CMake behaviour. The
|
|
# package can also define some post operation hooks.
|
|
#
|
|
################################################################################
|
|
|
|
################################################################################
|
|
# CMAKETARGETS_INNER -- defines how the configuration, compilation and
|
|
# installation of a CMake package should be done, implements a few hooks to
|
|
# tune the build process and calls the generic package infrastructure to
|
|
# generate the necessary make targets
|
|
#
|
|
# argument 1 is the lowercase package name
|
|
# argument 2 is the uppercase package name, including an HOST_ prefix
|
|
# for host packages
|
|
# argument 3 is the uppercase package name, without the HOST_ prefix
|
|
# for host packages
|
|
# argument 4 is the package directory prefix
|
|
# argument 5 is the type (target or host)
|
|
################################################################################
|
|
|
|
define CMAKETARGETS_INNER
|
|
|
|
# define package-specific variables to default values
|
|
ifndef $(2)_SUBDIR
|
|
ifdef $(3)_SUBDIR
|
|
$(2)_SUBDIR = $($(3)_SUBDIR)
|
|
else
|
|
$(2)_SUBDIR ?=
|
|
endif
|
|
endif
|
|
|
|
$(2)_CONF_ENV ?=
|
|
$(2)_CONF_OPT ?=
|
|
$(2)_MAKE ?= $(MAKE)
|
|
$(2)_MAKE_ENV ?=
|
|
$(2)_MAKE_OPT ?=
|
|
$(2)_INSTALL_HOST_OPT ?= install
|
|
$(2)_INSTALL_STAGING_OPT ?= DESTDIR=$$(STAGING_DIR) install
|
|
$(2)_INSTALL_TARGET_OPT ?= DESTDIR=$$(TARGET_DIR) install
|
|
$(2)_CLEAN_OPT ?= clean
|
|
|
|
$(2)_SRCDIR = $$($(2)_DIR)/$($(2)_SUBDIR)
|
|
$(2)_BUILDDIR = $$($(2)_SRCDIR)
|
|
|
|
#
|
|
# Configure step. Only define it if not already defined by the package
|
|
# .mk file. And take care of the differences between host and target
|
|
# packages.
|
|
#
|
|
ifndef $(2)_CONFIGURE_CMDS
|
|
ifeq ($(5),target)
|
|
|
|
# Configure package for target
|
|
define $(2)_CONFIGURE_CMDS
|
|
(cd $$($$(PKG)_BUILDDIR) && \
|
|
rm -f CMakeCache.txt && \
|
|
$$($$(PKG)_CONF_ENV) $(HOST_DIR)/usr/bin/cmake $$($$(PKG)_SRCDIR) \
|
|
-DCMAKE_TOOLCHAIN_FILE="$$(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake" \
|
|
-DCMAKE_INSTALL_PREFIX="/usr" \
|
|
$$($$(PKG)_CONF_OPT) \
|
|
)
|
|
endef
|
|
else
|
|
|
|
# Configure package for host
|
|
define $(2)_CONFIGURE_CMDS
|
|
(cd $$($$(PKG)_BUILDDIR) && \
|
|
rm -f CMakeCache.txt && \
|
|
$(HOST_DIR)/usr/bin/cmake $$($$(PKG)_SRCDIR) \
|
|
-DCMAKE_INSTALL_SO_NO_EXE=0 \
|
|
-DCMAKE_FIND_ROOT_PATH="$$(HOST_DIR)" \
|
|
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="BOTH" \
|
|
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY="BOTH" \
|
|
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE="BOTH" \
|
|
-DCMAKE_INSTALL_PREFIX="$$(HOST_DIR)/usr" \
|
|
$$($$(PKG)_CONF_OPT) \
|
|
)
|
|
endef
|
|
endif
|
|
endif
|
|
|
|
# This must be repeated from GENTARGETS_INNER, otherwise we only get
|
|
# host-cmake in _DEPENDENCIES because of the following line
|
|
$(2)_DEPENDENCIES ?= $(patsubst host-host-%,host-%,$(addprefix host-,$($(3)_DEPENDENCIES)))
|
|
|
|
$(2)_DEPENDENCIES += host-cmake
|
|
|
|
#
|
|
# Build step. Only define it if not already defined by the package .mk
|
|
# file.
|
|
#
|
|
ifndef $(2)_BUILD_CMDS
|
|
ifeq ($(5),target)
|
|
define $(2)_BUILD_CMDS
|
|
$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPT) -C $$($$(PKG)_BUILDDIR)
|
|
endef
|
|
else
|
|
define $(2)_BUILD_CMDS
|
|
$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPT) -C $$($$(PKG)_BUILDDIR)
|
|
endef
|
|
endif
|
|
endif
|
|
|
|
#
|
|
# Host installation step. Only define it if not already defined by the
|
|
# package .mk file.
|
|
#
|
|
ifndef $(2)_INSTALL_CMDS
|
|
define $(2)_INSTALL_CMDS
|
|
$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPT) $$($$(PKG)_INSTALL_HOST_OPT) -C $$($$(PKG)_BUILDDIR)
|
|
endef
|
|
endif
|
|
|
|
#
|
|
# Staging installation step. Only define it if not already defined by
|
|
# the package .mk file.
|
|
#
|
|
ifndef $(2)_INSTALL_STAGING_CMDS
|
|
define $(2)_INSTALL_STAGING_CMDS
|
|
$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPT) $$($$(PKG)_INSTALL_STAGING_OPT) -C $$($$(PKG)_BUILDDIR)
|
|
endef
|
|
endif
|
|
|
|
#
|
|
# Target installation step. Only define it if not already defined by
|
|
# the package .mk file.
|
|
#
|
|
ifndef $(2)_INSTALL_TARGET_CMDS
|
|
define $(2)_INSTALL_TARGET_CMDS
|
|
$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPT) $$($$(PKG)_INSTALL_TARGET_OPT) -C $$($$(PKG)_BUILDDIR)
|
|
endef
|
|
endif
|
|
|
|
#
|
|
# Clean step. Only define it if not already defined by
|
|
# the package .mk file.
|
|
#
|
|
ifndef $(2)_CLEAN_CMDS
|
|
define $(2)_CLEAN_CMDS
|
|
-$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPT) $$($$(PKG)_CLEAN_OPT) -C $$($$(PKG)_BUILDDIR)
|
|
endef
|
|
endif
|
|
|
|
#
|
|
# Uninstall from staging step. Only define it if not already defined by
|
|
# the package .mk file.
|
|
#
|
|
ifndef $(2)_UNINSTALL_STAGING_CMDS
|
|
define $(2)_UNINSTALL_STAGING_CMDS
|
|
(cd $$($$(PKG)_BUILDDIR) && sed "s:\(.*\):$$(STAGING_DIR)\1:" install_manifest.txt | xargs rm -f)
|
|
endef
|
|
endif
|
|
|
|
#
|
|
# Uninstall from target step. Only define it if not already defined
|
|
# by the package .mk file.
|
|
#
|
|
ifndef $(2)_UNINSTALL_TARGET_CMDS
|
|
define $(2)_UNINSTALL_TARGET_CMDS
|
|
(cd $$($$(PKG)_BUILDDIR) && sed "s:\(.*\):$$(TARGET_DIR)\1:" install_manifest.txt | xargs rm -f)
|
|
endef
|
|
endif
|
|
|
|
# Call the generic package infrastructure to generate the necessary
|
|
# make targets
|
|
$(call GENTARGETS_INNER,$(1),$(2),$(3),$(4),$(5))
|
|
|
|
endef
|
|
|
|
################################################################################
|
|
# CMAKETARGETS -- the target generator macro for CMake packages
|
|
#
|
|
# Argument 1 is "target" or "host" [optional, default: "target"]
|
|
################################################################################
|
|
|
|
define CMAKETARGETS
|
|
ifeq ($(1),host)
|
|
$(call CMAKETARGETS_INNER,$(1)-$(call pkgname),$(call UPPERCASE,$(1)-$(call pkgname)),$(call UPPERCASE,$(call pkgname)),$(call pkgparentdir),host)
|
|
else
|
|
$(call CMAKETARGETS_INNER,$(call pkgname),$(call UPPERCASE,$(call pkgname)),$(call UPPERCASE,$(call pkgname)),$(call pkgparentdir),target)
|
|
endif
|
|
endef
|
|
|
|
################################################################################
|
|
# Generation of the CMake toolchain file
|
|
################################################################################
|
|
|
|
$(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake:
|
|
@mkdir -p $(@D)
|
|
@echo -en "\
|
|
set(CMAKE_SYSTEM_NAME Linux)\n\
|
|
set(CMAKE_C_COMPILER $(TARGET_CC_NOCCACHE))\n\
|
|
set(CMAKE_CXX_COMPILER $(TARGET_CXX_NOCCACHE))\n\
|
|
set(CMAKE_C_FLAGS \"\$${CMAKE_C_FLAGS} $(TARGET_CFLAGS)\" CACHE STRING \"Buildroot CFLAGS\" FORCE)\n\
|
|
set(CMAKE_CXX_FLAGS \"\$${CMAKE_CXX_FLAGS} $(TARGET_CXXFLAGS)\" CACHE STRING \"Buildroot CXXFLAGS\" FORCE)\n\
|
|
set(CMAKE_INSTALL_SO_NO_EXE 0)\n\
|
|
set(CMAKE_PROGRAM_PATH \"$(HOST_DIR)/usr/bin\")\n\
|
|
set(CMAKE_FIND_ROOT_PATH \"$(STAGING_DIR)\")\n\
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n\
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n\
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\n\
|
|
set(ENV{PKG_CONFIG_SYSROOT_DIR} \"$(STAGING_DIR)\")\n\
|
|
" > $@
|
|
|