Skip to content

Commit 3ad2c93

Browse files
committed
Download dependencies with FetchContent
Added initial functionality for downloading dependencies or using dependency providers: - LibXml2 - libzip - Oniguruma - PNG - SQLite3 - ZLIB FetchContent module takes care of integrating with find_package() calls, downloads the sources at configure phase, or provides further integratation with dependency providers, while ExternalProject module takes care of isolation, when downloading sources without using dependency providers (such as Conan). Added initial Conan configuration.
1 parent f1f866c commit 3ad2c93

File tree

28 files changed

+1047
-131
lines changed

28 files changed

+1047
-131
lines changed

.github/workflows/ci.yaml

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,137 @@ jobs:
137137
- name: Install PHP
138138
run: cmake --install php-build/all-enabled
139139

140+
linux-externalproject-module:
141+
runs-on: ubuntu-latest
142+
name: Downloading dependencies with ExternalProject module on Linux
143+
steps:
144+
- name: Install base dependencies
145+
run: |
146+
sudo apt-get update -y
147+
sudo apt-get -y install \
148+
build-essential \
149+
libssl-dev \
150+
libpcre2-dev \
151+
libbz2-dev \
152+
libcurl4-openssl-dev \
153+
libdb5.3++-dev \
154+
libenchant-2-dev \
155+
libgmp-dev \
156+
libc-client-dev \
157+
libkrb5-dev \
158+
unixodbc-dev \
159+
freetds-dev \
160+
apache2-dev \
161+
firebird-dev \
162+
libsodium-dev \
163+
libicu-dev \
164+
aspell \
165+
libaspell-dev \
166+
libavif-dev \
167+
libfreetype-dev \
168+
libjpeg-dev \
169+
libwebp-dev \
170+
libxpm-dev \
171+
libtidy-dev \
172+
libargon2-dev \
173+
libxslt1-dev \
174+
libcapstone-dev \
175+
libedit-dev \
176+
libcdb-dev \
177+
liblmdb-dev \
178+
libqdbm-dev \
179+
libtokyocabinet-dev \
180+
libsnmp-dev \
181+
snmp \
182+
snmpd \
183+
snmp-mibs-downloader \
184+
libexpat1-dev \
185+
libacl1-dev \
186+
libapparmor-dev \
187+
libselinux1-dev \
188+
libsystemd-dev \
189+
libldap2-dev \
190+
libsasl2-dev \
191+
libpq-dev \
192+
libmm-dev \
193+
libdmalloc-dev \
194+
dovecot-core \
195+
dovecot-pop3d \
196+
dovecot-imapd \
197+
sendmail;
198+
199+
- name: Install CMake
200+
uses: lukka/get-cmake@latest
201+
202+
- name: Checkout
203+
uses: actions/checkout@v4
204+
with:
205+
fetch-depth: 2
206+
207+
- name: Build and install
208+
run: |
209+
cmake --preset all-enabled
210+
cmake --build --preset all-enabled -j
211+
212+
linux-conan:
213+
runs-on: ubuntu-latest
214+
name: Downloading dependencies with Conan on Linux
215+
steps:
216+
- name: Install packages
217+
run: |
218+
sudo apt-get update -y
219+
sudo apt-get -y install \
220+
build-essential \
221+
freetds-dev \
222+
apache2-dev \
223+
firebird-dev \
224+
libc-client-dev \
225+
aspell \
226+
libaspell-dev \
227+
libcdb-dev \
228+
libtokyocabinet-dev \
229+
libsnmp-dev \
230+
libacl1-dev \
231+
libedit-dev \
232+
snmp \
233+
snmpd \
234+
snmp-mibs-downloader \
235+
libapparmor-dev \
236+
libpq-dev \
237+
libmm-dev \
238+
libsystemd-dev \
239+
libwebp-dev \
240+
libxpm-dev \
241+
liblmdb-dev \
242+
libonig-dev \
243+
libldap2-dev \
244+
libtidy-dev \
245+
libdmalloc-dev \
246+
dovecot-core \
247+
dovecot-pop3d \
248+
dovecot-imapd \
249+
sendmail;
250+
251+
- name: Install CMake
252+
uses: lukka/get-cmake@latest
253+
254+
- name: Install Conan
255+
uses: conan-io/setup-conan@v1
256+
257+
- name: Checkout
258+
uses: actions/checkout@v4
259+
with:
260+
fetch-depth: 2
261+
262+
- name: Install dependencies with Conan
263+
run: |
264+
conan install cmake --output-folder=php-build/php --build=missing --profile:build=default --profile:host=default
265+
266+
- name: Build and install
267+
run: |
268+
cmake --preset conan
269+
cmake --build --preset conan -j
270+
140271
windows:
141272
runs-on: windows-latest
142273
name: Windows

cmake/CMakePresets.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"include": [
44
"cmake/presets/all-disabled.json",
55
"cmake/presets/all-enabled.json",
6+
"cmake/presets/conan.json",
67
"cmake/presets/windows.json"
78
],
89
"configurePresets": [

cmake/cmake/Configuration.cmake

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,9 @@ endblock()
199199
# Minimum required version for the OpenSSL dependency.
200200
set(PHP_OPENSSL_MIN_VERSION 1.0.2)
201201

202-
# Minimum required version for the SQLite dependency.
203-
set(PHP_SQLITE_MIN_VERSION 3.7.7)
204-
205202
# Minimum required version for the PostgreSQL dependency.
206203
set(PHP_POSTGRESQL_MIN_VERSION 9.1)
207204

208-
# Minimum required version for the zlib dependency.
209-
set(PHP_ZLIB_MIN_VERSION 1.2.0.4)
210-
211205
# Additional metadata for external packages to avoid duplication.
212206
set_package_properties(
213207
BZip2
@@ -244,20 +238,6 @@ set_package_properties(
244238
DESCRIPTION "PostgreSQL database library"
245239
)
246240

247-
set_package_properties(
248-
SQLite3
249-
PROPERTIES
250-
URL "https://www.sqlite.org/"
251-
DESCRIPTION "SQL database engine library"
252-
)
253-
254-
set_package_properties(
255-
ZLIB
256-
PROPERTIES
257-
URL "https://zlib.net/"
258-
DESCRIPTION "Compression library"
259-
)
260-
261241
# Set base directory for ExternalProject CMake module.
262242
set_directory_properties(
263243
PROPERTIES EP_BASE ${PHP_BINARY_DIR}/CMakeFiles/PHP/ExternalProject
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
#[=============================================================================[
2+
# PHP/Package/LibXml2
3+
4+
Finds or downloads the libxml2 library:
5+
6+
```cmake
7+
include(PHP/Package/LibXml2)
8+
```
9+
10+
This module first tries to find the libxml2 library on the system. If not found
11+
it tries to download it from the upstream source and builds it together
12+
with the PHP build.
13+
14+
See: https://cmake.org/cmake/help/latest/module/FindLibXml2.html
15+
16+
## Examples
17+
18+
Basic usage:
19+
20+
```cmake
21+
# CMakeLists.txt
22+
include(PHP/Package/LibXml2)
23+
target_link_libraries(example PRIVATE LibXml2::LibXml2)
24+
```
25+
#]=============================================================================]
26+
27+
include(ExternalProject)
28+
include(FeatureSummary)
29+
include(FetchContent)
30+
31+
set_package_properties(
32+
LibXml2
33+
PROPERTIES
34+
URL "https://gitlab.gnome.org/GNOME/libxml2"
35+
DESCRIPTION "XML parser and toolkit"
36+
)
37+
38+
# Minimum required version for the libxml2 dependency.
39+
set(PHP_LIBXML2_MIN_VERSION 2.9.0)
40+
41+
# Download version when system dependency is not found.
42+
set(PHP_LIBXML2_DOWNLOAD_VERSION 2.14.5)
43+
44+
macro(php_package_libxml2_find)
45+
if(TARGET LibXml2::LibXml2)
46+
set(LibXml2_FOUND TRUE)
47+
get_property(LibXml2_DOWNLOADED GLOBAL PROPERTY _PHP_LibXml2_DOWNLOADED)
48+
else()
49+
# LibXml2 depends on ZLIB.
50+
include(PHP/Package/ZLIB)
51+
52+
find_package(LibXml2 ${PHP_LIBXML2_MIN_VERSION})
53+
54+
if(NOT LibXml2_FOUND)
55+
_php_package_libxml2_download()
56+
endif()
57+
endif()
58+
endmacro()
59+
60+
macro(_php_package_libxml2_download)
61+
message(STATUS "Downloading LibXml2 ${PHP_LIBXML2_DOWNLOAD_VERSION}")
62+
63+
FetchContent_Declare(
64+
LibXml2
65+
URL https://github.com/GNOME/libxml2/archive/refs/tags/v${PHP_LIBXML2_DOWNLOAD_VERSION}.tar.gz
66+
SOURCE_SUBDIR non-existing
67+
OVERRIDE_FIND_PACKAGE
68+
)
69+
70+
FetchContent_MakeAvailable(LibXml2)
71+
72+
set(options "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>")
73+
list(
74+
APPEND
75+
options
76+
-DLIBXML2_WITH_PYTHON=OFF
77+
-DLIBXML2_WITH_LZMA=OFF
78+
-DBUILD_SHARED_LIBS=OFF
79+
)
80+
81+
if(ZLIB_DOWNLOADED)
82+
ExternalProject_Get_Property(ZLIB INSTALL_DIR)
83+
list(APPEND options "-DZLIB_ROOT=${INSTALL_DIR}")
84+
endif()
85+
86+
# LibXml2 had hardcoded dl library check in versions <= 2.14.5.
87+
# https://gitlab.gnome.org/GNOME/libxml2/-/merge_requests/331
88+
if(
89+
CMAKE_SYSTEM_NAME STREQUAL "Haiku"
90+
AND PHP_LIBXML2_DOWNLOAD_VERSION VERSION_LESS_EQUAL 2.14.5
91+
)
92+
list(APPEND options "-DLIBXML2_WITH_MODULES=OFF")
93+
endif()
94+
95+
ExternalProject_Add(
96+
LibXml2
97+
STEP_TARGETS configure build install
98+
SOURCE_DIR ${libxml2_SOURCE_DIR}
99+
BINARY_DIR ${libxml2_BINARY_DIR}
100+
CMAKE_ARGS ${options}
101+
INSTALL_DIR ${FETCHCONTENT_BASE_DIR}/libxml2-install
102+
INSTALL_BYPRODUCTS <INSTALL_DIR>/lib/libxml2${CMAKE_STATIC_LIBRARY_SUFFIX}
103+
)
104+
105+
add_dependencies(LibXml2-configure ZLIB::ZLIB)
106+
107+
ExternalProject_Get_Property(LibXml2 INSTALL_DIR)
108+
109+
# Bypass missing directory error for the imported target below.
110+
file(MAKE_DIRECTORY ${INSTALL_DIR}/include/libxml2)
111+
112+
add_library(LibXml2::LibXml2 STATIC IMPORTED GLOBAL)
113+
add_dependencies(LibXml2::LibXml2 LibXml2-install)
114+
115+
set_target_properties(
116+
LibXml2::LibXml2
117+
PROPERTIES
118+
INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include/libxml2
119+
IMPORTED_LOCATION ${INSTALL_DIR}/lib/libxml2${CMAKE_STATIC_LIBRARY_SUFFIX}
120+
)
121+
122+
# Move dependency to PACKAGES_FOUND.
123+
block()
124+
set(package "LibXml2")
125+
get_property(packagesNotFound GLOBAL PROPERTY PACKAGES_NOT_FOUND)
126+
list(REMOVE_ITEM packagesNotFound ${package})
127+
set_property(GLOBAL PROPERTY PACKAGES_NOT_FOUND ${packagesNotFound})
128+
get_property(packagesFound GLOBAL PROPERTY PACKAGES_FOUND)
129+
list(FIND packagesFound ${package} found)
130+
if(found EQUAL -1)
131+
set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND ${package})
132+
endif()
133+
endblock()
134+
135+
# Mark package as found.
136+
set(LibXml2_FOUND TRUE)
137+
138+
define_property(
139+
GLOBAL
140+
PROPERTY _PHP_LibXml2_DOWNLOADED
141+
BRIEF_DOCS "Marker that LibXml2 library will be downloaded"
142+
)
143+
144+
set_property(GLOBAL PROPERTY _PHP_LibXml2_DOWNLOADED TRUE)
145+
set(Libxml2_DOWNLOADED TRUE)
146+
endmacro()
147+
148+
php_package_libxml2_find()

0 commit comments

Comments
 (0)