PHP 7.3.2 im Terminal
PHP 7.3.2 im Terminal

Bei der Installation von PHP 7.3 mittels Homebrew auf OS X 10.9 Mavericks gibt es ein paar Hürden zu meistern. Da für die meisten Pakete keine Bottles mehr bereitgestellt werden, werden einige Abhänigkeiten benötigt, um PHP manuell zu bauen. Dabei kommt es beim Kompilieren von nghttp2 und von glib zu Problemen, die sich jedoch lösen lassen.

nghttp2

Bei nghttp2 werden einige Funktionen nicht gefunden.

make[3]: *** [util.o] Error 1
./memchunk.h:130:16: error: no member named 'exchange' in namespace 'std'
    len = std::exchange(other.len, 0);
          ~~~~~^
./memchunk.h:336:18: error: no member named 'exchange' in namespace 'std'
        cur{std::exchange(other.cur, nullptr)},
            ~~~~~^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[3]: *** [nghttp.o] Error 1

Wer manuell ./configure ausführt, kann erkennen, dass das Skript Probleme hat, die C++14-Unterstützung für Clang++ zu aktivieren:

checking whether clang++ supports C++14 features with -std=c++14... no
checking whether clang++ supports C++14 features with +std=c++14... no
checking whether clang++ supports C++14 features with -h std=c++14... no
checking whether clang++ supports C++14 features with -std=c++1y... no
checking whether clang++ supports C++14 features with +std=c++1y... no
checking whether clang++ supports C++14 features with -h std=c++1y... no
configure: No compiler with C++14 support was found

Der korrekte Parameter würde -std=c++1y lauten, wird aber nicht angewendet. Daher wird es ohne den Parameter ausgeführt, verwendet nicht die C++14-Unterstützung und kann daher nicht kompilieren.

Der Fehler lässt sich dadurch lösen, die CXXFLAGS-Variable manuell mit dem Parameter zu versehen. Standardmäßig werden hier die Parameter -g und -O2 verwendet, so dass diese auch mit in die Variable aufgenommen werden müssen.
Das kann man entweder über den interaktiven Modus machen oder indem man die Formel bearbeitet.

Formel bearbeiten

Mit brew edit nghttp2 kann man den Code der Formel aufrufen. In der Methode install nach der Zeile ENV.cxx11 eine weitere Zeile mit ENV["CXXFLAGS"] = "-g -O2 -std=c++1y" hinzufügen.



+




  def install
    ENV.cxx11
    ENV["CXXFLAGS"] = "-g -O2 -std=c++1y"

    args = %W[
      --prefix=#{prefix}
      --disable-silent-rules

Interaktiver Modus

brew install -i nghttp2
export CXXFLAGS="-g -O2 -std=c++1y"
./configure --prefix=$HOMEBREW_FORMULA_PREFIX --disable-silent-rules --enable-app --disable-python-bindings --disable-threads --with-xml-prefix=/usr
make
make check
make install
exit

glib

Bei der Installation von glib ist die Abhängigkeit zu gtk-doc vorhanden, welches source-highlight benötigt, welches wiederum boost benötigt. Boost mag jedoch nicht mit Clang kompilieren, sondern benötigt GCC. Allerdings ist die Abhängigkeit zu gtk-doc eigentlich unnötig, so dass man diese einfach aus der Formel entfernen kann.

Dazu ruft man mit brew edit glib den Formelcode von glib auf und löscht entweder die Zeile depends_on "gtk-doc" => :build oder kommentiert die Zeile mit einem # am Anfang der Zeile aus.



-
+



  depends_on "autoconf" => :build
  depends_on "automake" => :build
  depends_on "gtk-doc" => :build
# depends_on "gtk-doc" => :build
  depends_on "libtool" => :build
  depends_on "pkg-config" => :build
  depends_on "gettext"

Update 7. März 2019 (PHP 7.3.2)

Während das Problem mit der glib-Formel bereits gelöst wurde, kommt es nun zu einem anderen Fehler bei nghttp2:

shrpx_client_handler.cc:1166:10: error: no viable conversion from
     'unique_ptr<class shrpx::HttpDownstreamConnection, default_delete<class
     shrpx::HttpDownstreamConnection>>' to 'unique_ptr<class
     shrpx::DownstreamConnection, default_delete<class
     shrpx::DownstreamConnection>>'
  return dconn;
         ^~~~~

Wie im MacPorts Trac beschrieben, ist dies ein Bug in Clang. Praktischerweise kann man gleich den Fix von dort verwenden, indem man ihn vor der install-Methode einfügt. Die oben genannte Anpassung ist auch weiterhin notwendig.

Die Formel sollte mit brew edit nghttp2 folgendermaßen bearbeitet werden, damit der Patch angewendet wird:

+
+
+
+



+




  patch :p0 do
      url "https://raw.githubusercontent.com/macports/macports-ports/54d83cca9fc0f2ed6d3f873282b6dd3198635891/www/nghttp2/files/patch-src-shrpx_client_handler.cc.diff"
      sha256 "9a99a27433ac217159eba9e74e68f3461e6a203d07546ed498ca5a6b28aa500b"
  end

  def install
      ENV.cxx11
      ENV["CXXFLAGS"] = "-g -O2 -std=c++1y"

      args = %W[
        --prefix=#{prefix}
        --disable-silent-rules

Die Formelcodes sind ein Git-Repository und werden dementsprechend auch mit Git aktualisiert. Die Änderungen bleiben also bei Aktualisierungen üblicherweise erhalten.

Wenn man den Formelcode zurücksetzen möchte, kann man dies im Verzeichnis /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula mit Git tun, in dem die Formeln liegen. Mit git status kann man überprüfen, welche Formeln bearbeitet wurden, mit git diff <datei> kann man die Änderungen anzeigen und mit git checkout -- <datei> kann man die Änderungen wieder zurücksetzen.