From b60aa1c8bc63fd588e440a68f64d51cafa3c7c62 Mon Sep 17 00:00:00 2001 From: Sean Parent Date: Thu, 20 Nov 2025 10:07:25 -0800 Subject: [PATCH 1/2] Support org-prefixed package names in find_package CPM.cmake now attempts to locate packages using organization-prefixed names (e.g., org-library) if the standard name is not found. This helps resolve naming conflicts and improves compatibility with packages installed under organization-qualified names. Documentation has been updated to reflect this behavior. --- README.md | 2 ++ cmake/CPM.cmake | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13e31ed2..1776284c 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,8 @@ After calling `CPMAddPackage`, the following variables are defined in the local For using CPM.cmake projects with external package managers, such as conan or vcpkg, setting the variable [`CPM_USE_LOCAL_PACKAGES`](#options) will make CPM.cmake try to add a package through `find_package` first, and add it from source if it doesn't succeed. +When using `find_package`, CPM will automatically try to locate installed packages using organization-prefixed names. For example, a package specified as `gh:org/library` will first be searched as `library`, and if not found, will be searched as `org-library`. This allows installed packages to be found using their organization-qualified names to avoid naming conflicts. + 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. ## Updating CPM diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 2d151bf9..1d52aec6 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -197,6 +197,10 @@ function(cpm_package_name_from_git_uri URI RESULT) ${CMAKE_MATCH_1} PARENT_SCOPE ) + # Also export org-prefixed variant if org can be extracted + if("${URI}" MATCHES "[/:]([^/:]+)/([^/:]+)(/?.git/?)?$") + set(${RESULT}_WITH_ORG "${CMAKE_MATCH_1}-${CMAKE_MATCH_2}" PARENT_SCOPE) + endif() else() unset(${RESULT} PARENT_SCOPE) endif() @@ -304,7 +308,14 @@ endfunction() function(cpm_find_package NAME VERSION) string(REPLACE " " ";" EXTRA_ARGS "${ARGN}") - find_package(${NAME} ${VERSION} ${EXTRA_ARGS} QUIET) + find_package(${NAME} ${VERSION} ${EXTRA_ARGS} QUIET + + if(NOT ${CPM_ARGS_NAME}_FOUND AND DEFINED ${CPM_ARGS_NAME}_WITH_ORG) + find_package(${${CPM_ARGS_NAME}_WITH_ORG} ${CPM_ARGS_VERSION} QUIET ${CPM_ARGS_FIND_PACKAGE_ARGUMENTS}) + if(${${CPM_ARGS_NAME}_WITH_ORG}_FOUND) + set(${CPM_ARGS_NAME}_FOUND TRUE) + endif() + endif() if(${CPM_ARGS_NAME}_FOUND) if(DEFINED ${CPM_ARGS_NAME}_VERSION) set(VERSION ${${CPM_ARGS_NAME}_VERSION}) From 4449e205dbaac7c8820c854c74e3d5c0b465505a Mon Sep 17 00:00:00 2001 From: Sean Parent Date: Thu, 20 Nov 2025 10:10:31 -0800 Subject: [PATCH 2/2] typo. --- cmake/CPM.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 1d52aec6..e6a4c2ea 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -308,7 +308,7 @@ endfunction() function(cpm_find_package NAME VERSION) string(REPLACE " " ";" EXTRA_ARGS "${ARGN}") - find_package(${NAME} ${VERSION} ${EXTRA_ARGS} QUIET + find_package(${NAME} ${VERSION} ${EXTRA_ARGS} QUIET) if(NOT ${CPM_ARGS_NAME}_FOUND AND DEFINED ${CPM_ARGS_NAME}_WITH_ORG) find_package(${${CPM_ARGS_NAME}_WITH_ORG} ${CPM_ARGS_VERSION} QUIET ${CPM_ARGS_FIND_PACKAGE_ARGUMENTS}) @@ -316,6 +316,7 @@ function(cpm_find_package NAME VERSION) set(${CPM_ARGS_NAME}_FOUND TRUE) endif() endif() + if(${CPM_ARGS_NAME}_FOUND) if(DEFINED ${CPM_ARGS_NAME}_VERSION) set(VERSION ${${CPM_ARGS_NAME}_VERSION})