php / php/php-src

Use pkg-config on Windows

Đang mở
#16,752 4 bình luận 0 reaction 0 người được giao Xem trên GitHub

@cmb69 đang làm issue này rồi.

Từ ngày 16/11/2024.

  • #16830 của @cmb69 — đang mở
Category: Build System Feature OS: Windows Status: Needs Triage
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

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. 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.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. 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

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.