lutok: move to Lua libraries menu
[buildroot-gz.git] / package / pkg-cmake.mk
blob77fa1dc74c26587ec6e0ca035d4cf9b281b02f22
1 ################################################################################
2 # CMake package infrastructure
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.
8 # See the Buildroot documentation for details on the usage of this
9 # infrastructure
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.
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.
21 ################################################################################
23 # Set compiler variables.
24 ifeq ($(BR2_CCACHE),y)
25 CMAKE_HOST_C_COMPILER = $(HOST_DIR)/usr/bin/ccache
26 CMAKE_HOST_CXX_COMPILER = $(HOST_DIR)/usr/bin/ccache
27 CMAKE_HOST_C_COMPILER_ARG1 = $(HOSTCC_NOCCACHE)
28 CMAKE_HOST_CXX_COMPILER_ARG1 = $(HOSTCXX_NOCCACHE)
29 else
30 CMAKE_HOST_C_COMPILER = $(HOSTCC)
31 CMAKE_HOST_CXX_COMPILER = $(HOSTCXX)
32 endif
34 ifneq ($(QUIET),)
35 CMAKE_QUIET = -DCMAKE_RULE_MESSAGES=OFF -DCMAKE_INSTALL_MESSAGE=NEVER
36 endif
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
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 ################################################################################
52 define inner-cmake-package
54 $(2)_CONF_ENV ?=
55 $(2)_CONF_OPTS ?=
56 $(2)_MAKE ?= $$(MAKE)
57 $(2)_MAKE_ENV ?=
58 $(2)_MAKE_OPTS ?=
59 $(2)_INSTALL_OPTS ?= install
60 $(2)_INSTALL_STAGING_OPTS ?= DESTDIR=$$(STAGING_DIR) install/fast
61 $(2)_INSTALL_TARGET_OPTS ?= DESTDIR=$$(TARGET_DIR) install/fast
63 $(2)_SRCDIR = $$($(2)_DIR)/$$($(2)_SUBDIR)
65 $(3)_SUPPORTS_IN_SOURCE_BUILD ?= YES
68 ifeq ($$($(3)_SUPPORTS_IN_SOURCE_BUILD),YES)
69 $(2)_BUILDDIR = $$($(2)_SRCDIR)
70 else
71 $(2)_BUILDDIR = $$($(2)_SRCDIR)/buildroot-build
72 endif
75 # Configure step. Only define it if not already defined by the package
76 # .mk file. And take care of the differences between host and target
77 # packages.
79 ifndef $(2)_CONFIGURE_CMDS
80 ifeq ($(4),target)
82 # Configure package for target
83 define $(2)_CONFIGURE_CMDS
84 (mkdir -p $$($$(PKG)_BUILDDIR) && \
85 cd $$($$(PKG)_BUILDDIR) && \
86 rm -f CMakeCache.txt && \
87 PATH=$$(BR_PATH) \
88 $$($$(PKG)_CONF_ENV) $$(BR2_CMAKE) $$($$(PKG)_SRCDIR) \
89 -DCMAKE_TOOLCHAIN_FILE="$$(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake" \
90 -DCMAKE_MODULE_PATH="$$(HOST_DIR)/usr/share/buildroot" \
91 -DCMAKE_INSTALL_PREFIX="/usr" \
92 -DCMAKE_COLOR_MAKEFILE=OFF \
93 -DBUILD_DOC=OFF \
94 -DBUILD_DOCS=OFF \
95 -DBUILD_EXAMPLE=OFF \
96 -DBUILD_EXAMPLES=OFF \
97 -DBUILD_TEST=OFF \
98 -DBUILD_TESTS=OFF \
99 -DBUILD_TESTING=OFF \
100 -DBUILD_SHARED_LIBS=$$(if $$(BR2_STATIC_LIBS),OFF,ON) \
101 $$(CMAKE_QUIET) \
102 $$($$(PKG)_CONF_OPTS) \
104 endef
105 else
107 # Configure package for host
108 define $(2)_CONFIGURE_CMDS
109 (mkdir -p $$($$(PKG)_BUILDDIR) && \
110 cd $$($$(PKG)_BUILDDIR) && \
111 rm -f CMakeCache.txt && \
112 PATH=$$(BR_PATH) \
113 $$($$(PKG)_CONF_ENV) $$(BR2_CMAKE) $$($$(PKG)_SRCDIR) \
114 -DCMAKE_INSTALL_SO_NO_EXE=0 \
115 -DCMAKE_FIND_ROOT_PATH="$$(HOST_DIR)" \
116 -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="BOTH" \
117 -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY="BOTH" \
118 -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE="BOTH" \
119 -DCMAKE_INSTALL_PREFIX="$$(HOST_DIR)/usr" \
120 -DCMAKE_C_FLAGS="$$(HOST_CFLAGS)" \
121 -DCMAKE_CXX_FLAGS="$$(HOST_CXXFLAGS)" \
122 -DCMAKE_EXE_LINKER_FLAGS="$$(HOST_LDFLAGS)" \
123 -DCMAKE_ASM_COMPILER="$$(HOSTAS)" \
124 -DCMAKE_C_COMPILER="$$(CMAKE_HOST_C_COMPILER)" \
125 -DCMAKE_CXX_COMPILER="$$(CMAKE_HOST_CXX_COMPILER)" \
126 $(if $$(CMAKE_HOST_C_COMPILER_ARG1),\
127 -DCMAKE_C_COMPILER_ARG1="$$(CMAKE_HOST_C_COMPILER_ARG1)" \
128 -DCMAKE_CXX_COMPILER_ARG1="$$(CMAKE_HOST_CXX_COMPILER_ARG1)" \
130 -DCMAKE_COLOR_MAKEFILE=OFF \
131 -DBUILD_DOC=OFF \
132 -DBUILD_DOCS=OFF \
133 -DBUILD_EXAMPLE=OFF \
134 -DBUILD_EXAMPLES=OFF \
135 -DBUILD_TEST=OFF \
136 -DBUILD_TESTS=OFF \
137 -DBUILD_TESTING=OFF \
138 $$(CMAKE_QUIET) \
139 $$($$(PKG)_CONF_OPTS) \
141 endef
142 endif
143 endif
145 # Since some CMake modules (even upstream ones) use pgk_check_modules
146 # primitives to find {C,LD}FLAGS, add it to the dependency list.
147 $(2)_DEPENDENCIES += host-pkgconf
149 $(2)_DEPENDENCIES += $(BR2_CMAKE_HOST_DEPENDENCY)
152 # Build step. Only define it if not already defined by the package .mk
153 # file.
155 ifndef $(2)_BUILD_CMDS
156 ifeq ($(4),target)
157 define $(2)_BUILD_CMDS
158 $$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) -C $$($$(PKG)_BUILDDIR)
159 endef
160 else
161 define $(2)_BUILD_CMDS
162 $$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) -C $$($$(PKG)_BUILDDIR)
163 endef
164 endif
165 endif
168 # Host installation step. Only define it if not already defined by the
169 # package .mk file.
171 ifndef $(2)_INSTALL_CMDS
172 define $(2)_INSTALL_CMDS
173 $$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) $$($$(PKG)_INSTALL_OPTS) -C $$($$(PKG)_BUILDDIR)
174 endef
175 endif
178 # Staging installation step. Only define it if not already defined by
179 # the package .mk file.
181 ifndef $(2)_INSTALL_STAGING_CMDS
182 define $(2)_INSTALL_STAGING_CMDS
183 $$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) $$($$(PKG)_INSTALL_STAGING_OPTS) -C $$($$(PKG)_BUILDDIR)
184 endef
185 endif
188 # Target installation step. Only define it if not already defined by
189 # the package .mk file.
191 ifndef $(2)_INSTALL_TARGET_CMDS
192 define $(2)_INSTALL_TARGET_CMDS
193 $$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) $$($$(PKG)_INSTALL_TARGET_OPTS) -C $$($$(PKG)_BUILDDIR)
194 endef
195 endif
197 # Call the generic package infrastructure to generate the necessary
198 # make targets
199 $(call inner-generic-package,$(1),$(2),$(3),$(4))
201 endef
203 ################################################################################
204 # cmake-package -- the target generator macro for CMake packages
205 ################################################################################
207 cmake-package = $(call inner-cmake-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
208 host-cmake-package = $(call inner-cmake-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host)
210 ################################################################################
211 # Generation of the CMake toolchain file
212 ################################################################################
214 # CMAKE_SYSTEM_PROCESSOR should match uname -m
215 ifeq ($(BR2_ARM_CPU_ARMV4),y)
216 CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv4
217 else ifeq ($(BR2_ARM_CPU_ARMV5),y)
218 CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv5
219 else ifeq ($(BR2_ARM_CPU_ARMV6),y)
220 CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv6
221 else ifeq ($(BR2_ARM_CPU_ARMV7A),y)
222 CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT = armv7
223 endif
225 ifeq ($(BR2_arm),y)
226 CMAKE_SYSTEM_PROCESSOR = $(CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT)l
227 else ifeq ($(BR2_armeb),y)
228 CMAKE_SYSTEM_PROCESSOR = $(CMAKE_SYSTEM_PROCESSOR_ARM_VARIANT)b
229 else
230 CMAKE_SYSTEM_PROCESSOR = $(BR2_ARCH)
231 endif
233 # In order to allow the toolchain to be relocated, we calculate the HOST_DIR
234 # based on the toolchainfile.cmake file's location: $(HOST_DIR)/usr/share/buildroot
235 # In all the other variables, HOST_DIR will be replaced by RELOCATED_HOST_DIR,
236 # so we have to strip "$(HOST_DIR)/" from the paths that contain it.
237 $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake:
238 @mkdir -p $(@D)
239 sed \
240 -e 's#@@STAGING_SUBDIR@@#$(call qstrip,$(STAGING_SUBDIR))#' \
241 -e 's#@@TARGET_CFLAGS@@#$(call qstrip,$(TARGET_CFLAGS))#' \
242 -e 's#@@TARGET_CXXFLAGS@@#$(call qstrip,$(TARGET_CXXFLAGS))#' \
243 -e 's#@@TARGET_FCFLAGS@@#$(call qstrip,$(TARGET_FCFLAGS))#' \
244 -e 's#@@TARGET_LDFLAGS@@#$(call qstrip,$(TARGET_LDFLAGS))#' \
245 -e 's#@@TARGET_CC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CC)))#' \
246 -e 's#@@TARGET_CXX@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_CXX)))#' \
247 -e 's#@@TARGET_FC@@#$(subst $(HOST_DIR)/,,$(call qstrip,$(TARGET_FC)))#' \
248 -e 's#@@CMAKE_SYSTEM_PROCESSOR@@#$(call qstrip,$(CMAKE_SYSTEM_PROCESSOR))#' \
249 -e 's#@@TOOLCHAIN_HAS_FORTRAN@@#$(if $(BR2_TOOLCHAIN_HAS_FORTRAN),1,0)#' \
250 -e 's#@@CMAKE_BUILD_TYPE@@#$(if $(BR2_ENABLE_DEBUG),Debug,Release)#' \
251 $(TOPDIR)/support/misc/toolchainfile.cmake.in \
252 > $@
254 $(HOST_DIR)/usr/share/buildroot/Platform/Buildroot.cmake:
255 $(Q)$(INSTALL) -D -m 0644 support/misc/Buildroot.cmake $(@)