1################################################################################ 2# CMake package infrastructure 3# 4# This file implements an infrastructure that eases development of 5# package .mk files for CMake packages. It should be used for all 6# packages that use CMake as their build system. 7# 8# See the Buildroot documentation for details on the usage of this 9# infrastructure 10# 11# In terms of implementation, this CMake infrastructure requires 12# the .mk file to only specify metadata information about the 13# package: name, version, download URL, etc. 14# 15# We still allow the package .mk file to override what the different 16# steps are doing, if needed. For example, if <PKG>_BUILD_CMDS is 17# already defined, it is used as the list of commands to perform to 18# build the package, instead of the default CMake behaviour. The 19# package can also define some post operation hooks. 20# 21################################################################################ 22 23# Set compiler variables. 24ifeq ($(BR2_CCACHE),y) 25CMAKE_HOST_C_COMPILER = $(HOSTCC_NOCCACHE) 26CMAKE_HOST_CXX_COMPILER = $(HOSTCXX_NOCCACHE) 27CMAKE_HOST_C_COMPILER_LAUNCHER = $(HOST_DIR)/bin/ccache 28CMAKE_HOST_CXX_COMPILER_LAUNCHER = $(HOST_DIR)/bin/ccache 29else 30CMAKE_HOST_C_COMPILER = $(HOSTCC) 31CMAKE_HOST_CXX_COMPILER = $(HOSTCXX) 32endif 33 34ifneq ($(QUIET),) 35CMAKE_QUIET = -DCMAKE_RULE_MESSAGES=OFF -DCMAKE_INSTALL_MESSAGE=NEVER 36endif 37 38################################################################################ 39# inner-cmake-package -- defines how the configuration, compilation and 40# installation of a CMake package should be done, implements a few hooks to 41# tune the build process and calls the generic package infrastructure to 42# generate the necessary make targets 43# 44# argument 1 is the lowercase package name 45# argument 2 is the uppercase package name, including a HOST_ prefix 46# for host packages 47# argument 3 is the uppercase package name, without the HOST_ prefix 48# for host packages 49# argument 4 is the type (target or host) 50################################################################################ 51 52define inner-cmake-package 53 54$(2)_MAKE ?= $$(MAKE) 55$(2)_INSTALL_OPTS ?= install 56$(2)_INSTALL_STAGING_OPTS ?= DESTDIR=$$(STAGING_DIR) install/fast 57$(2)_INSTALL_TARGET_OPTS ?= DESTDIR=$$(TARGET_DIR) install/fast 58 59$(3)_SUPPORTS_IN_SOURCE_BUILD ?= YES 60 61 62ifeq ($$($(3)_SUPPORTS_IN_SOURCE_BUILD),YES) 63$(2)_BUILDDIR = $$($(2)_SRCDIR) 64else 65$(2)_BUILDDIR = $$($(2)_SRCDIR)/buildroot-build 66endif 67 68# 69# Configure step. Only define it if not already defined by the package 70# .mk file. And take care of the differences between host and target 71# packages. 72# 73ifndef $(2)_CONFIGURE_CMDS 74ifeq ($(4),target) 75 76ifneq ($(BR2_TOOLCHAIN_PREFER_CLANG):$$($(2)_USE_CLANG),:) 77ifeq ($$($(2)_DISALLOW_CLANG),) 78$(2)_DEPENDENCIES += host-clang host-lld host-llvm 79 80$(2)_CC ?= bin/clang 81$(2)_CXX ?= bin/clang++ 82$(2)_AR ?= bin/llvm-ar 83$(2)_AS ?= bin/llvm-as 84$(2)_LD ?= bin/llvm-link 85$(2)_NM ?= bin/llvm-nm 86$(2)_RANLIB ?= bin/llvm-ranlib 87$(2)_READELF ?= bin/llvm-readelf 88$(2)_STRIP ?= bin/llvm-strip 89$(2)_OBJCOPY ?= bin/llvm-objcopy 90$(2)_OBJDUMP ?= bin/llvm-objdump 91endif 92endif 93 94$(2)_CC ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CC))) 95$(2)_CXX ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CXX))) 96$(2)_AR ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_AR))) 97$(2)_AS ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_AS))) 98$(2)_LD ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_LD))) 99$(2)_NM ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_NM))) 100$(2)_RANLIB ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_RANLIB))) 101$(2)_READELF ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_READELF))) 102$(2)_STRIP ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_STRIP))) 103$(2)_OBJCOPY ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_OBJCOPY))) 104$(2)_OBJDUMP ?= $(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_OBJDUMP))) 105 106# Configure package for target 107# 108# - We are passing BUILD_SHARED_LIBS because it is documented as a 109# standard CMake variable to control the build of shared libraries 110# (see https://cmake.org/cmake/help/v3.8/manual/cmake-variables.7.html#variables-that-change-behavior) 111# - We are not passing BUILD_STATIC_LIBS because it is *not* 112# documented as a standard CMake variable. If a package supports it, 113# it must handle it explicitly. 114# 115define $(2)_CONFIGURE_CMDS 116 (mkdir -p $$($$(PKG)_BUILDDIR) && \ 117 cd $$($$(PKG)_BUILDDIR) && \ 118 rm -f CMakeCache.txt && \ 119 sed \ 120 -e 's#@@STAGING_SUBDIR@@#$(call qstrip,$(STAGING_SUBDIR))#' \ 121 -e 's#@@RELOCATED_HOST_DIR@@#$(call qstrip,$(HOST_DIR)/share/buildroot/)#' \ 122 -e 's#@@TARGET_CFLAGS@@#$(call qstrip,$(TARGET_CFLAGS))#' \ 123 -e 's#@@TARGET_CXXFLAGS@@#$(call qstrip,$(TARGET_CXXFLAGS))#' \ 124 -e 's#@@TARGET_FCFLAGS@@#$(call qstrip,$(TARGET_FCFLAGS))#' \ 125 -e 's#@@TARGET_LDFLAGS@@#$(call qstrip,$(TARGET_LDFLAGS))#' \ 126 -e 's#@@TARGET_CC@@#$$($(2)_CC)#' \ 127 -e 's#@@TARGET_CXX@@#$$($(2)_CXX)#' \ 128 -e 's#@@TARGET_AR@@#$$($(2)_AR)#' \ 129 -e 's#@@TARGET_AS@@#$$($(2)_AS)#' \ 130 -e 's#@@TARGET_LD@@#$$($(2)_LD)#' \ 131 -e 's#@@TARGET_NM@@#$$($(2)_NM)#' \ 132 -e 's#@@TARGET_RANLIB@@#$$($(2)_RANLIB)#' \ 133 -e 's#@@TARGET_READELF@@#$$($(2)_READELF)#' \ 134 -e 's#@@TARGET_STRIP@@#$$($(2)_STRIP)#' \ 135 -e 's#@@TARGET_OBJCOPY@@#$$($(2)_OBJCOPY)#' \ 136 -e 's#@@TARGET_OBJDUMP@@#$$($(2)_OBJDUMP)#' \ 137 -e 's#@@TARGET_FC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_FC)))#' \ 138 -e 's#@@CMAKE_SYSTEM_PROCESSOR@@#$(call qstrip,$(CMAKE_SYSTEM_PROCESSOR))#' \ 139 -e 's#@@TOOLCHAIN_HAS_CXX@@#$(if $(BR2_INSTALL_LIBSTDCPP),1,0)#' \ 140 -e 's#@@TOOLCHAIN_HAS_FORTRAN@@#$(if $(BR2_TOOLCHAIN_HAS_FORTRAN),1,0)#' \ 141 -e 's#@@CMAKE_BUILD_TYPE@@#$(if $(BR2_ENABLE_RUNTIME_DEBUG),Debug,Release)#' \ 142 $(TOPDIR)/support/misc/toolchainfile.cmake.in \ 143 > $$($$(PKG)_BUILDDIR)/toolchainfile.cmake && \ 144 PATH=$$(BR_PATH) \ 145 $$($$(PKG)_CONF_ENV) $$(BR2_CMAKE) $$($$(PKG)_SRCDIR) \ 146 -G"Unix Makefiles" \ 147 -DCMAKE_TOOLCHAIN_FILE="$$($$(PKG)_BUILDDIR)/toolchainfile.cmake" \ 148 -DCMAKE_INSTALL_PREFIX="/usr" \ 149 -DCMAKE_INSTALL_RUNSTATEDIR="/run" \ 150 -DCMAKE_COLOR_MAKEFILE=OFF \ 151 -DBUILD_DOC=OFF \ 152 -DBUILD_DOCS=OFF \ 153 -DBUILD_EXAMPLE=OFF \ 154 -DBUILD_EXAMPLES=OFF \ 155 -DBUILD_TEST=OFF \ 156 -DBUILD_TESTS=OFF \ 157 -DBUILD_TESTING=OFF \ 158 -DBUILD_SHARED_LIBS=$$(if $$(BR2_STATIC_LIBS),OFF,ON) \ 159 $$(CMAKE_QUIET) \ 160 $$($$(PKG)_CONF_OPTS) \ 161 ) 162endef 163else 164 165# Configure package for host 166define $(2)_CONFIGURE_CMDS 167 (mkdir -p $$($$(PKG)_BUILDDIR) && \ 168 cd $$($$(PKG)_BUILDDIR) && \ 169 rm -f CMakeCache.txt && \ 170 PATH=$$(BR_PATH) \ 171 PKG_CONFIG="$$(PKG_CONFIG_HOST_BINARY)" \ 172 PKG_CONFIG_SYSROOT_DIR="/" \ 173 PKG_CONFIG_LIBDIR="$$(HOST_DIR)/lib/pkgconfig:$$(HOST_DIR)/share/pkgconfig" \ 174 PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 \ 175 PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 \ 176 $$($$(PKG)_CONF_ENV) $$(BR2_CMAKE) $$($$(PKG)_SRCDIR) \ 177 -G"Unix Makefiles" \ 178 -DCMAKE_INSTALL_SO_NO_EXE=0 \ 179 -DCMAKE_FIND_ROOT_PATH="$$(HOST_DIR)" \ 180 -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="BOTH" \ 181 -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY="BOTH" \ 182 -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE="BOTH" \ 183 -DCMAKE_INSTALL_PREFIX="$$(HOST_DIR)" \ 184 -DCMAKE_C_FLAGS="$$(HOST_CFLAGS)" \ 185 -DCMAKE_CXX_FLAGS="$$(HOST_CXXFLAGS)" \ 186 -DCMAKE_EXE_LINKER_FLAGS="$$(HOST_LDFLAGS)" \ 187 -DCMAKE_SHARED_LINKER_FLAGS="$$(HOST_LDFLAGS)" \ 188 -DCMAKE_ASM_COMPILER="$$(HOSTAS)" \ 189 -DCMAKE_C_COMPILER="$$(CMAKE_HOST_C_COMPILER)" \ 190 -DCMAKE_CXX_COMPILER="$$(CMAKE_HOST_CXX_COMPILER)" \ 191 $(if $$(CMAKE_HOST_C_COMPILER_LAUNCHER),\ 192 -DCMAKE_C_COMPILER_LAUNCHER="$$(CMAKE_HOST_C_COMPILER_LAUNCHER)" \ 193 -DCMAKE_CXX_COMPILER_LAUNCHER="$$(CMAKE_HOST_CXX_COMPILER_LAUNCHER)" \ 194 ) \ 195 -DCMAKE_COLOR_MAKEFILE=OFF \ 196 -DBUILD_DOC=OFF \ 197 -DBUILD_DOCS=OFF \ 198 -DBUILD_EXAMPLE=OFF \ 199 -DBUILD_EXAMPLES=OFF \ 200 -DBUILD_TEST=OFF \ 201 -DBUILD_TESTS=OFF \ 202 -DBUILD_TESTING=OFF \ 203 -DBUILD_SHARED_LIBS=ON \ 204 $$(CMAKE_QUIET) \ 205 $$($$(PKG)_CONF_OPTS) \ 206 ) 207endef 208endif 209endif 210 211# Since some CMake modules (even upstream ones) use pgk_check_modules 212# primitives to find {C,LD}FLAGS, add it to the dependency list. 213$(2)_DEPENDENCIES += host-pkgconf 214 215$(2)_DEPENDENCIES += $(BR2_CMAKE_HOST_DEPENDENCY) 216 217# 218# Build step. Only define it if not already defined by the package .mk 219# file. 220# 221ifndef $(2)_BUILD_CMDS 222ifeq ($(4),target) 223define $(2)_BUILD_CMDS 224 $$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) -C $$($$(PKG)_BUILDDIR) 225endef 226else 227define $(2)_BUILD_CMDS 228 $$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) -C $$($$(PKG)_BUILDDIR) 229endef 230endif 231endif 232 233# 234# Host installation step. Only define it if not already defined by the 235# package .mk file. 236# 237ifndef $(2)_INSTALL_CMDS 238define $(2)_INSTALL_CMDS 239 $$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) $$($$(PKG)_INSTALL_OPTS) -C $$($$(PKG)_BUILDDIR) 240endef 241endif 242 243# 244# Staging installation step. Only define it if not already defined by 245# the package .mk file. 246# 247ifndef $(2)_INSTALL_STAGING_CMDS 248define $(2)_INSTALL_STAGING_CMDS 249 $$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) $$($$(PKG)_INSTALL_STAGING_OPTS) -C $$($$(PKG)_BUILDDIR) 250endef 251endif 252 253# 254# Target installation step. Only define it if not already defined by 255# the package .mk file. 256# 257ifndef $(2)_INSTALL_TARGET_CMDS 258define $(2)_INSTALL_TARGET_CMDS 259 $$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) $$($$(PKG)_INSTALL_TARGET_OPTS) -C $$($$(PKG)_BUILDDIR) 260endef 261endif 262 263# Call the generic package infrastructure to generate the necessary 264# make targets 265$(call inner-generic-package,$(1),$(2),$(3),$(4)) 266 267endef 268 269################################################################################ 270# cmake-package -- the target generator macro for CMake packages 271################################################################################ 272 273cmake-package = $(call inner-cmake-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target) 274host-cmake-package = $(call inner-cmake-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host) 275 276################################################################################ 277# Generation of the CMake toolchain file 278################################################################################ 279 280# CMAKE_SYSTEM_PROCESSOR should match uname -m 281ifeq ($(BR2_ARM_CPU_ARMV4),y) 282CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv4 283else ifeq ($(BR2_ARM_CPU_ARMV5),y) 284CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv5 285else ifeq ($(BR2_ARM_CPU_ARMV6),y) 286CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv6 287else ifeq ($(BR2_ARM_CPU_ARMV7A),y) 288CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv7 289else ifeq ($(BR2_ARM_CPU_ARMV8A),y) 290CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv8 291endif 292 293ifeq ($(BR2_arm),y) 294CMAKE_SYSTEM_PROCESSOR = $(CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT)l 295else ifeq ($(BR2_armeb),y) 296CMAKE_SYSTEM_PROCESSOR = $(CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT)b 297else ifeq ($(call qstrip,$(BR2_ARCH)),powerpc64) 298CMAKE_SYSTEM_PROCESSOR = ppc64 299else ifeq ($(call qstrip,$(BR2_ARCH)),powerpc64le) 300CMAKE_SYSTEM_PROCESSOR = ppc64le 301else 302CMAKE_SYSTEM_PROCESSOR = $(BR2_ARCH) 303endif 304 305# In order to allow the toolchain to be relocated, we calculate the HOST_DIR 306# based on the toolchainfile.cmake file's location: $(HOST_DIR)/share/buildroot 307# In all the other variables, HOST_DIR will be replaced by RELOCATED_HOST_DIR, 308# so we have to strip "$(HOST_DIR)/" from the paths that contain it. 309define TOOLCHAIN_CMAKE_INSTALL_FILES 310 @mkdir -p $(HOST_DIR)/share/buildroot 311 sed \ 312 -e 's#@@STAGING_SUBDIR@@#$(call qstrip,$(STAGING_SUBDIR))#' \ 313 -e 's#@@RELOCATED_HOST_DIR@@#$${CMAKE_CURRENT_LIST_DIR}#' \ 314 -e 's#@@TARGET_CFLAGS@@#$(call qstrip,$(TARGET_CFLAGS))#' \ 315 -e 's#@@TARGET_CXXFLAGS@@#$(call qstrip,$(TARGET_CXXFLAGS))#' \ 316 -e 's#@@TARGET_FCFLAGS@@#$(call qstrip,$(TARGET_FCFLAGS))#' \ 317 -e 's#@@TARGET_LDFLAGS@@#$(call qstrip,$(TARGET_LDFLAGS))#' \ 318 -e 's#@@TARGET_CC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CC)))#' \ 319 -e 's#@@TARGET_CXX@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CXX)))#' \ 320 -e 's#@@TARGET_CC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CC)))#' \ 321 -e 's#@@TARGET_CXX@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CXX)))#' \ 322 -e 's#@@TARGET_AR@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_AR)))#' \ 323 -e 's#@@TARGET_AS@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_AS)))#' \ 324 -e 's#@@TARGET_LD@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_LD)))#' \ 325 -e 's#@@TARGET_NM@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_NM)))#' \ 326 -e 's#@@TARGET_RANLIB@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_RANLIB)))#' \ 327 -e 's#@@TARGET_READELF@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_READELF)))#' \ 328 -e 's#@@TARGET_STRIP@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_STRIP)))#' \ 329 -e 's#@@TARGET_OBJCOPY@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_OBJCOPY)))#' \ 330 -e 's#@@TARGET_OBJDUMP@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_OBJDUMP)))#' \ 331 -e 's#@@TARGET_FC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_FC)))#' \ 332 -e 's#@@CMAKE_SYSTEM_PROCESSOR@@#$(call qstrip,$(CMAKE_SYSTEM_PROCESSOR))#' \ 333 -e 's#@@TOOLCHAIN_HAS_CXX@@#$(if $(BR2_INSTALL_LIBSTDCPP),1,0)#' \ 334 -e 's#@@TOOLCHAIN_HAS_FORTRAN@@#$(if $(BR2_TOOLCHAIN_HAS_FORTRAN),1,0)#' \ 335 -e 's#@@CMAKE_BUILD_TYPE@@#$(if $(BR2_ENABLE_RUNTIME_DEBUG),Debug,Release)#' \ 336 $(TOPDIR)/support/misc/toolchainfile.cmake.in \ 337 > $(HOST_DIR)/share/buildroot/toolchainfile.cmake 338 $(Q)$(INSTALL) -D -m 0644 support/misc/Buildroot.cmake \ 339 $(HOST_DIR)/share/buildroot/Platform/Buildroot.cmake 340endef 341 342TOOLCHAIN_POST_INSTALL_STAGING_HOOKS += TOOLCHAIN_CMAKE_INSTALL_FILES 343