Sarcasm / irony-mode

A C/C++ minor mode for Emacs powered by libclang
GNU General Public License v3.0
901 stars 98 forks source link

Hints for how cmake chooses which version of LLVM to link with irony-server #590

Open sten0 opened 1 month ago

sten0 commented 1 month ago

Hi @Sarcasm,

I've made progress with enabling "triggers" which will allow the Debian package to reconfigure itself as system LLVM versions are installed, upgraded, uninstalled, etc. This means that Debian (and its derivatives) users will be able to once again rely on the system-managed copy of irony-mode, so they won't have to worry about maintaining a user-specific copy. Eventually the hope is that some advanced CI on more rare architectures can be deployed to check the status of multiple LLVM versions.

I confess to some burnout on this project, hence the slow progress (ie: rubber duck a problem -> needs research -> go researching -> get tired or run out of time -> months go by). Right now, this is the problem I see:

  1. Install LLVM/Clang 18, -dev packages, etc, and build irony-server |
    |--> irony-server links with libLLVM-18.so.1
  2. Leave LLVM/Clang 18 alone, and additionally install LLVM/Clang 17, -dev packages, etc, and build irony-server | |--> irony-server links with libLLVM-17.so.1 !
  3. Leave LLVM/Clay 18 and 17 alone, and additionally install LLVM/Clang 16, -dev packages, etc, and build irony-server | |--> irony-server links with libLLVM-16.so.1 !

I wasn't able to identify an obvious cause, and at this point it's better to be humble and publicly ask for a hint then to let this slide for another few months/years.

Does this look like something on the irony-mode side to you (perhaps something in CMakelists.txt?), or in the Debian side of things?

Sarcasm commented 1 month ago

irony-mode calls:

https://github.com/Sarcasm/irony-mode/blob/40e0ce19eb850bdf1f77225f11713cc816250d95/server/src/CMakeLists.txt#L4

If you print the path of this Clang that is found, what do you get? Are you sure the dev packages do not override the Clang-config.cmake?

If you can patch irony-server, i would try to add this line below the find_package:

 find_package(Clang)
+
+message(STATUS "Clang_FOUND=${Clang_FOUND} Clang_DIR=${Clang_DIR}")

And see what irony-mode CMake generation step prints.

What is the output of this:

clang -print-resource-dir

It looks like irony-server links to the libclang found in the standard search paths. What do you get if you type this?

ldd /usr/lib/libclang.so*
sten0 commented 1 month ago

Wow, thank you for such a fast reply!

Guillaume Papin @.***> writes:

irony-mode calls:

https://github.com/Sarcasm/irony-mode/blob/40e0ce19eb850bdf1f77225f11713cc816250d95/server/src/CMakeLists.txt#L4

If you print the path of this Clang that is found, what do you get?

Clang_DIR:PATH=/usr/lib/cmake/clang-16

Are you sure the dev packages do not override the Clang-config.cmake?

I didn't see anything that looked like it could do this.

If you can patch irony-server, i would try to add this line below the find_package:

 find_package(Clang)
+
+message(STATUS "Clang_FOUND=${Clang_FOUND} Clang_DIR=${Clang_DIR}")

-- Clang_FOUND=1 Clang_DIR=/usr/lib/cmake/clang-16

What is the output of this:

clang -print-resource-dir

bash: clang: command not found

Debian installs multiple supported LLVM/Clang versions as peers. Currently there are:

$ clang-18 -print-resource-dir /usr/lib/llvm-18/lib/clang/18

$ clang-17 -print-resource-dir /usr/lib/llvm-17/lib/clang/17

$ clang-16 -print-resource-dir /usr/lib/llvm-16/lib/clang/16

And see what irony-mode CMake generation step prints.

See just below your patch snippet.

It looks like irony-server links to the libclang found in the standard search paths. What do you get if you type this?

ldd /usr/lib/libclang.so*

Ohhh, I think I see what's happening now. I'm not sure if it happens at the filesystem or pkg-config level, but for {18,16,17}, "16" will usually sort first, and clang-16 matches the package lookup for this reason. Maybe cmake's default rule is "first match found" rather than "highest version found"? I had assumed cmake would serialise and sort the matches and then choose the highest by default, or else just match the tail rather than the head.

$ ldd /usr/lib/x86_64-linux-gnu/libclang* /usr/lib/x86_64-linux-gnu/libclang-16.so: linux-vdso.so.1 (0x00007ffcddfd8000) libLLVM-16.so.1 => /lib/x86_64-linux-gnu/libLLVM-16.so.1 (0x00007fe136a44000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe1367de000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe1365fa000) /lib64/ld-linux-x86-64.so.2 (0x00007fe1401c5000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007fe1365ed000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007fe1365b3000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe1364d2000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007fe134dde000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fe134dbf000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007fe134cfe000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fe134cc9000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007fe134b17000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe134ae8000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fe134ad3000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007fe1348ce000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fe13489e000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007fe13488f000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007fe132abb000) /usr/lib/x86_64-linux-gnu/libclang-16.so.1: linux-vdso.so.1 (0x00007fffb6f95000) libLLVM-16.so.1 => /lib/x86_64-linux-gnu/libLLVM-16.so.1 (0x00007f8e4de61000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8e4dbfb000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e4da17000) /lib64/ld-linux-x86-64.so.2 (0x00007f8e575e2000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f8e4da0a000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f8e4d9d0000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8e4d8ef000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f8e4c1fb000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8e4c1dc000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f8e4c11b000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f8e4c0e6000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f8e4bf34000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8e4bf05000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f8e4bef0000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f8e4bceb000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f8e4bcbb000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f8e4bcac000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f8e49ed8000) /usr/lib/x86_64-linux-gnu/libclang-16.so.16.0.6: linux-vdso.so.1 (0x00007ffd7eda0000) libLLVM-16.so.1 => /lib/x86_64-linux-gnu/libLLVM-16.so.1 (0x00007fc94df72000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc94dd0c000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc94db28000) /lib64/ld-linux-x86-64.so.2 (0x00007fc9576f3000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007fc94db1b000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007fc94dae1000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc94da00000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007fc94c30c000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc94c2ed000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007fc94c22c000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fc94c1f7000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007fc94c045000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc94c016000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fc94c001000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007fc94bdfc000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fc94bdcc000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007fc94bdbd000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007fc949fe9000) /usr/lib/x86_64-linux-gnu/libclang-17.so: linux-vdso.so.1 (0x00007ffe079d1000) libLLVM-17.so.1 => /lib/x86_64-linux-gnu/libLLVM-17.so.1 (0x00007f8f27fbf000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8f27d59000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8f27b75000) /lib64/ld-linux-x86-64.so.2 (0x00007f8f3168b000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f8f27b68000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f8f27b2e000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8f27a4d000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f8f26359000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8f2633a000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f8f26279000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f8f26244000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f8f26092000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8f26063000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f8f2604e000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f8f25e49000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f8f25e19000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f8f25e0a000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f8f24036000) /usr/lib/x86_64-linux-gnu/libclang-17.so.1: linux-vdso.so.1 (0x00007ffc467b1000) libLLVM-17.so.1 => /lib/x86_64-linux-gnu/libLLVM-17.so.1 (0x00007fa9d5803000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa9d559d000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9d53b9000) /lib64/ld-linux-x86-64.so.2 (0x00007fa9deecf000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007fa9d53ac000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007fa9d5372000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa9d5291000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007fa9d3b9d000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fa9d3b7e000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007fa9d3abd000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fa9d3a88000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007fa9d38d6000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa9d38a7000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fa9d3892000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007fa9d368d000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fa9d365d000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007fa9d364e000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007fa9d187a000) /usr/lib/x86_64-linux-gnu/libclang-17.so.17: linux-vdso.so.1 (0x00007ffe505c3000) libLLVM-17.so.1 => /lib/x86_64-linux-gnu/libLLVM-17.so.1 (0x00007f49f4650000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f49f43ea000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f49f4206000) /lib64/ld-linux-x86-64.so.2 (0x00007f49fdd1c000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f49f41f9000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f49f41bf000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f49f40de000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f49f29ea000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f49f29cb000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f49f290a000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f49f28d5000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f49f2723000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f49f26f4000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f49f26df000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f49f24da000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f49f24aa000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f49f249b000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f49f06c7000) /usr/lib/x86_64-linux-gnu/libclang-18.so: linux-vdso.so.1 (0x00007ffc931fe000) libLLVM.so.18.1 => /lib/x86_64-linux-gnu/libLLVM.so.18.1 (0x00007ff6eb9bb000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff6eb755000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff6eb571000) /lib64/ld-linux-x86-64.so.2 (0x00007ff6f5221000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007ff6eb564000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007ff6eb52a000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff6eb449000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007ff6e9d55000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff6e9d36000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007ff6e9c75000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ff6e9c40000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007ff6e9a8e000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff6e9a5f000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007ff6e9a4a000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007ff6e9845000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007ff6e9815000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007ff6e9806000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007ff6e7a32000) /usr/lib/x86_64-linux-gnu/libclang-18.so.1: linux-vdso.so.1 (0x00007ffd05a77000) libLLVM.so.18.1 => /lib/x86_64-linux-gnu/libLLVM.so.18.1 (0x00007f16a3212000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f16a2fac000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f16a2dc8000) /lib64/ld-linux-x86-64.so.2 (0x00007f16aca78000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f16a2dbb000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f16a2d81000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f16a2ca0000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f16a15ac000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f16a158d000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f16a14cc000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f16a1497000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f16a12e5000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f16a12b6000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f16a12a1000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f16a109c000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f16a106c000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f16a105d000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f169f289000) /usr/lib/x86_64-linux-gnu/libclang-18.so.18: linux-vdso.so.1 (0x00007ffd2c5fa000) libLLVM.so.18.1 => /lib/x86_64-linux-gnu/libLLVM.so.18.1 (0x00007fb4a87de000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb4a8578000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb4a8394000) /lib64/ld-linux-x86-64.so.2 (0x00007fb4b2044000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007fb4a8387000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007fb4a834d000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb4a826c000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007fb4a6b78000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb4a6b59000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007fb4a6a98000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fb4a6a63000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007fb4a68b1000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb4a6882000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fb4a686d000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007fb4a6668000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fb4a6638000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007fb4a6629000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007fb4a4855000) /usr/lib/x86_64-linux-gnu/libclang-cpp.so.16: linux-vdso.so.1 (0x00007fff675df000) libLLVM-16.so.1 => /lib/x86_64-linux-gnu/libLLVM-16.so.1 (0x00007f6c51e73000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6c51c0d000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6c51b2e000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6c5194a000) /lib64/ld-linux-x86-64.so.2 (0x00007f6c5d189000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f6c5193d000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f6c51901000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f6c5020d000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6c501ee000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f6c5012d000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f6c500f8000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f6c4ff46000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6c4ff17000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f6c4ff02000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f6c4fcfd000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f6c4fccd000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f6c4fcbe000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f6c4deea000) /usr/lib/x86_64-linux-gnu/libclang-cpp.so.17: linux-vdso.so.1 (0x00007fff2ebf8000) libLLVM-17.so.1 => /lib/x86_64-linux-gnu/libLLVM-17.so.1 (0x00007f94cd91c000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f94cd6b6000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f94cd5d7000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f94cd3f3000) /lib64/ld-linux-x86-64.so.2 (0x00007f94d8c9c000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f94cd3e6000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f94cd3aa000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f94cbcb6000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f94cbc97000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f94cbbd6000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f94cbba1000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f94cb9ef000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f94cb9c0000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f94cb9ab000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f94cb7a6000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f94cb776000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f94cb767000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f94c9993000) /usr/lib/x86_64-linux-gnu/libclang-cpp.so.18: linux-vdso.so.1 (0x00007fffa12df000) libLLVM.so.18.1 => /lib/x86_64-linux-gnu/libLLVM.so.18.1 (0x00007f117986b000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1179605000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1179526000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1179342000) /lib64/ld-linux-x86-64.so.2 (0x00007f1184e88000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f1179335000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f11792f9000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f1177c05000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1177be6000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f1177b25000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f1177af0000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f117793e000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f117790f000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f11778fa000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f11776f5000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f11776c5000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f11776b6000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f11758e2000) /usr/lib/x86_64-linux-gnu/libclang-cpp.so.18.1: linux-vdso.so.1 (0x00007ffd69c64000) libLLVM.so.18.1 => /lib/x86_64-linux-gnu/libLLVM.so.18.1 (0x00007f9512587000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9512321000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9512242000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f951205e000) /lib64/ld-linux-x86-64.so.2 (0x00007f951dba4000) libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f9512051000) libedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x00007f9512015000) libz3.so.4 => /lib/x86_64-linux-gnu/libz3.so.4 (0x00007f9510921000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f9510902000) libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f9510841000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f951080c000) libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f951065a000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f951062b000) libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f9510616000) libicuuc.so.72 => /lib/x86_64-linux-gnu/libicuuc.so.72 (0x00007f9510411000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f95103e1000) libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f95103d2000) libicudata.so.72 => /lib/x86_64-linux-gnu/libicudata.so.72 (0x00007f950e5fe000)

sten0 commented 1 month ago

I think I found the solution:

https://stackoverflow.com/questions/39292459/how-to-request-the-greatest-version-with-find-package-in-cmake

Sarcasm commented 1 month ago

Nice find, I guess you can specify this on the command line?

cmake -DCMAKE_FIND_PACKAGE_SORT_ORDER NATURAL -DCMAKE_FIND_PACKAGE_SORT_DIRECTION=DEC
sten0 commented 1 month ago

Sorry for the delay; last week got away from me.

Nice find, I guess you can specify this on the command line?

cmake -DCMAKE_FIND_PACKAGE_SORT_ORDER NATURAL -DCMAKE_FIND_PACKAGE_SORT_DIRECTION=DEC

Yes, this produces the expected result :) Can you think of any reason[s] against activating this behaviour by default via CMakeLists.txt? I don't think it does anything without cmake 3.7 (released in 2018).

And maybe mention cmake -DCMAKE_FIND_PACKAGE_SORT_ORDER NATURAL -DCMAKE_FIND_PACKAGE_SORT_DIRECTION=ASC (to prefer oldest version) in the README? No idea why someone would want to, and I'm just trying to resist bias at this point.

I guess for [mis]feature completeness a emacs user-config key could set this, but I don't see the value because an older LLVM/Clang is most likely to be the upstream OS-blessed version, so the user could just uninstall the manually installed (newer) LLVM/Clang to activate the behaviour "prefer oldest version". Conversely, a user who has had to resort to installing to $HOME/bin/clang-$RELEASE will not have the option to uninstall the system-provided LLVM/Clang. This user will always need to hint LLVM/Clang for cmake.

Sarcasm commented 1 month ago

I'm not super confident adding it to irony-mode CMakeLists.txt just now. It would no longer possible to override it for user and I'm not sure why CMake upstream doesn't do it.

Since it can be set externally, that's the approach I would recommand for now. I'm open to reconsider in the future.