[MacPorts] #58837: nmap compilation fails

MacPorts noreply at macports.org
Thu Aug 15 07:21:35 UTC 2019

#58837: nmap compilation fails
  Reporter:  lemzwerg  |      Owner:  (none)
      Type:  defect    |     Status:  closed
  Priority:  Normal    |  Milestone:
 Component:  ports     |    Version:
Resolution:  wontfix   |   Keywords:  lion
      Port:  nmap      |

Comment (by kencu):

 Here is the issue:
 :info:build /usr/bin/clang++ -L/opt/local/lib
 -Wl,-headerpad_max_install_names -arch x86_64 -L/opt/local/lib -Lnbase
 -Lnsock/src/   -o nmap charpool.o FingerPrintResults.o FPEngine.o
 FPModel.o idle_scan.o MACLookup.o nmap_dns.o nmap_error.o nmap.o
 nmap_ftp.o NmapOps.o NmapOutputTable.o nmap_tty.o osscan2.o osscan.o
 output.o payload.o portlist.o portreasons.o protocols.o scan_engine.o
 scan_engine_connect.o scan_engine_raw.o scan_lists.o service_scan.o
 services.o NewTargets.o TargetGroup.o Target.o targets.o tcpip.o timing.o
 traceroute.o utils.o xml.o nse_main.o nse_utility.o nse_nsock.o nse_dnet.o
 nse_fs.o nse_nmaplib.o nse_debug.o nse_pcrelib.o nse_lpeg.o nse_openssl.o
 nse_ssl_cert.o nse_libssh2.o nse_zlib.o main.o -lnsock -lnbase -lpcre
 -lpcap libssh2/lib/libssh2.a -lssl -lcrypto -lz libnetutil/libnetutil.a
 ./libdnet-stripped/src/.libs/libdnet.a ./liblua/liblua.a
 ./liblinear/liblinear.a -lm
 :info:build Undefined symbols for architecture x86_64:
 :info:build   "std::__1::basic_string<char, std::__1::char_traits<char>,
 std::__1::allocator<char> >::find_first_of(char const*, unsigned long,
 unsigned long) const", referenced from:
 :info:build       __ZL15filename_to_urlPKc in NmapOps.o

 when `nmap` builds and links, it does not specify a `stdlib` setting on
 the build line. By default, `clang` on systems < 10.9 examines the build
 and link lines for a `-stdlib` setting, and if none is found, `clang`
 defaults to adding `-stdlib=libstdc++`. That causes the build to fail
 because it does not find all the proper symbols that it is looking for, as
 noted by the `std::__1:*` errors.

 The proper fix is to force the `stdlib` onto the build and link lines.
 However, this is a bit of a PITA.

 Another fix is to make `clang` default to adding `-stdlib=libc++` on your
 `libc++` system which is configured that way. This matches the behaviour
 of all the newer systems, 10.9 and newer.

 I changed `clang-5.0` and newer to do exactly that on systems configured
 to used `libc++` in their macports.conf, like yours. It can be seen by the
 default variants for clang-5.0, which, on your system, should be
 `clang-5.0 +analyzer +defaultlibcxx +libstdcxx`.

 The `+defaultlibcxx` variant makes `clang-5.0` add `-stdlib=libc++` if
 none is specified, rather than `-stdlib=libstdc++`, which is what you want
 it to do on your system.

 SHORT story. If your `clang-5.0` is installed correctly, with the
 `+defaultlibcxx` variant on your system, building `nmap` with `clang-5.0`
 should work correctly, ie do this:
 sudo port clean nmap
 sudo port -v install nmap configure.compiler=macports-clang-5.0

 To add the `-stdlib` to the build line instead, you would need to dig in a
 bit to the build. `botan` does a fix for this, with a patch and then a
 # respect MacPorts configure values
 patchfiles-append   patch-compiler_flags.diff \
                     patch-fix-install-with-destdir.diff \
                     patch-python_exe.diff \

 post-patch {
     reinplace -W ${worksrcpath}/src/build-data/cc \
         "s|__MACPORTS_CXX_STDLIB__|${configure.cxx_stdlib}|g" \


 alternatively, sometimes you can just add it to the build line by adding a
 `configure.cxxflags-append` -- caution though, `-stdlib=XYZ` is only
 supported by `clang`, so you have to test to make sure that the build
 compiler is clang if you do this.

Ticket URL: <https://trac.macports.org/ticket/58837#comment:3>
MacPorts <https://www.macports.org/>
Ports system for macOS

More information about the macports-tickets mailing list