diff mbox series

[v2] package/eigen: use cmake-package infra

Message ID 20200614173754.702855-1-juju@cotds.org
State Superseded
Headers show
Series [v2] package/eigen: use cmake-package infra | expand

Commit Message

Julien Olivain June 14, 2020, 5:37 p.m. UTC
The eigen package was introduced as a generic package, but upstream was
in fact using CMake.

The motivation of this change is to fix package detection with CMake.

Eigen3 library normally installs a signature file named
"signature_of_eigen3_matrix_library" to help library detection:
https://gitlab.com/libeigen/eigen/-/blob/3.3.7/CMakeLists.txt#L423

The library also provide a CMake macro that use this file to
detect it:
https://gitlab.com/libeigen/eigen/-/blob/3.3.7/cmake/FindEigen3.cmake#L76

Without the signature file installed, packages searching for this
library with this method will fail. Other packages usings pkg-config are
not affected by this issue.

By using the cmake-package infrastructure, all the needed files
are now installed, fixing this CMake detection issue.

Other changes in this patch:
- Updated the Eigen git repository to the new url:
  https://gitlab.com/libeigen/eigen
- Removed all build and install staging commands
  (now included in upstream cmake)
- Package needs EIGEN_SUPPORTS_IN_SOURCE_BUILD = NO
- Removed the BR2_PACKAGE_EIGEN_UNSUPPORTED_MODULES option,
  as this option is not proposed by the upstream CMake
- Updated hash for source package
- Reformat hash file with two spaces delimiters
- Define EIGEN_CONF_OPTS to set pkg-config .pc install path

Signed-off-by: Julien Olivain <juju@cotds.org>

---
Changes v1 -> v2:
  - use cmake package infra, instead of fixing cmake detection
    issue by duplicating upstream commands, as suggested by Yann.

---
 package/eigen/Config.in  |  8 --------
 package/eigen/eigen.hash | 14 +++++++-------
 package/eigen/eigen.mk   | 37 ++++++++-----------------------------
 3 files changed, 15 insertions(+), 44 deletions(-)

Comments

Yann E. MORIN June 14, 2020, 9:15 p.m. UTC | #1
Julien, All,

On 2020-06-14 19:37 +0200, Julien Olivain spake thusly:
> The eigen package was introduced as a generic package, but upstream was
> in fact using CMake.
> 
> The motivation of this change is to fix package detection with CMake.
> 
> Eigen3 library normally installs a signature file named
> "signature_of_eigen3_matrix_library" to help library detection:
> https://gitlab.com/libeigen/eigen/-/blob/3.3.7/CMakeLists.txt#L423
> 
> The library also provide a CMake macro that use this file to
> detect it:
> https://gitlab.com/libeigen/eigen/-/blob/3.3.7/cmake/FindEigen3.cmake#L76
> 
> Without the signature file installed, packages searching for this
> library with this method will fail. Other packages usings pkg-config are
> not affected by this issue.
> 
> By using the cmake-package infrastructure, all the needed files
> are now installed, fixing this CMake detection issue.
> 
> Other changes in this patch:
> - Updated the Eigen git repository to the new url:
>   https://gitlab.com/libeigen/eigen
> - Removed all build and install staging commands
>   (now included in upstream cmake)
> - Package needs EIGEN_SUPPORTS_IN_SOURCE_BUILD = NO
> - Removed the BR2_PACKAGE_EIGEN_UNSUPPORTED_MODULES option,
>   as this option is not proposed by the upstream CMake

    ... but they are unconditionally installed. A such, no need to
    introduce a legacy entry for BR2_PACKAGE_EIGEN_UNSUPPORTED_MODULES:
    users that had it enabled will still get the files installed, while
    those that did not will get them installed now.

> - Updated hash for source package

... because the first component in the stored paths changed from
eigen-eigen-323c052e1731/ to eigen-3.3.7/ and some mercurial related
files (.hg_archival.txt, .hgtags) got dropped after the conversion to
git.

> - Reformat hash file with two spaces delimiters
> - Define EIGEN_CONF_OPTS to set pkg-config .pc install path

This one I am having a hard time with, see below...

> Signed-off-by: Julien Olivain <juju@cotds.org>
[--SNIP--]
> +# Default Eigen CMake installs .pc file in
> +# $(STAGING)/usr/share/pkgconfig
> +# change it to lib/pkgconfig, to be consistent with other packages.
> +EIGEN_CONF_OPTS = -DPKGCONFIG_INSTALL_DIR:PATH=lib/pkgconfig

So this is a syntax that I am not familiar with.

First, it uses a non-absolute path "lib/pkgconfig". This is strange to
me. Second, it uses a variable with a colon PKGCONFIG_INSTALL_DIR:PATH,
and I don't know that either.

Yes, it works as expected, but I like to understand what's going on. Can
you shed a light on this, please?

I've tested -DPKGCONFIG_INSTALL_DIR=/usr/lib/pkgconfig which is the
usual way we're used to in Buildroot, and that works too.

I'll wait for your feedback on the above, but I'd prefer we use the more
traditional form unless there is a good reason not to.

Regards,
Yann E. MORIN.
Julien Olivain June 15, 2020, 6:47 p.m. UTC | #2
Yann, All,

On 2020-06-14 23:15, Yann E. MORIN wrote:
> Julien, All,
> 
> On 2020-06-14 19:37 +0200, Julien Olivain spake thusly:
>> The eigen package was introduced as a generic package, but upstream 
>> was
>> in fact using CMake.
>> 
>> The motivation of this change is to fix package detection with CMake.
>> 
>> Eigen3 library normally installs a signature file named
>> "signature_of_eigen3_matrix_library" to help library detection:
>> https://gitlab.com/libeigen/eigen/-/blob/3.3.7/CMakeLists.txt#L423
>> 
>> The library also provide a CMake macro that use this file to
>> detect it:
>> https://gitlab.com/libeigen/eigen/-/blob/3.3.7/cmake/FindEigen3.cmake#L76
>> 
>> Without the signature file installed, packages searching for this
>> library with this method will fail. Other packages usings pkg-config 
>> are
>> not affected by this issue.
>> 
>> By using the cmake-package infrastructure, all the needed files
>> are now installed, fixing this CMake detection issue.
>> 
>> Other changes in this patch:
>> - Updated the Eigen git repository to the new url:
>>   https://gitlab.com/libeigen/eigen
>> - Removed all build and install staging commands
>>   (now included in upstream cmake)
>> - Package needs EIGEN_SUPPORTS_IN_SOURCE_BUILD = NO
>> - Removed the BR2_PACKAGE_EIGEN_UNSUPPORTED_MODULES option,
>>   as this option is not proposed by the upstream CMake
> 
>     ... but they are unconditionally installed. A such, no need to
>     introduce a legacy entry for BR2_PACKAGE_EIGEN_UNSUPPORTED_MODULES:
>     users that had it enabled will still get the files installed, while
>     those that did not will get them installed now.

I'll clarify the commit log by including your comment in an updated 
patch.

>> - Updated hash for source package
> 
> ... because the first component in the stored paths changed from
> eigen-eigen-323c052e1731/ to eigen-3.3.7/ and some mercurial related
> files (.hg_archival.txt, .hgtags) got dropped after the conversion to
> git.

I'll also include this comment.

>> - Reformat hash file with two spaces delimiters
>> - Define EIGEN_CONF_OPTS to set pkg-config .pc install path
> 
> This one I am having a hard time with, see below...
> 
>> Signed-off-by: Julien Olivain <juju@cotds.org>
> [--SNIP--]
>> +# Default Eigen CMake installs .pc file in
>> +# $(STAGING)/usr/share/pkgconfig
>> +# change it to lib/pkgconfig, to be consistent with other packages.
>> +EIGEN_CONF_OPTS = -DPKGCONFIG_INSTALL_DIR:PATH=lib/pkgconfig
> 
> So this is a syntax that I am not familiar with.
> 
> First, it uses a non-absolute path "lib/pkgconfig". This is strange to
> me. Second, it uses a variable with a colon PKGCONFIG_INSTALL_DIR:PATH,
> and I don't know that either.
> 
> Yes, it works as expected, but I like to understand what's going on. 
> Can
> you shed a light on this, please?
> 
> I've tested -DPKGCONFIG_INSTALL_DIR=/usr/lib/pkgconfig which is the
> usual way we're used to in Buildroot, and that works too.
> 
> I'll wait for your feedback on the above, but I'd prefer we use the 
> more
> traditional form unless there is a good reason not to.

The notations:
-DPKGCONFIG_INSTALL_DIR:PATH=lib/pkgconfig
and
-DPKGCONFIG_INSTALL_DIR=/usr/lib/pkgconfig
will indeed give the same result.

I'll update the patch to use the traditional notation.

Some explanations how/why the first notation also works:
The -D variable:type=value option has been in cmake for at least a 
decade,
it just gives a hint of the type of CMake variable. It was already
present in CMake 2.4:
https://cmake.org/cmake/help/cmake2.4docs.html

The reason I've set the variable type was to match the type in
CMakeLists.txt:
https://gitlab.com/libeigen/eigen/-/blob/3.3.7/CMakeLists.txt#L407
But this is not mandatory.

Then, the PKGCONFIG_INSTALL_DIR variable is used as a destination of a
install() cmake command:
https://cmake.org/cmake/help/v3.18/command/install.html

A relative path is relative to CMAKE_INSTALL_PREFIX, which is set to
"/usr" by cmake-package infra:
https://git.busybox.net/buildroot/tree/package/pkg-cmake.mk?h=2020.05#n96

Then, everything gets relocated at "make DESTDIR=... install/fast"
time, to be installed in staging directory (in that case).

Thanks for the review, I'll send the updated patch soon.

Julien.
diff mbox series

Patch

diff --git a/package/eigen/Config.in b/package/eigen/Config.in
index 48752e0c8d..ef0a16f2f7 100644
--- a/package/eigen/Config.in
+++ b/package/eigen/Config.in
@@ -13,13 +13,5 @@  config BR2_PACKAGE_EIGEN
 
 	  http://eigen.tuxfamily.org/
 
-if BR2_PACKAGE_EIGEN
-
-config BR2_PACKAGE_EIGEN_UNSUPPORTED_MODULES
-	bool "unsupported modules"
-	help
-	  Install eigen unsupported modules
-endif
-
 comment "eigen needs a toolchain w/ C++"
 	depends on !BR2_INSTALL_LIBSTDCPP
diff --git a/package/eigen/eigen.hash b/package/eigen/eigen.hash
index e5c8404022..5ec561ad10 100644
--- a/package/eigen/eigen.hash
+++ b/package/eigen/eigen.hash
@@ -1,8 +1,8 @@ 
 # Locally computed
-sha256 9f13cf90dedbe3e52a19f43000d71fdf72e986beb9a5436dddcd61ff9d77a3ce 3.3.7.tar.bz2
-sha256 4f877e5ae4672568ef82cfd0023e2cef4a7cf55d867ab249efc9569a7eb9e5b1 COPYING.BSD
-sha256 8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903 COPYING.GPL
-sha256 dc626520dcd53a22f727af3ee42c770e56c97a64fe3adb063799d8ab032fe551 COPYING.LGPL
-sha256 f5b330efdad110cdd84d585ec61220b0650461fa599e36b13e1726c9346dcfb9 COPYING.MINPACK
-sha256 fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85 COPYING.MPL2
-sha256 c83230b770f17ef1386ea1fd3681271dd98aa93646bdbfb5bff3a1b7050fff9d COPYING.README
+sha256  685adf14bd8e9c015b78097c1dc22f2f01343756f196acdc76a678e1ae352e11  eigen-3.3.7.tar.bz2
+sha256  4f877e5ae4672568ef82cfd0023e2cef4a7cf55d867ab249efc9569a7eb9e5b1  COPYING.BSD
+sha256  8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903  COPYING.GPL
+sha256  dc626520dcd53a22f727af3ee42c770e56c97a64fe3adb063799d8ab032fe551  COPYING.LGPL
+sha256  f5b330efdad110cdd84d585ec61220b0650461fa599e36b13e1726c9346dcfb9  COPYING.MINPACK
+sha256  fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85  COPYING.MPL2
+sha256  c83230b770f17ef1386ea1fd3681271dd98aa93646bdbfb5bff3a1b7050fff9d  COPYING.README
diff --git a/package/eigen/eigen.mk b/package/eigen/eigen.mk
index 5c9e028442..993b85e351 100644
--- a/package/eigen/eigen.mk
+++ b/package/eigen/eigen.mk
@@ -5,38 +5,17 @@ 
 ################################################################################
 
 EIGEN_VERSION = 3.3.7
-EIGEN_SOURCE = $(EIGEN_VERSION).tar.bz2
-EIGEN_SITE = https://bitbucket.org/eigen/eigen/get
+EIGEN_SOURCE = eigen-$(EIGEN_VERSION).tar.bz2
+EIGEN_SITE = https://gitlab.com/libeigen/eigen/-/archive/$(EIGEN_VERSION)
 EIGEN_LICENSE = MPL2, BSD-3-Clause, LGPL-2.1
 EIGEN_LICENSE_FILES = COPYING.MPL2 COPYING.BSD COPYING.LGPL COPYING.README
 EIGEN_INSTALL_STAGING = YES
 EIGEN_INSTALL_TARGET = NO
-EIGEN_DEST_DIR = $(STAGING_DIR)/usr/include/eigen3
+EIGEN_SUPPORTS_IN_SOURCE_BUILD = NO
 
-ifeq ($(BR2_PACKAGE_EIGEN_UNSUPPORTED_MODULES),y)
-define EIGEN_INSTALL_UNSUPPORTED_MODULES_CMDS
-	mkdir -p $(EIGEN_DEST_DIR)/unsupported
-	cp -a $(@D)/unsupported/Eigen $(EIGEN_DEST_DIR)/unsupported
-endef
-endif
+# Default Eigen CMake installs .pc file in
+# $(STAGING)/usr/share/pkgconfig
+# change it to lib/pkgconfig, to be consistent with other packages.
+EIGEN_CONF_OPTS = -DPKGCONFIG_INSTALL_DIR:PATH=lib/pkgconfig
 
-# Generate the .pc file at build time
-define EIGEN_BUILD_CMDS
-	sed -r -e 's,^Version: .*,Version: $(EIGEN_VERSION),' \
-		-e 's,^Cflags: .*,Cflags: -I$$\{prefix\}/include/eigen3,' \
-		-e 's,^prefix.*,prefix=/usr,' \
-		$(@D)/eigen3.pc.in >$(@D)/eigen3.pc
-endef
-
-# This package only consists of headers that need to be
-# copied over to the sysroot for compile time use
-define EIGEN_INSTALL_STAGING_CMDS
-	$(RM) -r $(EIGEN_DEST_DIR)
-	mkdir -p $(EIGEN_DEST_DIR)
-	cp -a $(@D)/Eigen $(EIGEN_DEST_DIR)
-	$(EIGEN_INSTALL_UNSUPPORTED_MODULES_CMDS)
-	$(INSTALL) -D -m 0644 $(@D)/eigen3.pc \
-		$(STAGING_DIR)/usr/lib/pkgconfig/eigen3.pc
-endef
-
-$(eval $(generic-package))
+$(eval $(cmake-package))