On Mon Oct 22, 2018 at 09:42:17PM +0200, Christian Weisgerber wrote:
> The amd64 architecture has now switched to LLVM's lld linker as the
> default ld(1).
>
> Known build failures that still need to be fixed:
>
> productivity/ledger editline/readline.h not found
I'm trying to explain why the diff below is correct and lld fixes OpenBSD
cmake's CheckLibraryExists[1] function.
Please look at the following CMakeLists.txt code example:
cmake_minimum_required(VERSION 2.8.5)
PROJECT(test)
include(CheckLibraryExists)
check_library_exists(edit readline "" HAVE_EDIT)
if (HAVE_EDIT)
message("HAVE_EDIT is found")
else()
message("HAVE_EDIT is NOT found")
endif()
1.) ld.bfd
$ doas ln -f /usr/bin/ld.bfd /usr/bin/ld
$ cmake ../
-- The C compiler identification is Clang 6.0.0
-- The CXX compiler identification is Clang 6.0.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for readline in edit
-- Looking for readline in edit - not found
HAVE_EDIT is NOT found
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rsadowski/cmake_test/build
We see "HAVE_EDIT is NOT found" but it's wrong because readline is in
libedit:
$ objdump -x /usr/obj/lib/libedit/libedit.so.5.2 | grep readline
0000000000000000 l df *ABS* 0000000000000000 readline.c
00000000002341d0 l O .bss 0000000000000001 readline.used_event_hook
0000000000234064 g O .data 0000000000000004 readline_echoing_p
0000000000005660 g F .text 000000000000019a readline
0000000000234020 g O .data 0000000000000008 rl_readline_name
0000000000234018 g O .data 0000000000000004 rl_readline_version
Ok that's a bug in OpenBSD. Let's see with lld:
$ doas ln -f /usr/bin/ld.lld /usr/bin/ld
$ cmake ../
-- The C compiler identification is Clang 6.0.0
-- The CXX compiler identification is Clang 6.0.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for readline in edit
-- Looking for readline in edit - found
HAVE_EDIT is found
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rsadowski/cmake_test/build
HAVE_EDIT is found. Great lld fix that! So back to ledger, after we
found readline in libedit we have "HAVE_EDIT".
Ok let's see in ledger-3.1.1/src/system.hh.in:
170 #if HAVE_EDIT
171 #include <editline/readline.h>
172 #endif
editline/readline.h don't exists in OpenBSD or any port.
I hope I described it well.
Rafael Sadowski
[1]: https://cmake.org/cmake/help/v3.10/module/CheckLibraryExists.html
Index: patches/patch-CMakeLists_txt
===================================================================
RCS file: patches/patch-CMakeLists_txt
diff -N patches/patch-CMakeLists_txt
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-CMakeLists_txt 24 Oct 2018 18:59:36 -0000
@@ -0,0 +1,19 @@
+$OpenBSD$
+
+Unbreak lld.
+check_library_exists() finds function "readline" in libedit and define
HAVE_EDIT.
+According to this, system.hh.in incldues <editline/readline.h>, which does not
+exist in OpenBSD.
+
+Index: CMakeLists.txt
+--- CMakeLists.txt.orig
++++ CMakeLists.txt
+@@ -231,7 +231,7 @@ endmacro(find_req_library_and_header _header_var _head
+ find_req_library_and_header(GMP_PATH gmp.h GMP_LIB gmp)
+ find_req_library_and_header(MPFR_PATH mpfr.h MPFR_LIB mpfr)
+
+-check_library_exists(edit readline "" HAVE_EDIT)
++#check_library_exists(edit readline "" HAVE_EDIT)
+ find_opt_library_and_header(EDIT_PATH histedit.h EDIT_LIB edit HAVE_EDIT)
+
+ #find_package(Gettext) # Used for running tests