CMAKE_(SYSTEM_)?IGNORE_(PREFIX_)?PATH doesn't work under all conditions.
So I basically wasted a week trying to get cmake to ignore libEGL (angle port) from vcpkg in the x64-linux triplet while building qtbase. I tried a lot of variables without success (--trace-expand;--debug-find) but came to the conclusion that:
list(APPEND CMAKE_IGNORE_PREFIX_PATH "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}")
list(APPEND CMAKE_SYSTEM_IGNORE_PREFIX_PATH "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}")
list(APPEND CMAKE_IGNORE_PATH "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib")
list(APPEND CMAKE_SYSTEM_IGNORE_PATH "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib")
should actually work. Unfortunately it doesn't. The reason is the following. qtbase calls find_package(EGL)
which I redirected to vcpkg-cmake-wrapper.cmake
which then calls find_package(OpenGL COMPONENTS EGL)
(redirect to another wrapper setting the above variables before doing _find_packge(OpenGL)) and after that calls the true _find_package(EGL)
. The result was always that OpenGL_egl_LIBRARY
was always set to "{VCPKG_INSTALLED_DIR}/
{VCPKG_TARGET_TRIPLET}/lib/libEGL.a" which is wrong because I explicitly instructed cmake to ignore those paths.
So I did some local testing and found that the above variables don't do anything if they are set from within a Find<Module>.cmake
file:
My setup:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.24)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
list(APPEND CMAKE_SYSTEM_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/system") # Simulate system dir
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/external;${CMAKE_CURRENT_LIST_DIR}/external/debug")
project(cmake_ignore_test LANGUAGES NONE)
#find_package(SomePackage)
#if(someheader_include_dir MATCHES "system")
# message(FATAL_ERROR "Wrong header found")
#endif()
#if(somelib_library MATCHES "system")
# message(FATAL_ERROR "Wrong library found")
#endif()
# list(APPEND CMAKE_IGNORE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/external")
# list(APPEND CMAKE_SYSTEM_IGNORE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/external")
# list(APPEND CMAKE_IGNORE_PATH "${CMAKE_CURRENT_LIST_DIR}/external/include" "${CMAKE_CURRENT_LIST_DIR}/external/lib" "${CMAKE_CURRENT_LIST_DIR}/external/debug/lib")
# list(APPEND CMAKE_SYSTEM_IGNORE_PATH "${CMAKE_CURRENT_LIST_DIR}/external/include" "${CMAKE_CURRENT_LIST_DIR}/external/lib" "${CMAKE_CURRENT_LIST_DIR}/external/debug/lib")
find_package(SomeOtherPackage)
if(someotherheader_include_dir MATCHES "external")
message(FATAL_ERROR "Wrong header found: ${someotherheader_include_dir}")
endif()
if(someotherlib_library MATCHES "external")
message(FATAL_ERROR "Wrong library found: ${someotherlib_library}")
endif()
include(CMakePrintHelpers)
cmake_print_variables(someheader_include_dir somelib_library someotherheader_include_dir someotherlib_library)
cmake/FindSomePackage.cmake:
include(CMakePrintHelpers)
include(FindPackageHandleStandardArgs)
find_path(someheader_include_dir NAMES someheader.h PATH_SUFFIXES include)
find_library(somelib_library NAMES somelib PATH_SUFFIXES lib)
find_package_handle_standard_args(SomePackage someheader_include_dir somelib_library)
cmake/FindSomeOtherPackage.cmake:
include(CMakePrintHelpers)
include(FindPackageHandleStandardArgs)
list(APPEND CMAKE_IGNORE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/../external")
list(APPEND CMAKE_SYSTEM_IGNORE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/../external")
list(APPEND CMAKE_IGNORE_PATH "${CMAKE_CURRENT_LIST_DIR}/../external/include" "${CMAKE_CURRENT_LIST_DIR}/../external/lib" "${CMAKE_CURRENT_LIST_DIR}/../external/debug/lib")
list(APPEND CMAKE_SYSTEM_IGNORE_PATH "${CMAKE_CURRENT_LIST_DIR}/../external/include" "${CMAKE_CURRENT_LIST_DIR}/../external/lib" "${CMAKE_CURRENT_LIST_DIR}/../external/debug/lib")
# Just to make sure it doesn't work due to the /../ (turns out it doesn't matter)
foreach(var IN ITEMS CMAKE_IGNORE_PREFIX_PATH CMAKE_SYSTEM_IGNORE_PREFIX_PATH CMAKE_IGNORE_PATH CMAKE_SYSTEM_IGNORE_PATH)
foreach(path IN LISTS var)
cmake_path(NORMAL_PATH "${path}")
list(APPEND ${var}_NORMALIZED "${${path}}")
endforeach()
set(${var} "${${var}_NORMALIZED}")
endforeach()
cmake_print_variables(CMAKE_SYSTEM_IGNORE_PREFIX_PATH)
find_package(SomePackage)
find_path(someotherheader_include_dir NAMES someotherheader.h PATH_SUFFIXES include)
find_library(someotherlib_library NAMES someotherlib PATH_SUFFIXES lib)
find_package_handle_standard_args(SomeOtherPackage someotherheader_include_dir someotherlib_library)
- some empty headers/lib files in the system and external subfolders (exactly same file structure in both folders).
The script errors and outputs:
[cmake] -- CMAKE_SYSTEM_IGNORE_PREFIX_PATH="E:/vcpkg_folders/cmake_ignore_test/external"
[cmake] CMake Error at CMakeLists.txt:24 (message):
[cmake] Wrong header found: E:/vcpkg_folders/cmake_ignore_test/external/include
which looks more than wrong and unexpected to me.