Use pkg-config on Windows
- Ngôn ngữ chính
- C
- Star
- 40.4k
- Fork
- 8.2k
- Merge trung bình
- 2 ngày 13 giờ
- Pull request đã merge (30 ngày)
- 96
Mô tả
Description
On POSIX systems, we use pkg-config to configure most (all?) dependency libraries. On Windows, we still look for the headers and libraries "manually" (CHECK_LIB and CHECK_HEADER_ADD_INCLUDE, what is clumsy and likely more constraining than necessary. And maybe worse, it makes it harder to port m4 configurations to w32, or to keep them in sync. It gets especially annoying when we want to check for a certain package version (usually a minimum requirement). Instead I suggest to use pkg-config on Windows, too.
POC
I've put a pkg-config.exe in the PATH, put a suitable zlib.pc in %DEPS%\lib\pkgconfig, and added that to PKG_CONFIG_PATH.
Then I've applied the following patch to php-src:
ext/zlib/config.w32 | 6 +++---
win32/build/confutils.js | 45 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/ext/zlib/config.w32 b/ext/zlib/config.w32
index 3bc24d88e1..623d752e57 100644
--- a/ext/zlib/config.w32
+++ b/ext/zlib/config.w32
@@ -3,9 +3,9 @@
ARG_ENABLE("zlib", "ZLIB support", "yes");
if (PHP_ZLIB == "yes") {
- if (CHECK_LIB("zlib_a.lib;zlib.lib", "zlib", PHP_ZLIB) &&
- CHECK_HEADER_ADD_INCLUDE("zlib.h", "CFLAGS", "..\\zlib;" + php_usual_include_suspects)) {
-
+ if (PKG_CHECK_MODULES("ZLIB", "zlib >= 1.2.11")) {
+ PHP_EVAL_INCLINE(ZLIB_CFLAGS);
+ PHP_EVAL_LIBLINE(ZLIB_LIBS, "zlib");
EXTENSION("zlib", "zlib.c zlib_fopen_wrapper.c zlib_filter.c", PHP_ZLIB_SHARED, "/D ZLIB_EXPORTS /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
AC_DEFINE("HAVE_ZLIB", 1, "Define to 1 if the PHP extension 'zlib' is available.");
diff --git a/win32/build/confutils.js b/win32/build/confutils.js
index 3623dcf7e2..63bd1b867a 100644
--- a/win32/build/confutils.js
+++ b/win32/build/confutils.js
@@ -1054,6 +1054,51 @@ function CHECK_HEADER_ADD_INCLUDE(header_name, flag_name, path_to_check, use_env
return p;
}
+function PKG_CHECK_MODULES(prefix, list_of_modules)
+{
+ var out;
+ STDOUT.Write("checking for " + list_of_modules + "... ");
+ if (!(out = execute("pkg-config --cflags " + list_of_modules))) {
+ STDOUT.WriteLine("no");
+ return false;
+ }
+ eval(prefix + "_CFLAGS = out");
+ if (!(out = execute("pkg-config --libs " + list_of_modules))) {
+ STDOUT.WriteLine("no");
+ return false;
+ }
+ eval(prefix + "_LIBS = out");
+ STDOUT.WriteLine("yes");
+ return true;
+}
+
+function PHP_EVAL_LIBLINE(libline, libs_variable, not_extension)
+{
+ libs_variable = libs_variable.toUpperCase();
+ var args = libline.split(/\s/);
+ for (var i = 0; i < args.length; i++) {
+ var arg = args[i];
+ if (arg.match(/^-l(.*)/)) {
+ ADD_FLAG("LIBS_" + libs_variable, RegExp.$1 + ".lib");
+ } else if (arg.match(/^-L(.*)/)) {
+ var path = condense_path(RegExp.$1);
+ ADD_FLAG("LDFLAGS_" + libs_variable, '/libpath:"' + path + '" ');
+ ADD_FLAG("ARFLAGS_" + libs_variable, '/libpath:"' + path + '" ');
+ }
+ }
+}
+
+function PHP_EVAL_INCLINE(headerline)
+{
+ var args = headerline.split(/\s/);
+ for (var i = 0; i < args.length; i++) {
+ var arg = args[i];
+ if (arg.match(/^-I(.*)/)) {
+ ADD_FLAG("CFLAGS", "/I " + condense_path(RegExp.$1));
+ }
+ }
+}
+
/* XXX check whether some manifest was originally supplied, otherwise keep using the default. */
function generate_version_info_manifest(makefiletarget)
{
If we want to take this route, we should ship pkg-config with https://github.com/php/php-sdk-binary-tools (we can probably use https://github.com/skeeto/u-config). And the winlibs builds would need to actually contain .pc files. I don't think it's viable to rebuilt all php-src dependency winlibs right away, but when updating to new versions, the *.pc files could be added, and then php-src could be adapted to use them.
Thoughts?
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng việc xem xét pull request đang mở #16830, sau đó đọc win32/build/confutils.js và ext/zlib/config.w32, đặc biệt là các entry point PKG_CHECK_MODULES, PHP_EVAL_INCLINE và PHP_EVAL_LIBLINE được đề xuất. Kiểm tra php-sdk-binary-tools và việc đóng gói dependency của winlibs được đề cập trong issue. Công việc được xem là hoàn tất khi build Windows có thể sử dụng pkg-config một cách nhất quán, với các tệp .pc cần thiết cho tool và dependency đã có sẵn.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript
- Lĩnh vực
- build-system, operating-systems
- Loại issue
- Tính năng
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 25/100