tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: cmake find_library() vs depends



> CMake's find_library() function is apparently not fit for purpose in a pkgsrc environment.  It is not buildlink-aware, and will simply go looking around the file system for arbitrary libraries.
> 
> This causes a problem with e.g. execinfo:
> 
>  https://us-central.manta.mnx.io/pkgsrc/public/reports/Darwin/12.3/x86_64/20240510.1437/protobuf-c-1.5.0nb4/build.log
> 
> as cmake depends on a bunch of packages, which are pulled into the file system for any package that uses cmake as a build-time dependency.
> 
> It looks like there are a number of hacks trying to work around this, for example:
> 
>  $ git grep -C2 rm:-lexecinfo
>  devel/abseil/Makefile-.if ${OPSYS} == "Darwin"
>  devel/abseil/Makefile-.  if exists(${OSX_SDK_PATH}/usr/include/execinfo.h)
>  devel/abseil/Makefile:BUILDLINK_TRANSFORM+=     rm:-lexecinfo
>  devel/abseil/Makefile-.  endif
>  devel/abseil/Makefile-.endif
>  --
>  x11/qt5-qtbase/Makefile-# -lexecinfo is bundled in libc
>  x11/qt5-qtbase/Makefile-.  if exists(${OSX_SDK_PATH}/usr/include/execinfo.h)
>  x11/qt5-qtbase/Makefile:BUILDLINK_TRANSFORM+=           rm:-lexecinfo
>  x11/qt5-qtbase/Makefile-.  endif
>  x11/qt5-qtbase/Makefile-.elif ${OPSYS} == "Linux"
>  --
>  x11/qt6-qtbase/Makefile-# -lexecinfo is bundled in libc
>  x11/qt6-qtbase/Makefile-.  if exists(${OSX_SDK_PATH}/usr/include/execinfo.h)
>  x11/qt6-qtbase/Makefile:BUILDLINK_TRANSFORM+=           rm:-lexecinfo
>  x11/qt6-qtbase/Makefile-.  endif
>  x11/qt6-qtbase/Makefile-.elif ${OPSYS} == "Linux"
> 
> and no doubt this is biting us in other places for the other dependencies that cmake pulls in.
> 
> In the specific case of libexecinfo, why does cmake depend on it?  I've built it fine without the include on both macOS and SmartOS.  Given this problem, I'd prefer it if cmake was built with as few dependencies as possible.
> 
> I'd go further and argue we should have two cmake packages.  One that is as small as possible that is only used for building packages (let's call it cmake-build or something), and then the main cmake package that is full-featured with e.g. curl support (that we would never want enabled for building anyway) for end users to use outside of pkgsrc.

How about changing Modules/Platform/UnixPaths.cmake to optionally take only buildlink directory into account, something like:


set(PKGSRC_BUILDLINK_DIR "$ENV{BUILDLINK_DIR}" CACHE STRING "PkgSrc buildlink directory")
if(PKGSRC_BUILDLINK_DIR)
  list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PKGSRC_BUILDLINK_DIR}")
else()
  list(APPEND CMAKE_SYSTEM_PREFIX_PATH
    # Standard
    @LOCALBASE@ /usr/local /usr /
    )
endif()


cmake/build.mk already provides BUILDLINK_DIR in CONFIGURE_ENV, so that should be enough.


Home | Main Index | Thread Index | Old Index