dunglas / frankenphp

🧟 The modern PHP app server
https://frankenphp.dev
MIT License
6.96k stars 244 forks source link

Error building Caddy with xcaddy #1156

Closed W3Max closed 1 week ago

W3Max commented 1 week ago

What happened?

I tried to install Caddy with dunglas/frankenphp/caddy as shown here https://frankenphp.dev/docs/compile/#using-xcaddy, but I got this error:

# github.com/dunglas/frankenphp/internal/watcher watcher.c:5:10: fatal error: wtr/watcher-c.h: No such file or directory 5 | #include "wtr/watcher-c.h" | ^~~~~~~~~~~~~~~~~

I previously installed Watcher.

I'm on Debian 12.

Any idea what is missing?

Thanks!

Build Type

Standalone binary

Worker Mode

No

Operating System

GNU/Linux

CPU Architecture

x86_64

PHP configuration

--

Relevant log output

No response

W3Max commented 1 week ago

I tried disabling watcher with the flag nowatcher, but I now get this error:

/root/go/pkg/mod/github.com/dunglas/frankenphp@v1.3.0/cgi.go:3:11: fatal error: php_variables.h: No such file or directory 3 | // #include <php_variables.h> | ^~~~~~~~~~~~~~~~~

How can I add the missing files (php_variables.h, wtr/watcher-c.h) to the build process (with xcaddy)?

Thanks!

dunglas commented 1 week ago

You need to compile and install PHP and Watcher from sources, as explained in the docs. If you did that, can you check that the headers files are in /usr/lib/include (the default)?

W3Max commented 1 week ago

@dunglas Thank you for your quick answer!

Unfortunately, after installing PHP from source, XCADDY still fails.

To answer your question, there is no /usr/lib/include directory automatically created after installing PHP from source. I tried to create it manually and copy the required files but it still does not work.

I guess I’m missing something again... any ideas?

Here is what I have done from a fresh Debian 12 install:

Install requirements

apt update && apt-get upgrade -y
apt install build-essential
apt install lsb-release
apt install re2c
apt install git
apt install curl zip unzip tar
apt install pkg-config
apt install libsqlite3-dev

Install GO from Source

GO_VERSION=1.23.3 && \
wget "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" && \
rm -rf /usr/local/go && tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz" && \
export PATH=$PATH:/usr/local/go/bin && \
source $HOME/.profile && \
go version && \
rm "go${GO_VERSION}.linux-amd64.tar.gz"

Install PHP from source

wget https://www.php.net/distributions/php-8.3.13.tar.gz

tar xf php-8.3.13.tar.gz
cd php-8.3.13

./configure \
    --enable-embed \
    --enable-zts \
    --disable-zend-signals \
    --enable-zend-max-execution-timers
    --without-pdo-sqlite
make -j"$(getconf _NPROCESSORS_ONLN)"
sudo make install

Installing Brotli

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install brotli

Installing watcher-c

curl -L https://github.com/e-dant/watcher/archive/refs/heads/next.tar.gz | tar xz
cd watcher-next/watcher-c
c++ -o libwatcher-c.so ./src/watcher-c.cpp -I ./include -I ../include -std=c++17 -fPIC -shared

Trying to manually copy header files required by dunglas/frankenphp to /usr/lib/include

mkdir /usr/lib/include
cp /usr/local/include/php/main/php_variables.h /usr/lib/include
cp -r /watcher-next/watcher-c/include/wtr /usr/lib/include

Installing xcaddy

sudo apt install -y curl debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-xcaddy-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-xcaddy.list
sudo apt update
sudo apt install xcaddy

Building Caddy with FrankenPHP and other modules

CGO_ENABLED=1 \
XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s' -tags=nobadger,nomysql,nopgx" \
xcaddy build \
    --output frankenphp \
    --with github.com/dunglas/frankenphp/caddy \
   --with github.com/caddy-dns/cloudflare \
    --with github.com/hslatman/caddy-crowdsec-bouncer/crowdsec
    --with github.com/dunglas/mercure/caddy \
    --with github.com/dunglas/vulcain/caddy

Error

watcher.c:5:10: fatal error: wtr/watcher-c.h: No such file or directory
    5 | #include "wtr/watcher-c.h"
      |          ^~~~~~~~~~~~~~~~~
dunglas commented 1 week ago

Sorry I meant /usr/local/include :/

For watcher, you need to use the standard cmake commands to have the headers copied:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
cmake --install build
dunglas commented 1 week ago

There is a bug in the docs, I'm on it.

dunglas commented 1 week ago

Can you try if this fixes your issue? https://github.com/dunglas/frankenphp/pull/1157

W3Max commented 1 week ago

@dunglas Almost there!

Installing watcher-c

git clone https://github.com/e-dant/watcher.git
cd watcher
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
cmake --install build

The build completes but there is still one error at the end:

./frankenphp version
./frankenphp: error while loading shared libraries: libwatcher-c.so.0: cannot open shared object file: No such file or directory
W3Max commented 1 week ago

I found it!

Just had to:

git clone https://github.com/e-dant/watcher.git
cd watcher
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
cmake --install build
cd watcher/build/
cp libwatcher-c.so /usr/local/lib/libwatcher-c.so
ldconfig

And now:

frankenphp version
v2.8.4 h1:q3pe0wpBj1OcHFZ3n/1nl4V4bxBrYoSoab7rL9BMYNk=

Thank you!