CPM.cmake icon indicating copy to clipboard operation
CPM.cmake copied to clipboard

CPMFindPackage failed to find package installed by apt on Debian

Open LXYan2333 opened this issue 2 years ago • 3 comments

problem

I have mimalloc installed on my Debian 12 system using apt:

$ sudo apt install libmimalloc-dev/stable

and I can find_package it:

find_package(mimalloc CONFIG REQUIRED)

now I want to try find_package it first, and if mimalloc can not be found, install it via CPM.

according to readme:

For using CPM.cmake projects with external package managers, such as conan or vcpkg, setting the variable [CPM_USE_LOCAL_PACKAGES](https://github.com/cpm-cmake/CPM.cmake/blob/369f1316f67545e6ef115b317802bc7acedf6697/README.md#options) will make CPM.cmake try to add a package through find_package first, and add it from source if it doesn't succeed.

In rare cases, this behaviour may be desirable by default. The function CPMFindPackage will try to find a local dependency via CMake's find_package and fallback to CPMAddPackage, if the dependency is not found.

I write cmake file like this:

if(NOT TARGET mimalloc)
    CPMFindPackage(
        NAME mimalloc
        GITHUB_REPOSITORY "microsoft/mimalloc"
        VERSION 2.1.2)
endif()

however cpm can't find the mimalloc provided by system, but add it via source. the log is:

CPM: Adding package [email protected] (v2.1.2 at /home/lxyan/.cache/CPM/mimalloc/335bb897ed60cff43911ea8a4d21b596e5528f1a)

CPM version:

CURRENT_CPM_VERSION 0.38.7

LXYan2333 avatar Dec 18 '23 03:12 LXYan2333

oh, I read the code:

function(cpm_find_package NAME VERSION)
  string(REPLACE " " ";" EXTRA_ARGS "${ARGN}")
  find_package(${NAME} ${VERSION} ${EXTRA_ARGS} QUIET)
  if(${CPM_ARGS_NAME}_FOUND)
    if(DEFINED ${CPM_ARGS_NAME}_VERSION)
      set(VERSION ${${CPM_ARGS_NAME}_VERSION})
    endif()
    cpm_message(STATUS "${CPM_INDENT} Using local package ${CPM_ARGS_NAME}@${VERSION}")
    CPMRegisterPackage(${CPM_ARGS_NAME} "${VERSION}")
    set(CPM_PACKAGE_FOUND
        YES
        PARENT_SCOPE
    )
  else()
    set(CPM_PACKAGE_FOUND
        NO
        PARENT_SCOPE
    )
  endif()
endfunction()

it seems that the version number must be exactly the same. Maybe we can provide an option to soften this restriction? Since in a lot of time the version specified in CPMFindPackage is only used to indicate the last release number, not means I want the exact version.

LXYan2333 avatar Dec 18 '23 03:12 LXYan2333

maybe related to #497

LXYan2333 avatar Dec 18 '23 07:12 LXYan2333

If I remember correctly, the libraries themselves define their compatibility in their package version file, so this should actually be up to the library implementation and not CPM.

TheLartians avatar Jan 17 '24 07:01 TheLartians

Can this be closed?

ScottBailey avatar Apr 04 '24 13:04 ScottBailey