Hi all,

When building shared extensions for PHP for the purpose of packaging
and distributing the builds, the build environment obviously needs PHP
installed in the destination directory structure (for headers, phpize,
and so forth).

But the resulting archive of the built extension should only contain
the shared object, and possibly the headers.

A common pattern to do achieve is:

1) download/extract PHP to $installdir
2) download/extract extension to $builddir
3) phpize in $builddir
4) make in $builddir
5) rm -rf $installdir
6) make install
7) package up $installdir

Step 6 installs the extension into $installdir - you end up with
/foo/bar/lib/php/extensions/no-debug-non-zts-20210902/something.so

That doesn't work with PHP 8.1 anymore - the Makefile generated by
phpize now contains an include directive at the top level (near the
bottom), e.g.:

-include src/php_raphf_api.dep

Which lists not only the extension's headers, but also all of PHP's
(in include/main, include/Zend, and so forth):

src/php_raphf_api.lo: /tmp/bob-2eBC7e/raphf-2.0.1/src/php_raphf_api.c \
 config.h /app/.heroku/php/include/php/main/php.h \
 /app/.heroku/php/include/php/main/php_version.h \
 /app/.heroku/php/include/php/Zend/zend_stream.h \
 /app/.heroku/php/include/php/main/streams/php_stream_context.h \
… (many more from main/ and Zend/ here)
 /app/.heroku/php/include/php/ext/standard/info.h php_raphf.h \
 php_raphf_api.h php_raphf.h

This results in the 'make install' failing if, like in our step 5
above, PHP itself has been (re-)moved since the 'make' (output that
follows is from a 'make -d install'):

      Considering target file 'src/php_raphf_api.lo'.
…
        Considering target file '/app/.heroku/php/include/php/main/php.h'.
         File '/app/.heroku/php/include/php/main/php.h' does not exist.
         Looking for an implicit rule for
'/app/.heroku/php/include/php/main/php.h'.
         Trying pattern rule with stem 'php'.
         Trying implicit prerequisite
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/php.h'.
         Trying pattern rule with stem 'php.h'.
         Trying implicit prerequisite
'/app/.heroku/php/include/php/main/php.h,v'.
         Trying pattern rule with stem 'php.h'.
         Trying implicit prerequisite
'/app/.heroku/php/include/php/main/RCS/php.h,v'.
         Trying pattern rule with stem 'php.h'.
         Trying implicit prerequisite
'/app/.heroku/php/include/php/main/RCS/php.h'.
         Trying pattern rule with stem 'php.h'.
         Trying implicit prerequisite
'/app/.heroku/php/include/php/main/s.php.h'.
         Trying pattern rule with stem 'php.h'.
         Trying implicit prerequisite
'/app/.heroku/php/include/php/main/SCCS/s.php.h'.
         Trying pattern rule with stem 'php'.
         Trying implicit prerequisite
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/php.h'.
         Looking for a rule with intermediate file
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/php.h'.
          Avoiding implicit rule recursion.
          Trying pattern rule with stem 'php.h'.
          Trying implicit prerequisite
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/php.h,v'.
          Trying pattern rule with stem 'php.h'.
          Trying implicit prerequisite
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/RCS/php.h,v'.
          Trying pattern rule with stem 'php.h'.
          Trying implicit prerequisite
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/RCS/php.h'.
          Trying pattern rule with stem 'php.h'.
          Trying implicit prerequisite
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/s.php.h'.
          Trying pattern rule with stem 'php.h'.
          Trying implicit prerequisite
'/app/.heroku/php/include/php/main//tmp/bob-1830jl/raphf-2.0.1/src/SCCS/s.php.h'.
         No implicit rule found for '/app/.heroku/php/include/php/main/php.h'.
         Finished prerequisites of target file
'/app/.heroku/php/include/php/main/php.h'.
        Must remake target '/app/.heroku/php/include/php/main/php.h'.
make: *** No rule to make target
'/app/.heroku/php/include/php/main/php.h', needed by
'src/php_raphf_api.lo'.  Stop.

Building extensions for 8.0 or lower doesn't generate such a
`src/php_EXTNAME_api.dep` file.

Is this intentional? If so, could someone explain the purpose of the
change? I couldn't find anything insightful when browsing the Git
logs.

The workaround is to

make INSTALL_ROOT=$SOMETEMPDIR install

and then move things into place for packaging, but I was still
wondering why this change was made in the first place.

Thanks and greetings,

David

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to