Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:116588 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 35260 invoked from network); 8 Dec 2021 14:24:30 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 8 Dec 2021 14:24:30 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 915C6180211 for ; Wed, 8 Dec 2021 07:24:58 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-0.2 required=5.0 tests=BAYES_20,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-ASN: AS15169 209.85.128.0/17 X-Spam-Virus: No X-Envelope-From: Received: from mail-yb1-f182.google.com (mail-yb1-f182.google.com [209.85.219.182]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Wed, 8 Dec 2021 07:24:58 -0800 (PST) Received: by mail-yb1-f182.google.com with SMTP id v64so6779447ybi.5 for ; Wed, 08 Dec 2021 07:24:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=salesforce.com; s=google; h=mime-version:from:date:message-id:subject:to :content-transfer-encoding; bh=e38lgtsvAsKXxgqQ+UHDwdFaf+vVAzIb85DD7ojSc7M=; b=Vt8wOvQYYKuvumwYV4Hr70ye+WKirZxAlHtdJRQP8VuuXBux8q17tWsC4D1Ft3AY/p MvGnL+HKupmKvDELU3EUfmpTdjD5r0M89xsxeScrvd9vhaFB1Y1GUYDYZ4UlDgG0obOO Ho8uXOmaM1CHszWRGfivJeV+ALqXX05QDN3rY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to :content-transfer-encoding; bh=e38lgtsvAsKXxgqQ+UHDwdFaf+vVAzIb85DD7ojSc7M=; b=EEs/XfgYpVNc2w3pRz3OSBJoZ5mdhA72WKElDdBTiCz2FZniYSPsb1tgHNLEzup/gJ LQJL0/K+R46t25vImdVazDeCQNMMIZsZUjixYohXkw+tplRQF5vpWF+jxgyTAesIP5DG 396ua4eYX8sD5Lv8+w6AWuOLq7oUIE3Q28njBR615Ik9fbpHTAUavJXgAKvybKiEbZYi n9J9XK2zUjFwD5VwLkiPgYstaQdQB+RNhtoh7OAunBSxwSOOm0Itw3Ix6f+Wy+dYfYsP vLjT3YAP6X/kyKtWpJqPO7Xaralq8QUvSOxprrnCtEahtmdK8uzRb13MNv7e639V48Ys cTRg== X-Gm-Message-State: AOAM532vwKeLRavrkQYi1zxNgx8T2qCxT/LSyDRpXAB5LuYbjahu06ua hxymm6AIeZO9PPWVaCptaCZ3ifdPT56n7oT9gImTShHVry3Atg== X-Google-Smtp-Source: ABdhPJxc6p+QDSBIMkyXHUZKLatUJx6IAbt/LiUUrmJq3u4/33moi80bpWVZgPPc628lK5D9plPa45vAG4uBLecXhSw= X-Received: by 2002:a25:e406:: with SMTP id b6mr60484115ybh.529.1638977097159; Wed, 08 Dec 2021 07:24:57 -0800 (PST) MIME-Version: 1.0 Reply-To: David Zuelke Date: Wed, 8 Dec 2021 16:24:46 +0100 Message-ID: To: PHP internals Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Subject: Why do PHP 8.1 extensions need PHP headers during make install (worked in <8.1)? From: internals@lists.php.net ("David Zuelke via internals") 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 \ =E2=80=A6 (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'. =E2=80=A6 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.p= hp.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=3D$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