Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PCBC-859: Update build scripts and instructions for Windows #158

Merged
merged 4 commits into from
Apr 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 55 additions & 29 deletions WINDOWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,19 @@ https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/

Install scoop package manager (https://scoop.sh/):

Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iwr -useb get.scoop.sh | iex

Install tools and dependencies:

scoop install git openssl cmake
winget install Git.Git
winget install Kitware.CMake
winget install NASM.NASM

Clone Couchbase SDK source code (note `--recurse-submodules`):

git clone --recurse-submodules https://github.com/couchbaselabs/couchbase-php-client c:\users\user\couchbase-php-client

NOTE: it is important that path to the extension source will not have spaces, otherwise PHP build
system will not be able to work properly.

Clone PHP interpreter source code (switch to necessary branch):

git clone https://github.com/php/php-src c:\users\user\php-src
Expand All @@ -31,10 +33,10 @@ Clone PHP SDK tools

Open "Visual Studio Installer" application and make sure that "Desktop development with C++" workload is installed.

Navigate to PHP SDK tools and load build environment (we assume Visual Studio 2022, aka VS17 here):
Navigate to PHP SDK tools and load build environment (we assume Visual Studio 2019, aka VS16 here):

cd c:\php-sdk
.\phpsdk-vs17-x64.bat
.\phpsdk-vs16-x64.bat

Inside the shell with build environment, navigate to PHP interpreter sources

Expand All @@ -59,15 +61,13 @@ The aforementioned build process will generate a command-line version of `php.ex
c:\users\user\php-src\x64\Release_TS\php.exe
c:\users\user\php-src\x64\Release_TS\php8ts.dll
c:\users\user\php-src\x64\Release_TS\php_couchbase.dll
c:\users\user\php-src\x64\Release_TS\couchbase_php_wrapper.dll

Lets create another directory and copy these three files so that the following file tree will be in result:

c:\users\user\php-verification\
|- php.exe
|- php8ts.dll
|- php_couchbase.dll
+- couchbase_php_wrapper.dll
+- php_couchbase.dll

Now navigate to verification directory and check that it can load the extension successfully:

Expand Down Expand Up @@ -104,36 +104,62 @@ Display service information, that was recorded during the build:
PS> php -d extension=c:\Users\User\php-verification\php_couchbase.dll -r "print_r(Couchbase\Extension\version());"
Array
(
[extension_revision] => 82377e66c3b8f1d4798cd9860adbd32f00983541
[cxx_client_revision] => ee002352870f1d623d81868b80a5ef70c0acfcee
[cxx_transactions_revision] => ee002352870f1d623d81868b80a5ef70c0acfcee
[asio] => 1.21.0
[build_timestamp] => 2022-04-18 15:12:13
[cc] => MSVC 19.30.30709.0
[extension_revision] => 5d98471f9651e2157a160443990d303a0eb1cbc3
[cxx_client_revision] => 291ed3da17a0a0d68a599dd25306dbb8eb7febac
[_MSC_VER] => 1929
[__cplusplus] => 199711
[asio] => 1.29.0
[boringssl_sha] => 2ff4b968a7e0cfee66d9f151cb95635b43dc1d5b
[build_timestamp] => 2024-04-05 00:34:10
[cc] => MSVC 19.29.30154.0
[cmake_build_type] => RelWithDebInfo
[cmake_version] => 3.23.1
[compile_definitions] => FMT_LOCALE;SPDLOG_COMPILED_LIB;SPDLOG_FMT_EXTERNAL
[compile_features] => cxx_std_17;cxx_variadic_templates
[cmake_version] => 3.29.1
[compile_definitions] => SPDLOG_COMPILED_LIB;SPDLOG_FMT_EXTERNAL;ASIO_STANDALONE;ASIO_NO_DEPRECATED;_WIN32_WINNT=0x0A00;WIN32_LEAN_AND_MEAN
[compile_features] => cxx_std_17;cxx_std_11;cxx_std_17;cxx_std_17
[compile_flags] =>
[compile_options] =>
[compile_options] => /bigobj
[cpu] => AMD64
[cxx] => MSVC 19.30.30709.0
[fmt] => 8.800.1
[http_parser] => 2.9.4
[cxx] => MSVC 19.29.30154.0
[fmt] => 10.2.1
[hdr_histogram_c] => 0.11.8
[link_depends] =>
[link_flags] =>
[link_libraries] => project_options;project_warnings;fmt::fmt;spdlog::spdlog;couchbase_backtrace;couchbase_logger;couchbase_platform;couchbase_io;couchbase_meta;couchbase_crypto;couchbase_sasl;couchbase_topology;couchbase_utils;couchbase_protocol;couchbase_management;couchbase_operations;couchbase_operations_management;couchbase_tracing;couchbase_metrics;OpenSSL::SSL;OpenSSL::Crypto
[link_libraries] => project_options;project_warnings;fmt::fmt;spdlog::spdlog;couchbase_backtrace;couchbase_logger;couchbase_platform;couchbase_meta;couchbase_crypto;couchbase_sasl;couchbase_tracing;couchbase_metrics;Microsoft.GSL::GSL;asio;llhttp::llhttp;taocpp::json;snappy;jsonsl;hdr_histogram_static;iphlpapi;OpenSSL::SSL;OpenSSL::Crypto
[link_options] =>
[openssl_headers] => OpenSSL 3.0.2 15 Mar 2022
[openssl_runtime] => OpenSSL 3.0.2 15 Mar 2022
[platform] => Windows-10.0.22000
[llhttp] => 9.2.0
[mozilla_ca_bundle_date] => Mon Mar 11 15:25:27 2024 GMT
[mozilla_ca_bundle_embedded] => 1
[mozilla_ca_bundle_sha256] => 1794c1d4f7055b7d02c2170337b61b48a2ef6c90d77e95444fd2596f4cac609f
[mozilla_ca_bundle_size] => 147
[openssl_config_dir] => OPENSSLDIR: n/a
[openssl_crypto_interface_imported_location] =>
[openssl_crypto_interface_include_directories] => C:/Users/user/.cache/CPM/boringssl/e31ea00c1ea52052d2d78d44006cc88c80fa24a9/boringssl/src/include
[openssl_crypto_interface_link_libraries] => crypto
[openssl_default_cert_dir] => /etc/ssl/certs
[openssl_default_cert_dir_env] => SSL_CERT_DIR
[openssl_default_cert_file] => /etc/ssl/cert.pem
[openssl_default_cert_file_env] => SSL_CERT_FILE
[openssl_headers] => OpenSSL 1.1.1 (compatible; BoringSSL)
[openssl_pkg_config_interface_include_directories] =>
[openssl_pkg_config_interface_link_libraries] =>
[openssl_runtime] => BoringSSL
[openssl_ssl_imported_location] =>
[openssl_ssl_interface_include_directories] => C:/Users/user/.cache/CPM/boringssl/e31ea00c1ea52052d2d78d44006cc88c80fa24a9/boringssl/src/include
[openssl_ssl_interface_link_libraries] => crypto
[platform] => Windows-10.0.26100
[platform_name] => Windows
[platform_version] => 10.0.26100
[post_linked_openssl] => OFF
[revision] => b5800042a227065cfa8bc4dfc0bcaf04fd859fc7
[snappy] => 1.1.8
[revision] => 291ed3da17a0a0d68a599dd25306dbb8eb7febac
[semver] => 1.0.0-dp.14+8.291ed3d
[snappy] => 1.1.10
[snapshot] =>
[spdlog] => 1.9.2
[spdlog] => 1.13.0
[static_boringssl] => true
[static_openssl] =>
[static_stdlib] =>
[txns_forward_compat_extensions] => TI,MO,BM,QU,SD,BF3787,BF3705,BF3838,RC,UA,CO,BF3791,CM,SI,QC,IX,TS,PU
[txns_forward_compat_protocol_version] => 2.0
[version] => 1.0.0
[version_build] => 0
[version_major] => 1
Expand Down
6 changes: 3 additions & 3 deletions bin/package.rb
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,9 @@ def which(name, extra_locations = [])
"boringssl/*/boringssl/**/CMakeLists.txt",
"boringssl/*/boringssl/LICENSE",
"fmt/*/fmt/CMakeLists.txt",
"fmt/*/fmt/ChangeLog.rst",
"fmt/*/fmt/LICENSE.rst",
"fmt/*/fmt/README.rst",
"fmt/*/fmt/ChangeLog.md",
"fmt/*/fmt/LICENSE.md",
"fmt/*/fmt/README.md",
"fmt/*/fmt/include/**/*",
"fmt/*/fmt/src/**/*",
"fmt/*/fmt/support/cmake/**/*",
Expand Down
56 changes: 37 additions & 19 deletions config.w32
Original file line number Diff line number Diff line change
@@ -1,64 +1,82 @@
// vim:ft=javascript
ARG_ENABLE("couchbase", "weather to enable Couchbase support", "no");
ARG_ENABLE("couchbase", "whether to enable Couchbase support", "no");
if (PHP_COUCHBASE != "no") {
var CMAKE = PATH_PROG("cmake");
// we prefer standalone CMake, as the one that comes with MSVS might be too old
var CMAKE = PATH_PROG("cmake", PROGRAM_FILES + "\\CMake\\bin;" + PROGRAM_FILESx86 + "\\CMake\\bin");
if (!CMAKE) {
ERROR("cmake is required");
ERROR("cmake is required (use 'winget install Kitware.CMake')");
}
var LOCALAPPDATA = WshShell.Environment("Process").Item("LOCALAPPDATA");
var NASM = PATH_PROG("nasm", LOCALAPPDATA + "\\bin\\nasm");
if (!NASM) {
ERROR("nasm is required for BoringSSL (use 'winget install NASM.NASM')");
}
ADD_FLAG("CFLAGS", "/std:c++17");

var COUCHBASE_CMAKE_SOURCE_DIRECTORY = FSO.GetAbsolutePathName(configure_module_dirname + "\\src");
var COUCHBASE_CMAKE_BUILD_DIRECTORY = get_define("BUILD_DIR") + "\\cmake-build";
var COUCHBASE_PHP_CFLAGS = (get_define("CFLAGS_PHP") + " " + get_define("CFLAGS"))
// TODO: we don't seem to need this: get_define("CFLAGS_PHP")
var COUCHBASE_PHP_CFLAGS = get_define("CFLAGS")
.replace('$(BASE_INCLUDES)', '')
.replace(new RegExp('"', 'g'), '\\"')
.replace(new RegExp('\\s+', 'g'), ' ')
.replace(new RegExp('/D ', 'g'), '/D')
.replace(new RegExp('/I ', 'g'), '/I');

STDOUT.WriteLine('MODE_PHPIZE=' + MODE_PHPIZE);
STDOUT.WriteLine('PHP_DIR="' + PHP_DIR + '"');
STDOUT.WriteLine('PHP_SRC_DIR="' + PHP_SRC_DIR + '"');
var php_src_prefix = MODE_PHPIZE ? PHP_DIR + "\\include" : PHP_SRC_DIR;
STDOUT.WriteLine('BUILD_DIR="' + get_define("BUILD_DIR") + '"');
if (MODE_PHPIZE) {
STDOUT.WriteLine('PHP_DIR="' + PHP_DIR + '"');
}
var php_src_prefix = MODE_PHPIZE ? (PHP_DIR + "\\include") : PHP_SRC_DIR;
var COUCHBASE_PHP_INCLUDES =
php_src_prefix + " " +
php_src_prefix + "\\main " +
php_src_prefix + "\\Zend " +
php_src_prefix + "\\TSRM " +
php_src_prefix + "\\ext";
var COUCHBASE_PHP_LIB =
MODE_PHPIZE ? PHP_DIR + "\\lib" : get_define("BUILD_DIR") +
(MODE_PHPIZE ? PHP_DIR + "\\lib" : get_define("BUILD_DIR")) +
"\\" + get_define("PHPLIB");

STDOUT.WriteLine('CMAKE="' + CMAKE + '" # version: ' + probe_binary(CMAKE, "longversion"));
STDOUT.WriteLine('NASM="' + NASM + '" # version: ' + probe_binary(NASM, "version"));
STDOUT.WriteLine('COUCHBASE_CMAKE_SOURCE_DIRECTORY="' + COUCHBASE_CMAKE_SOURCE_DIRECTORY + '"');
STDOUT.WriteLine('COUCHBASE_CMAKE_BUILD_DIRECTORY="' + COUCHBASE_CMAKE_BUILD_DIRECTORY + '"');
STDOUT.WriteLine('COUCHBASE_PHP_CFLAGS="' + COUCHBASE_PHP_CFLAGS + '"');
STDOUT.WriteLine('COUCHBASE_PHP_INCLUDES="' + COUCHBASE_PHP_INCLUDES + '"');
STDOUT.WriteLine('COUCHBASE_PHP_LIB="' + COUCHBASE_PHP_LIB + '"');

DEFINE("LIBS_COUCHBASE", "$(BUILD_DIR)\\couchbase_php_wrapper.lib");
DEFINE("DEPS_COUCHBASE", get_define("LIBS_COUCHBASE"));
EXTENSION("couchbase", "src\\php_couchbase.cxx", true);
// Override build rules. CMake is in charge of the build process.
MFO.WriteLine("$(BUILD_DIR)\\php_couchbase.lib: $(BUILD_DIR)\\php_couchbase.dll");
MFO.WriteLine("$(BUILD_DIR)\\php_couchbase.dll: " + (MODE_PHPIZE ? "" : "$(BUILD_DIR)\\$(PHPDLL)"));
MFO.WriteLine("\t\"" + CMAKE + "\" --build \"" + COUCHBASE_CMAKE_BUILD_DIRECTORY + "\" --verbose");
MFO.WriteLine("php_couchbase.dll: $(BUILD_DIR)\\php_couchbase.dll");
MFO.WriteLine("\t@echo EXT couchbase build complete");

// Create dummy source file to keep PHP build system happy.
dummy_source = FSO.CreateTextFile(configure_module_dirname + "\\dummy.c", true);
dummy_source.WriteLine("extern void dummy() {}");
dummy_source.Close();

MFO.WriteLine("$(BUILD_DIR)\\couchbase_php_wrapper.lib: $(BUILD_DIR)\\$(PHPDLL)");
MFO.WriteLine("\t" + CMAKE + " --build " + COUCHBASE_CMAKE_BUILD_DIRECTORY + " --parallel 4 --verbose");
MFO.WriteLine("couchbase_php_wrapper.lib: $(BUILD_DIR)\\couchbase_php_wrapper.lib");
MFO.WriteLine("\t@echo EXT couchbase wrapper build complete");
EXTENSION("couchbase", "dummy.c", true);

cmake_command =
'cmd /c ' + CMAKE +
' -S ' + COUCHBASE_CMAKE_SOURCE_DIRECTORY +
' -B ' + COUCHBASE_CMAKE_BUILD_DIRECTORY +
' -G ' + '"NMake Makefiles"' +
'cmd /c ""' + CMAKE + '"' +
' -S "' + COUCHBASE_CMAKE_SOURCE_DIRECTORY + '"' +
' -B "' + COUCHBASE_CMAKE_BUILD_DIRECTORY + '"' +
' -G "NMake Makefiles"' +
' -D CMAKE_BUILD_TYPE=RelWithDebInfo' +
' -D CMAKE_ASM_NASM_COMPILER:PATH="' + NASM + '"' +
' -D COUCHBASE_PHP_CFLAGS="' + COUCHBASE_PHP_CFLAGS + '"' +
' -D COUCHBASE_PHP_INCLUDES="' + COUCHBASE_PHP_INCLUDES + '"' +
' -D COUCHBASE_PHP_LIB="' + COUCHBASE_PHP_LIB + '"' +
' -D COUCHBASE_PHP_LIBDIR="' + get_define("BUILD_DIR") + '"' +
' -D COUCHBASE_CXX_CLIENT_BUILD_EXAMPLES=OFF ' +
' -D COUCHBASE_CXX_CLIENT_BUILD_TOOLS=OFF ' +
' -D COUCHBASE_CXX_CLIENT_BUILD_DOCS=OFF ' +
' -D COUCHBASE_CXX_CLIENT_BUILD_TESTS=OFF 2>&1';
' -D COUCHBASE_CXX_CLIENT_BUILD_TESTS=OFF" 2>&1';
STDOUT.WriteLine(cmake_command);
cmake_output = execute(cmake_command);
STDOUT.WriteLine(cmake_output);
Expand Down
11 changes: 10 additions & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
cmake_minimum_required(VERSION 3.19)
cmake_minimum_required(VERSION 3.27)
if(POLICY CMP0149)
# BoringSSL requires at least WindowsSDKVersion=10.0.20348.0
cmake_policy(SET CMP0149 NEW)
endif()

project(couchbase C CXX)

set(CMAKE_CXX_STANDARD 17)
Expand Down Expand Up @@ -75,7 +80,11 @@ set_target_properties(couchbase PROPERTIES PREFIX "")
if(APPLE)
set_target_properties(couchbase PROPERTIES SUFFIX ".so")
endif()
if(MSVC)
set_target_properties(couchbase PROPERTIES PREFIX "php_" IMPORT_PREFIX "php_")
endif()
target_include_directories(couchbase PRIVATE ${PROJECT_BINARY_DIR}/generated)
target_include_directories(couchbase PRIVATE ${PROJECT_SOURCE_DIR}/deps/couchbase-cxx-client)
target_include_directories(couchbase PRIVATE ${PHP_INCLUDE_DIRS})
target_compile_definitions(couchbase PRIVATE ZEND_COMPILE_DL_EXT=1)
set_target_properties(couchbase_cxx_client PROPERTIES C_VISIBILITY_PRESET hidden CXX_VISIBILITY_PRESET hidden)
Expand Down
2 changes: 1 addition & 1 deletion src/deps/couchbase-cxx-client
Loading