bug#81647: libtool 2.6.2: regression on macOS

Bruno Haible via bug-libtool via Bug reports for the GNU libtool shared library maintenance tool <[email protected]>
Newsgroups gmane.comp.gnu.libtool.bugs
Message-ID <2934321.gORTcIGjah@cagnes>
Hi Ileana,

In GNU gettext, I switched from libtool 2.6.0 to libtool 2.6.2.
Since then, builds on macOS
  - where libxml2 is installed in the system,
  - and the configure option '--with-included-libxml' is not specified,
now fail. The problem is that -l options that reference system-installed
libraries now get silently dropped, leading to link errors.

In detail:

In the build log, line 14554, there is a libtool invocation:

/bin/sh ../libtool  --tag=CC   --mode=link cc -std=gnu23 <some-W-options> -g -O2 -release 20260809 ../gnulib-lib/libgettextlib.la  ../../libtextstyle/lib/libtextstyle.la ../../gettext-runtime/intl/libintl.la   -Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices -L/Users/haible/lib -liconv -R/Users/haible/lib -lc -no-undefined    -L/Users/haible/lib -o libgettextsrc.la -rpath /Users/haible/lib <some-.lo-files>

Where ../gnulib-lib/libgettextlib.la has a dependency_libs line

dependency_libs=' -R/Users/haible/lib  -L/Users/haible/lib /Users/haible/STORAGE/gettext-202608xx/build/gettext-runtime/intl/libintl.la -lxml2 /Users/haible/lib/libiconv.la'

and ../../libtextstyle/lib/libtextstyle.la has a dependency_libs line

dependency_libs=' -R/Users/haible/lib  -L/Users/haible/lib /Users/haible/lib/libiconv.la -lncurses'

The next line in the build log looks like this, with libtool 2.6.0:

libtool: link: cc -std=gnu23 -dynamiclib  -o .libs/libgettextsrc-20260809.dylib  <some-.libs/*.o-files> ../gnulib-lib/.libs/libgettextlib.dylib -L/Users/haible/lib /Users/haible/STORAGE/gettext-20260809/build/gettext-runtime/intl/.libs/libintl.dylib -lxml2 ../../libtextstyle/lib/.libs/libtextstyle.dylib -lncurses ../../gettext-runtime/intl/.libs/libintl.dylib /Users/haible/lib/libiconv.dylib -lc  <some-W-options> -g -O2 -Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices -Wl,-dylib_file -Wl,/Users/haible/lib/libintl.8.dylib:/Users/haible/STORAGE/gettext-20260809/build/gettext-runtime/intl/.libs/libintl.dylib   -install_name  /Users/haible/lib/libgettextsrc-20260809.dylib  

and like this, with libtool 2.6.2:

libtool: link: cc -std=gnu23 -dynamiclib  -o .libs/libgettextsrc-20260810.dylib  <some-.libs/*.o-files> ../gnulib-lib/.libs/libgettextlib.dylib -L/Users/haible/lib ../../libtextstyle/lib/.libs/libtextstyle.dylib ../../gettext-runtime/intl/.libs/libintl.dylib /Users/haible/lib/libiconv.dylib -lc  <some-W-options> -g -O2 -Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices -Wl,-dylib_file -Wl,/Users/haible/lib/libintl.8.dylib:/Users/haible/STORAGE/gettext-20260810/build/gettext-runtime/intl/.libs/libintl.dylib   -install_name  /Users/haible/lib/libgettextsrc-20260810.dylib  

Here, the options -lxml2 and -lncurses are no longer present, and the link fails:

Undefined symbols for architecture arm64:
  "_xmlAddChild", referenced from:
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
  "_xmlAddChildList", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlAddNextSibling", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlAllocOutputBuffer", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlCheckVersion", referenced from:
      _locating_rule_list_alloc in libgettextsrc_la-locating-rules.o
  "_xmlCopyNamespace", referenced from:
      _its_rule_list_add_from_doc in libgettextsrc_la-its.o
  "_xmlDocFormatDump", referenced from:
      _its_merge_context_write in libgettextsrc_la-its.o
  "_xmlDocGetRootElement", referenced from:
      _locating_rule_match in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _its_rule_list_add_from_doc in libgettextsrc_la-its.o
      _its_rule_list_extract in libgettextsrc_la-its.o
      _its_merge_context_alloc in libgettextsrc_la-its.o
  "_xmlFreeDoc", referenced from:
      _format_parse in libgettextsrc_la-format-kde-kuit.o
      _format_parse in libgettextsrc_la-format-kde-kuit.o
      _locating_rule_match in libgettextsrc_la-locating-rules.o
      _locating_rule_match in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _OUTLINED_FUNCTION_6 in libgettextsrc_la-locating-rules.o
      _its_rule_list_add_from_file in libgettextsrc_la-its.o
      ...
  "_xmlFreeNs", referenced from:
      _its_rule_destructor in libgettextsrc_la-its.o
  "_xmlFreeTextWriter", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlGetLastError", referenced from:
      _format_parse in libgettextsrc_la-format-kde-kuit.o
      _locating_rule_match.cold.2 in libgettextsrc_la-locating-rules.o
      _its_rule_list_add_from_string.cold.1 in libgettextsrc_la-its.o
      _OUTLINED_FUNCTION_9 in libgettextsrc_la-its.o
  "_xmlGetLineNo", referenced from:
      _its_rule_list_extract in libgettextsrc_la-its.o
  "_xmlGetNsList", referenced from:
      _its_rule_list_add_from_doc in libgettextsrc_la-its.o
  "_xmlGetNsProp", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
      _its_translate_rule_constructor in libgettextsrc_la-its.o
      _its_translate_rule_constructor in libgettextsrc_la-its.o
      _its_translate_rule_eval in libgettextsrc_la-its.o
      _its_localization_note_rule_constructor in libgettextsrc_la-its.o
      _its_localization_note_rule_constructor in libgettextsrc_la-its.o
      _its_localization_note_rule_constructor in libgettextsrc_la-its.o
      _its_localization_note_rule_constructor in libgettextsrc_la-its.o
      ...
  "_xmlGetProp", referenced from:
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      __its_collect_text_content in libgettextsrc_la-its.o
      ...
  "_xmlHasNsProp", referenced from:
      _its_translate_rule_eval in libgettextsrc_la-its.o
      _its_localization_note_rule_eval in libgettextsrc_la-its.o
      _its_localization_note_rule_eval in libgettextsrc_la-its.o
      _its_localization_note_rule_eval in libgettextsrc_la-its.o
      _its_localization_note_rule_eval in libgettextsrc_la-its.o
      _its_localization_note_rule_eval in libgettextsrc_la-its.o
      _its_element_within_text_rule_eval in libgettextsrc_la-its.o
      ...
  "_xmlHasProp", referenced from:
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _its_translate_rule_constructor in libgettextsrc_la-its.o
      _its_translate_rule_constructor in libgettextsrc_la-its.o
      ...
  "_xmlNewDocNodeEatName", referenced from:
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
  "_xmlNewDocTextLen", referenced from:
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
  "_xmlNewNode", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlNewNsProp", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlNewProp", referenced from:
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
  "_xmlNewTextWriter", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlNodeAddContent", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlNodeGetContent", referenced from:
      _its_rule_list_extract in libgettextsrc_la-its.o
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlNodeSetContent", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
      _its_merge_context_merge in libgettextsrc_la-its.o
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlNodeSetContentLen", referenced from:
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
      __its_is_valid_simple_gen_xml in libgettextsrc_la-its.o
  "_xmlOutputBufferGetContent", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlParseInNodeContext", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlReadFd", referenced from:
      _its_rule_list_extract in libgettextsrc_la-its.o
  "_xmlReadFile", referenced from:
      _locating_rule_match in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _its_rule_list_add_from_file in libgettextsrc_la-its.o
      _its_merge_context_alloc in libgettextsrc_la-its.o
  "_xmlReadMemory", referenced from:
      _format_parse in libgettextsrc_la-format-kde-kuit.o
      _its_rule_list_add_from_string in libgettextsrc_la-its.o
  "_xmlSetGenericErrorFunc", referenced from:
      _its_rule_list_add_from_file in libgettextsrc_la-its.o
      _its_rule_list_add_from_file in libgettextsrc_la-its.o
      _its_rule_list_add_from_string in libgettextsrc_la-its.o
      _its_rule_list_add_from_string in libgettextsrc_la-its.o
      _its_rule_list_extract in libgettextsrc_la-its.o
      _its_rule_list_extract in libgettextsrc_la-its.o
      _its_merge_context_merge in libgettextsrc_la-its.o
      _its_merge_context_merge in libgettextsrc_la-its.o
      ...
  "_xmlSetProp", referenced from:
      _its_merge_context_merge in libgettextsrc_la-its.o
  "_xmlSetStructuredErrorFunc", referenced from:
      _its_rule_list_add_from_file in libgettextsrc_la-its.o
      _its_rule_list_add_from_file in libgettextsrc_la-its.o
      _its_rule_list_add_from_string in libgettextsrc_la-its.o
      _its_rule_list_add_from_string in libgettextsrc_la-its.o
      _its_rule_list_extract in libgettextsrc_la-its.o
      _its_rule_list_extract in libgettextsrc_la-its.o
      _its_merge_context_merge in libgettextsrc_la-its.o
      _its_merge_context_merge in libgettextsrc_la-its.o
      ...
  "_xmlStrEqual", referenced from:
      _locating_rule_match in libgettextsrc_la-locating-rules.o
      _locating_rule_match in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _locating_rule_list_add_from_directory in libgettextsrc_la-locating-rules.o
      _its_rule_list_add_from_doc in libgettextsrc_la-its.o
      _its_rule_list_add_from_doc in libgettextsrc_la-its.o
      ...
  "_xmlTextWriterEndElement", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlTextWriterStartElement", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlTextWriterWriteAttribute", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlTextWriterWriteRaw", referenced from:
      __its_collect_text_content in libgettextsrc_la-its.o
  "_xmlXPathEval", referenced from:
      _its_rule_apply in libgettextsrc_la-its.o
  "_xmlXPathEvalExpression", referenced from:
      __its_get_content in libgettextsrc_la-its.o
  "_xmlXPathFreeContext", referenced from:
      _its_rule_apply in libgettextsrc_la-its.o
      __its_get_content in libgettextsrc_la-its.o
      _its_rule_apply.cold.2 in libgettextsrc_la-its.o
      __its_get_content.cold.1 in libgettextsrc_la-its.o
  "_xmlXPathFreeObject", referenced from:
      _its_rule_apply in libgettextsrc_la-its.o
      __its_get_content in libgettextsrc_la-its.o
  "_xmlXPathNewContext", referenced from:
      _its_rule_apply in libgettextsrc_la-its.o
      __its_get_content in libgettextsrc_la-its.o
  "_xmlXPathRegisterNs", referenced from:
      _its_rule_apply in libgettextsrc_la-its.o
      __its_get_content in libgettextsrc_la-its.o
  "_xmlXPathSetContextNode", referenced from:
      __its_get_content in libgettextsrc_la-its.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[5]: *** [libgettextsrc.la] Error 1


How to reproduce:
In https://alpha.gnu.org/gnu/gettext/gettext-20260809.tar.gz you find the source
tarball with libtool 2.6.0.
In https://alpha.gnu.org/gnu/gettext/gettext-20260810.tar.gz you find the source
tarball with libtool 2.6.2.
Compile them on a macOS machine, e.g. cfarm104.cfarm.net.
I have the builds still lying around in
     cfarm104.cfarm.net:~haible/STORAGE/gettext-20260809/build
and  cfarm104.cfarm.net:~haible/STORAGE/gettext-20260810/build

Bruno
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.