OK. Thanks for the review and the explanation about Python under Windows.
I think the best solution is to set Python3_FIND_ABI
only for Linux.
Everything build if I do :
if(NOT WIN32)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(Python3_FIND_ABI "ON" "ANY" "ANY")
else()
set(Python3_FIND_ABI "OFF" "ANY" "ANY")
endif()
endif()
find_package(
Python3
COMPONENTS Interpreter Development
REQUIRED)
find_package(pybind11 CONFIG REQUIRED)
I will investigate more if I still have a problem.
Thanks for your help.
Documentation says : "So, on Windows systems, when Python3_FIND_ABI is defined, Python distributions from python.org will be found only if value for each flag is OFF or ANY."
I tried to implement a workaround because I need to have pydebug to use pybind11 in Debug mode : Windows Python with Debug Libraries Installed causes linker error
List of problems I found :
Python3_FIND_ABI(ON ANY ANY)
, Python3_FIND_UNVERSIONED_NAMES
search python
instead of pythond
/ python_d
.sys.abiflags
doesn't work for Windows. So don't try to read sys.abiflags
to check if an interpreter is good. Also don't update Python3_ABIFLAGS
when interpreter has been checked.Changed in version 3.8: Default flags became an empty string (m flag for pymalloc has been removed).
System-specific parameters and functions. I didn't do any change about this change.@marc.chevrier Thanks, sure.
The problem is that pybind11
need Python3_EXECUTABLE
set to pythond
when building in debug mode.
To reproduce the problem, please follow next steps in Linux environment. Be sure to have python3-dbg package installed.
git clone --branch cmake-25764 https://github.com/zyrkiel/test_link_python_debug.git
cd test_link_python_debug/
git submodule update --init vcpkg
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg install
cd ..
cmake -S . -B build_release -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE="vcpkg/scripts/buildsystems/vcpkg.cmake"
...
-- Found Python3: /usr/bin/python3 (found version "3.11.6") found components: Interpreter Development Development.Module Development.Embed
...
cmake --build build_release --config Release
cmake -S . -B build_debug -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE="vcpkg/scripts/buildsystems/vcpkg.cmake"
...
-- Found Python3: /usr/bin/python3 (found version "3.11.6") found components: Interpreter Development Development.Module Development.Embed
...
# It found python3 and not python3d.
cmake --build build_debug --config Debug
[100%] Linking CXX executable PythonLinkTest
/usr/bin/ld: foo_lib/libFoo.a(foo.cpp.o) : dans la fonction « Py_INCREF » :
/usr/include/python3.11/object.h:500:(.text+0xb9): undefined reference to `_Py_RefTotal'
/usr/bin/ld: /usr/include/python3.11/object.h:500:(.text+0xc7): undefined reference to `_Py_RefTotal'
/usr/bin/ld: foo_lib/libFoo.a(foo.cpp.o) : dans la fonction « Py_DECREF » :
/usr/include/python3.11/object.h:520:(.text+0xf9): undefined reference to `_Py_RefTotal'
/usr/bin/ld: /usr/include/python3.11/object.h:520:(.text+0x107): undefined reference to `_Py_RefTotal'
/usr/bin/ld: /usr/include/python3.11/object.h:523:(.text+0x14e): undefined reference to `_Py_NegativeRefcount'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/PythonLinkTest.dir/build.make:99 : PythonLinkTest] Erreur 1
gmake[1]: *** [CMakeFiles/Makefile2:100 : CMakeFiles/PythonLinkTest.dir/all] Erreur 2
gmake: *** [Makefile:136 : all] Erreur 2
Uncomment Python3_FIND_ABI in CMakeLists.txt
cmake --build build_debug --config Debug
...
-- Found Python3: /usr/bin/python3.11d (found version "3.11.6") found components: Interpreter Development Development.Module Development.Embed
...
# Success
I have the same problem under Windows. So I need Python3_FIND_ABI
under Windows.
I don't really like to search for both WIN32 / POSIX but it's like that in the rest of the code.
Closes: #25764
Topic-rename: FindPython-abi-windows
LE GARREC Vincent (a566959f) at 12 Mar 09:37
Add Python_FIND_ABI for Windows
Documentation says : "So, on Windows systems, when Python3_FIND_ABI is defined, Python distributions from python.org will be found only if value for each flag is OFF or ANY."
I tried to implement a workaround because I need to have pydebug to use pybind11 in Debug mode : Windows Python with Debug Libraries Installed causes linker error
List of problems I found :
Python3_FIND_ABI(ON ANY ANY)
, Python3_FIND_UNVERSIONED_NAMES
search python
instead of pythond
/ python_d
.sys.abiflags
doesn't work for Windows. So don't try to read sys.abiflags
to check if an interpreter is good. Also don't update Python3_ABIFLAGS
when interpreter has been checked.Changed in version 3.8: Default flags became an empty string (m flag for pymalloc has been removed).
System-specific parameters and functions. I didn't do any change about this change.@brad.king Thank for the quick fix. At first try, it now finds Matlab.
But after reading log, the fix looks not good. The regex at line 492 still found "9.59".
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(482): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB SUBKEYS VIEW 64 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(487): if(_reg )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(489): string(REGEX MATCHALL ([0-9]+\.[0-9]+) _versions_regex 9.5;9.9 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(491): foreach(match IN LISTS _versions_regex )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(492): string(REGEX MATCH ([0-9]+\.[0-9]+) current_match 9.59 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(494): if(NOT CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(498): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB/9.59 VALUE MATLABROOT )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(503): _Matlab_VersionInfoXML( _matlab_version_tmp )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1409): set(_ver unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1411): set(_XMLfile /VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1412): if(NOT EXISTS /VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1413): return()
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(504): if(NOT STREQUAL unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(505): list(APPEND matlabs_from_registry )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(482): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB Runtime SUBKEYS VIEW 64 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(487): if(_reg )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(489): string(REGEX MATCHALL ([0-9]+\.[0-9]+) _versions_regex 9.10 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(491): foreach(match IN LISTS _versions_regex )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(492): string(REGEX MATCH ([0-9]+\.[0-9]+) current_match 9.10 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(494): if(NOT CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(498): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB Runtime/9.10 VALUE MATLABROOT )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(503): _Matlab_VersionInfoXML(C:\Program Files\MATLAB\MATLAB Runtime _matlab_version_tmp )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1409): set(_ver unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1411): set(_XMLfile C:\Program Files\MATLAB\MATLAB Runtime/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1412): if(NOT EXISTS C:\Program Files\MATLAB\MATLAB Runtime/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1413): return()
Based on your idea, I added double quote around ${_red}
in the regex at line 489 :
string(REGEX MATCHALL "([0-9]+\\.[0-9]+)" _versions_regex "${_reg}")
Then now, the script iterates over all version of Matlab :
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(480): foreach(_installation_type IN ITEMS MATLAB MATLAB Runtime MATLAB Compiler Runtime )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(482): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB SUBKEYS VIEW 64 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(487): if(_reg )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(489): string(REGEX MATCHALL ([0-9]+\.[0-9]+) _versions_regex 9.5;9.9 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(491): foreach(match IN LISTS _versions_regex )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(492): string(REGEX MATCH ([0-9]+\.[0-9]+) current_match 9.5 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(494): if(NOT CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(498): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB/9.5 VALUE MATLABROOT )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(503): _Matlab_VersionInfoXML(C:\Program Files\MATLAB\R2018b _matlab_version_tmp )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1409): set(_ver unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1411): set(_XMLfile C:\Program Files\MATLAB\R2018b/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1412): if(NOT EXISTS C:\Program Files\MATLAB\R2018b/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1416): file(READ C:\Program Files\MATLAB\R2018b/VersionInfo.xml versioninfo_string )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1418): if(versioninfo_string )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1420): string(REGEX MATCH <version>([0-9]+(\.[0-9]+)+)</version> version_reg_match <?xml version="1.0" encoding="UTF-8"?>
<!-- Version information for MathWorks R2018b Release -->
<MathWorks_version_info>
<version>9.5.0.1586782</version>
<release>R2018b</release>
<description>Update 8</description>
<date>Jan 28 2021</date>
<checksum>4002819590</checksum>
</MathWorks_version_info>
)
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1425): if(CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1426): set(_ver 9.5.0.1586782 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1430): set(_matlab_version_tmp 9.5.0.1586782 PARENT_SCOPE )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(504): if(NOT 9.5.0.1586782 STREQUAL unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(505): list(APPEND matlabs_from_registry 9.5.0.1586782 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(492): string(REGEX MATCH ([0-9]+\.[0-9]+) current_match 9.9 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(494): if(NOT CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(498): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB/9.9 VALUE MATLABROOT )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(503): _Matlab_VersionInfoXML(C:\Program Files\MATLAB\R2020b _matlab_version_tmp )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1409): set(_ver unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1411): set(_XMLfile C:\Program Files\MATLAB\R2020b/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1412): if(NOT EXISTS C:\Program Files\MATLAB\R2020b/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1416): file(READ C:\Program Files\MATLAB\R2020b/VersionInfo.xml versioninfo_string )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1418): if(versioninfo_string )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1420): string(REGEX MATCH <version>([0-9]+(\.[0-9]+)+)</version> version_reg_match <?xml version="1.0" encoding="UTF-8"?>
<!-- Version information for MathWorks R2020b Release -->
<MathWorks_version_info>
<version>9.9.0.1467703</version>
<release>R2020b</release>
<description></description>
<date>Aug 26 2020</date>
<checksum>2314982500</checksum>
</MathWorks_version_info>
)
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1425): if(CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1426): set(_ver 9.9.0.1467703 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1430): set(_matlab_version_tmp 9.9.0.1467703 PARENT_SCOPE )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(504): if(NOT 9.9.0.1467703 STREQUAL unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(505): list(APPEND matlabs_from_registry 9.9.0.1467703 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(482): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB Runtime SUBKEYS VIEW 64 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(487): if(_reg )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(489): string(REGEX MATCHALL ([0-9]+\.[0-9]+) _versions_regex 9.10 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(491): foreach(match IN LISTS _versions_regex )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(492): string(REGEX MATCH ([0-9]+\.[0-9]+) current_match 9.10 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(494): if(NOT CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(498): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB Runtime/9.10 VALUE MATLABROOT )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(503): _Matlab_VersionInfoXML(C:\Program Files\MATLAB\MATLAB Runtime _matlab_version_tmp )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1409): set(_ver unknown )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1411): set(_XMLfile C:\Program Files\MATLAB\MATLAB Runtime/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1412): if(NOT EXISTS C:\Program Files\MATLAB\MATLAB Runtime/VersionInfo.xml )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(1413): return()```
What do you think about my fix ?
Probably since !8760
Failed to find MatLab with CMake 3.28. Regression. Work with CMake 3.27.7.
Log with --trace-expand:
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(487): if(_reg )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(489): string(REGEX MATCHALL ([0-9]+\.[0-9]+) _versions_regex 9.5;9.9 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(491): foreach(match IN LISTS _versions_regex )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(492): string(REGEX MATCH ([0-9]+\.[0-9]+) current_match 9.59 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(494): if(NOT CMAKE_MATCH_1 )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(498): cmake_host_system_information(RESULT _reg QUERY WINDOWS_REGISTRY HKLM/SOFTWARE/Mathworks/MATLAB/9.59 VALUE MATLABROOT )
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake(503): _Matlab_VersionInfoXML( _matlab_version_tmp )
CMake Error at C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake:503 (_Matlab_VersionInfoXML):
_Matlab_VersionInfoXML Function invoked with incorrect arguments for
function named: _Matlab_VersionInfoXML
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake:1450 (matlab_extract_all_installed_versions_from_registry)
C:/Program Files/CMake/share/cmake-3.28/Modules/FindMatlab.cmake:1611 (_Matlab_find_instances_win32)
You can see that I have Matlab 9.5 and 9.9.
But the regex match 9.59.
Closes #24300
LE GARREC Vincent (87a00980) at 10 Jan 05:39
Disable error message if build path in a subdirectory of src path
LE GARREC Vincent (a8c8e203) at 10 Jan 05:36
Disable error message if build path in a subdirectory of src path
I have a project that have external dependencies with ExternalProject_Add
in path /src
.
I build it with success under path /build
If I try to build in folder /src/build
, I have property contains path ... which is prefixed in the source directory
error message.
I took a look at https://gitlab.kitware.com/cmake/cmake/-/blob/830eed374d540ebd643cd9385546838804c07160/Source/cmExportFileGenerator.cxx#L216 and I think the line should be const bool inSourceBuild = isSubDirectory(topBinaryDir, topSourceDir);
What do you think ? Should I create a MR ? Or did I missed something ?