blob: 073869fc0c4ed3b563a5f9a721b76a2b26d6a39d [file] [log] [blame]
Haibo Huang615b24a2021-02-05 01:38:09 -08001cmake_minimum_required(VERSION 3.15)
Haibo Huangcfd91dc2020-07-30 23:01:33 -07002
Elliott Hughes60f5c162021-08-20 17:09:52 -07003file(STRINGS "configure.ac" CONFIGURE_AC_LINES)
4foreach(line ${CONFIGURE_AC_LINES})
5 if(line MATCHES [[^m4_define\(\[(MAJOR_VERSION|MINOR_VERSION|MICRO_VERSION)\],[ \t]*([0-9]+)\)$]])
6 set(LIBXML_${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
7 elseif(line MATCHES "^(LIBXML_MAJOR_VERSION|LIBXML_MINOR_VERSION|LIBXML_MICRO_VERSION)=([0-9]+)$")
8 set(${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
9 endif()
10endforeach()
11set(VERSION "${LIBXML_MAJOR_VERSION}.${LIBXML_MINOR_VERSION}.${LIBXML_MICRO_VERSION}")
12
13project(libxml2 VERSION ${VERSION} LANGUAGES C)
Haibo Huangcfd91dc2020-07-30 23:01:33 -070014
15include(CheckCSourceCompiles)
16include(CheckFunctionExists)
17include(CheckIncludeFiles)
18include(CheckLibraryExists)
19include(CheckStructHasMember)
20include(CheckSymbolExists)
21include(CMakePackageConfigHelpers)
22include(GNUInstallDirs)
23
Haibo Huangcfd91dc2020-07-30 23:01:33 -070024option(BUILD_SHARED_LIBS "Build shared libraries" ON)
25set(LIBXML2_WITH_AUTOMATA ON)
26option(LIBXML2_WITH_C14N "Add the Canonicalization support" ON)
27option(LIBXML2_WITH_CATALOG "Add the Catalog support" ON)
28option(LIBXML2_WITH_DEBUG "Add the debugging module" ON)
29option(LIBXML2_WITH_DOCB "Add Docbook SGML support" ON)
30set(LIBXML2_WITH_EXPR ON)
31option(LIBXML2_WITH_FTP "Add the FTP support" ON)
32option(LIBXML2_WITH_HTML "Add the HTML support" ON)
33option(LIBXML2_WITH_HTTP "Add the HTTP support" ON)
Haibo Huang3496e1e2020-11-30 18:17:15 -080034option(LIBXML2_WITH_ICONV "Add ICONV support" ON)
35option(LIBXML2_WITH_ICU "Add ICU support" OFF)
Haibo Huangcfd91dc2020-07-30 23:01:33 -070036option(LIBXML2_WITH_ISO8859X "Add ISO8859X support if no iconv" ON)
37option(LIBXML2_WITH_LEGACY "Add deprecated APIs for compatibility" ON)
Haibo Huang3496e1e2020-11-30 18:17:15 -080038option(LIBXML2_WITH_LZMA "Use liblzma" ON)
Haibo Huangcfd91dc2020-07-30 23:01:33 -070039option(LIBXML2_WITH_MEM_DEBUG "Add the memory debugging module" OFF)
40option(LIBXML2_WITH_MODULES "Add the dynamic modules support" ON)
41option(LIBXML2_WITH_OUTPUT "Add the serialization support" ON)
42option(LIBXML2_WITH_PATTERN "Add the xmlPattern selection interface" ON)
43option(LIBXML2_WITH_PROGRAMS "Build programs" ON)
44option(LIBXML2_WITH_PUSH "Add the PUSH parser interfaces" ON)
Haibo Huang3496e1e2020-11-30 18:17:15 -080045option(LIBXML2_WITH_PYTHON "Build Python bindings" ON)
Haibo Huangcfd91dc2020-07-30 23:01:33 -070046option(LIBXML2_WITH_READER "Add the xmlReader parsing interface" ON)
47option(LIBXML2_WITH_REGEXPS "Add Regular Expressions support" ON)
48option(LIBXML2_WITH_RUN_DEBUG "Add the runtime debugging module" OFF)
49option(LIBXML2_WITH_SAX1 "Add the older SAX1 interface" ON)
50option(LIBXML2_WITH_SCHEMAS "Add Relax-NG and Schemas support" ON)
51option(LIBXML2_WITH_SCHEMATRON "Add Schematron support" ON)
52option(LIBXML2_WITH_TESTS "Build tests" ON)
Haibo Huang3496e1e2020-11-30 18:17:15 -080053option(LIBXML2_WITH_THREADS "Add multithread support" ON)
Haibo Huangcfd91dc2020-07-30 23:01:33 -070054option(LIBXML2_WITH_THREAD_ALLOC "Add per-thread memory" OFF)
55option(LIBXML2_WITH_TREE "Add the DOM like tree manipulation APIs" ON)
56set(LIBXML2_WITH_TRIO OFF)
57set(LIBXML2_WITH_UNICODE ON)
58option(LIBXML2_WITH_VALID "Add the DTD validation support" ON)
59option(LIBXML2_WITH_WRITER "Add the xmlWriter saving interface" ON)
60option(LIBXML2_WITH_XINCLUDE "Add the XInclude support" ON)
61option(LIBXML2_WITH_XPATH "Add the XPATH support" ON)
62option(LIBXML2_WITH_XPTR "Add the XPointer support" ON)
Haibo Huang3496e1e2020-11-30 18:17:15 -080063option(LIBXML2_WITH_ZLIB "Use libz" ON)
64set(LIBXML2_XMLCONF_WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Working directory for XML Conformance Test Suite")
Haibo Huangcfd91dc2020-07-30 23:01:33 -070065
Haibo Huang3496e1e2020-11-30 18:17:15 -080066if(LIBXML2_WITH_ICONV)
67 find_package(Iconv REQUIRED)
Haibo Huangcfd91dc2020-07-30 23:01:33 -070068endif()
69
Haibo Huang3496e1e2020-11-30 18:17:15 -080070if(LIBXML2_WITH_ICU)
Haibo Huang615b24a2021-02-05 01:38:09 -080071 find_package(ICU REQUIRED COMPONENTS data i18n uc)
Haibo Huang3496e1e2020-11-30 18:17:15 -080072endif()
73
74if(LIBXML2_WITH_LZMA)
75 find_package(LibLZMA REQUIRED)
76endif()
77
78if(LIBXML2_WITH_PYTHON)
79 check_include_files(unistd.h HAVE_UNISTD_H)
80 check_symbol_exists(F_GETFL fcntl.h HAVE_F_GETFL)
81 if(HAVE_UNISTD_H AND HAVE_F_GETFL)
82 find_package(Python COMPONENTS Interpreter Development REQUIRED)
83 else()
84 find_package(Python2 COMPONENTS Interpreter Development REQUIRED)
85 add_library(Python::Python ALIAS Python2::Python)
86 set(Python_EXECUTABLE ${Python2_EXECUTABLE})
87 set(Python_SITEARCH ${Python2_SITEARCH})
88 endif()
89 set(LIBXML2_PYTHON_INSTALL_DIR ${Python_SITEARCH} CACHE PATH "Python bindings install directory")
90endif()
91
92if(LIBXML2_WITH_THREADS)
93 find_package(Threads REQUIRED)
94endif()
95
96if(LIBXML2_WITH_ZLIB)
97 find_package(ZLIB REQUIRED)
98endif()
Haibo Huangcfd91dc2020-07-30 23:01:33 -070099
100foreach(VARIABLE IN ITEMS WITH_AUTOMATA WITH_C14N WITH_CATALOG WITH_DEBUG WITH_DOCB WITH_EXPR WITH_FTP WITH_HTML WITH_HTTP WITH_ICONV WITH_ICU WITH_ISO8859X WITH_LEGACY WITH_LZMA WITH_MEM_DEBUG WITH_MODULES WITH_OUTPUT WITH_PATTERN WITH_PUSH WITH_READER WITH_REGEXPS WITH_RUN_DEBUG WITH_SAX1 WITH_SCHEMAS WITH_SCHEMATRON WITH_THREADS WITH_THREAD_ALLOC WITH_TREE WITH_TRIO WITH_UNICODE WITH_VALID WITH_WRITER WITH_XINCLUDE WITH_XPATH WITH_XPTR WITH_ZLIB)
101 if(LIBXML2_${VARIABLE})
102 set(${VARIABLE} 1)
103 else()
104 set(${VARIABLE} 0)
105 endif()
106endforeach()
107
Haibo Huang735158e2021-02-23 17:48:08 -0800108set(LIBXML_VERSION ${LIBXML_MAJOR_VERSION}0${LIBXML_MINOR_VERSION}0${LIBXML_MICRO_VERSION})
109set(LIBXML_VERSION_STRING "${LIBXML_VERSION}")
110set(LIBXML_VERSION_EXTRA "")
111set(LIBXML_VERSION_NUMBER ${LIBXML_VERSION})
112
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700113set(MODULE_EXTENSION "${CMAKE_SHARED_LIBRARY_SUFFIX}")
114
115set(PACKAGE "libxml2")
116set(PACKAGE_BUGREPORT "xml@gnome.org")
117set(PACKAGE_NAME "libxml2")
118set(PACKAGE_STRING "libxml2 ${VERSION}")
119set(PACKAGE_TARNAME "libxml2")
120set(PACKAGE_URL "http://www.xmlsoft.org/")
121set(PACKAGE_VERSION ${VERSION})
122
123if(LIBLZMA_FOUND)
124 list(APPEND CMAKE_REQUIRED_LIBRARIES LibLZMA::LibLZMA)
125endif()
126
127if(Threads_FOUND)
128 list(APPEND CMAKE_REQUIRED_LIBRARIES Threads::Threads)
129endif()
130
131if(ZLIB_FOUND)
132 list(APPEND CMAKE_REQUIRED_LIBRARIES ZLIB::ZLIB)
133endif()
134
135if(MSVC)
136 configure_file(include/win32config.h config.h COPYONLY)
137else()
138 check_c_source_compiles("
139 void __attribute__((destructor))
140 f(void) {}
141 int main(void) { return 0; }
142 " ATTRIBUTE_DESTRUCTOR)
143 check_c_source_compiles("
144 #include <netdb.h>
145 int main() { (void) gethostbyname((const char*) \"\"); return 0; }
146 " GETHOSTBYNAME_ARG_CAST_CONST)
147 if(NOT GETHOSTBYNAME_ARG_CAST_CONST)
148 set(GETHOSTBYNAME_ARG_CAST "(char *)")
149 else()
150 set(GETHOSTBYNAME_ARG_CAST "/**/")
151 endif()
152 check_include_files(arpa/inet.h HAVE_ARPA_INET_H)
153 check_include_files(arpa/nameser.h HAVE_ARPA_NAMESER_H)
154 check_struct_has_member("struct sockaddr_storage" ss_family "sys/socket.h;sys/types.h" HAVE_SS_FAMILY)
155 check_struct_has_member("struct sockaddr_storage" __ss_family "sys/socket.h;sys/types.h" HAVE_BROKEN_SS_FAMILY)
156 if(HAVE_BROKEN_SS_FAMILY)
157 set(ss_family __ss_family)
158 endif()
159 check_function_exists(class HAVE_CLASS)
160 check_include_files(ctype.h HAVE_CTYPE_H)
161 check_include_files(dirent.h HAVE_DIRENT_H)
162 check_include_files(dlfcn.h HAVE_DLFCN_H)
163 check_library_exists(dl dlopen "" HAVE_DLOPEN)
164 check_include_files(dl.h HAVE_DL_H)
165 check_include_files(errno.h HAVE_ERRNO_H)
166 check_include_files(fcntl.h HAVE_FCNTL_H)
167 check_function_exists(finite HAVE_FINITE)
168 check_include_files(float.h HAVE_FLOAT_H)
169 check_function_exists(fpclass HAVE_FPCLASS)
170 check_function_exists(fprintf HAVE_FPRINTF)
171 check_function_exists(fp_class HAVE_FP_CLASS)
172 check_function_exists(ftime HAVE_FTIME)
173 check_function_exists(getaddrinfo HAVE_GETADDRINFO)
174 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
175 check_include_files(inttypes.h HAVE_INTTYPES_H)
176 check_function_exists(isascii HAVE_ISASCII)
177 check_function_exists(isinf HAVE_ISINF)
178 check_function_exists(isnan HAVE_ISNAN)
179 check_function_exists(isnand HAVE_ISNAND)
180 check_library_exists(history append_history "" HAVE_LIBHISTORY)
181 check_library_exists(lzma lzma_code "" HAVE_LIBLZMA)
182 check_library_exists(pthread pthread_join "" HAVE_LIBPTHREAD)
183 check_library_exists(readline readline "" HAVE_LIBREADLINE)
184 check_library_exists(z gzread "" HAVE_LIBZ)
185 check_include_files(limits.h HAVE_LIMITS_H)
186 check_function_exists(localtime HAVE_LOCALTIME)
187 check_include_files(lzma.h HAVE_LZMA_H)
188 check_include_files(malloc.h HAVE_MALLOC_H)
189 check_include_files(math.h HAVE_MATH_H)
190 check_include_files(memory.h HAVE_MEMORY_H)
191 check_function_exists(mmap HAVE_MMAP)
192 check_function_exists(munmap HAVE_MUNMAP)
193 check_symbol_exists(DIR ndir.h HAVE_NDIR_H)
194 check_include_files(netdb.h HAVE_NETDB_H)
195 check_include_files(netinet/in.h HAVE_NETINET_IN_H)
196 check_include_files(poll.h HAVE_POLL_H)
197 check_function_exists(printf HAVE_PRINTF)
198 check_include_files(pthread.h HAVE_PTHREAD_H)
199 check_function_exists(putenv HAVE_PUTENV)
200 check_function_exists(rand HAVE_RAND)
201 check_function_exists(rand_r HAVE_RAND_R)
202 check_include_files(resolv.h HAVE_RESOLV_H)
203 check_library_exists(dld shl_load "" HAVE_SHLLOAD)
204 check_function_exists(signal HAVE_SIGNAL)
205 check_include_files(signal.h HAVE_SIGNAL_H)
206 check_function_exists(snprintf HAVE_SNPRINTF)
207 check_function_exists(sprintf HAVE_SPRINTF)
208 check_function_exists(srand HAVE_SRAND)
209 check_function_exists(sscanf HAVE_SSCANF)
210 check_function_exists(stat HAVE_STAT)
211 check_include_files(stdarg.h HAVE_STDARG_H)
212 check_include_files(stdint.h HAVE_STDINT_H)
213 check_include_files(stdlib.h HAVE_STDLIB_H)
214 check_function_exists(strftime HAVE_STRFTIME)
215 check_include_files(strings.h HAVE_STRINGS_H)
216 check_include_files(string.h HAVE_STRING_H)
217 check_symbol_exists(DIR sys/dir.h HAVE_SYS_DIR_H)
218 check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
219 check_symbol_exists(DIR sys/ndir.h HAVE_SYS_NDIR_H)
220 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
221 check_include_files(sys/socket.h HAVE_SYS_SOCKET_H)
222 check_include_files(sys/stat.h HAVE_SYS_STAT_H)
223 check_include_files(sys/timeb.h HAVE_SYS_TIMEB_H)
224 check_include_files(sys/time.h HAVE_SYS_TIME_H)
225 check_include_files(sys/types.h HAVE_SYS_TYPES_H)
226 check_function_exists(time HAVE_TIME)
227 check_include_files(time.h HAVE_TIME_H)
228 check_include_files(unistd.h HAVE_UNISTD_H)
229 check_function_exists(va_copy HAVE_VA_COPY)
230 check_function_exists(vfprintf HAVE_VFPRINTF)
231 check_function_exists(vsnprintf HAVE_VSNPRINTF)
232 check_function_exists(vsprintf HAVE_VSPRINTF)
233 check_function_exists(__va_copy HAVE___VA_COPY)
234 check_c_source_compiles("
235 #include <stdlib.h>
236 #include <iconv.h>
237 extern
238 #ifdef __cplusplus
239 \"C\"
240 #endif
241 #if defined(__STDC__) || defined(__cplusplus)
242 size_t iconv(iconv_t cd, char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft);
243 #else
244 size_t iconv();
245 #endif
246 int main() { return 0; }
247 " ICONV_CONST_TEST)
248 if(NOT ICONV_CONST_TEST)
249 set(ICONV_CONST "const")
250 endif()
251 set(LT_OBJDIR ".libs/")
252 check_c_source_compiles("
253 #include <sys/socket.h>
254 #include <sys/types.h>
255 int main() { (void) send(1, (const char*) \"\", 1, 1); return 0; }
256 " SEND_ARG2_CAST_CONST)
257 if(NOT SEND_ARG2_CAST_CONST)
258 set(SEND_ARG2_CAST "(char *)")
259 else()
260 set(SEND_ARG2_CAST "/**/")
261 endif()
262 check_include_files("float.h;stdarg.h;stdlib.h;string.h" STDC_HEADERS)
263 check_c_source_compiles("
264 #include <stdarg.h>
265 void a(va_list* ap) {};
266 int main() { va_list ap1, ap2; a(&ap1); ap2 = (va_list) ap1; return 0; }
267 " VA_LIST_IS_ARRAY_TEST)
268 if(VA_LIST_IS_ARRAY_TEST)
269 set(VA_LIST_IS_ARRAY FALSE)
270 else()
271 set(VA_LIST_IS_ARRAY TRUE)
272 endif()
273 check_c_source_compiles("
274 #include <stddef.h>
275 #include <sys/socket.h>
276 #include <sys/types.h>
277 int main() { (void) getsockopt(1, 1, 1, NULL, (socklen_t*) NULL); return 0; }
278 " XML_SOCKLEN_T_SOCKLEN_T)
279 if(XML_SOCKLEN_T_SOCKLEN_T)
280 set(XML_SOCKLEN_T socklen_t)
281 else()
282 check_c_source_compiles("
283 #include <stddef.h>
284 #include <sys/socket.h>
285 #include <sys/types.h>
286 int main() { (void) getsockopt(1, 1, 1, NULL, (size_t*) NULL); return 0; }
287 " XML_SOCKLEN_T_SIZE_T)
288 if(XML_SOCKLEN_T_SIZE_T)
289 set(XML_SOCKLEN_T size_t)
290 else()
291 check_c_source_compiles("
292 #include <stddef.h>
293 #include <sys/socket.h>
294 #include <sys/types.h>
295 int main() { (void) getsockopt (1, 1, 1, NULL, (int*) NULL); return 0; }
296 " XML_SOCKLEN_T_INT)
297 set(XML_SOCKLEN_T int)
298 endif()
299 endif()
300 configure_file(config.h.cmake.in config.h)
301endif()
302
303set(
304 LIBXML2_HDRS
305 include/libxml/c14n.h
306 include/libxml/catalog.h
307 include/libxml/chvalid.h
308 include/libxml/debugXML.h
309 include/libxml/dict.h
310 include/libxml/DOCBparser.h
311 include/libxml/encoding.h
312 include/libxml/entities.h
313 include/libxml/globals.h
314 include/libxml/hash.h
315 include/libxml/HTMLparser.h
316 include/libxml/HTMLtree.h
317 include/libxml/list.h
318 include/libxml/nanoftp.h
319 include/libxml/nanohttp.h
320 include/libxml/parser.h
321 include/libxml/parserInternals.h
322 include/libxml/pattern.h
323 include/libxml/relaxng.h
324 include/libxml/SAX.h
325 include/libxml/SAX2.h
326 include/libxml/schemasInternals.h
327 include/libxml/schematron.h
328 include/libxml/threads.h
329 include/libxml/tree.h
330 include/libxml/uri.h
331 include/libxml/valid.h
332 include/libxml/xinclude.h
333 include/libxml/xlink.h
334 include/libxml/xmlIO.h
335 include/libxml/xmlautomata.h
336 include/libxml/xmlerror.h
337 include/libxml/xmlexports.h
338 include/libxml/xmlmemory.h
339 include/libxml/xmlmodule.h
340 include/libxml/xmlreader.h
341 include/libxml/xmlregexp.h
342 include/libxml/xmlsave.h
343 include/libxml/xmlschemas.h
344 include/libxml/xmlschemastypes.h
345 include/libxml/xmlstring.h
346 include/libxml/xmlunicode.h
347 include/libxml/xmlwriter.h
348 include/libxml/xpath.h
349 include/libxml/xpathInternals.h
350 include/libxml/xpointer.h
351)
352
353set(
354 LIBXML2_SRCS
355 buf.c
356 c14n.c
357 catalog.c
358 chvalid.c
359 debugXML.c
360 dict.c
361 encoding.c
362 entities.c
363 error.c
364 globals.c
365 hash.c
366 HTMLparser.c
367 HTMLtree.c
368 legacy.c
369 list.c
370 nanoftp.c
371 nanohttp.c
372 parser.c
373 parserInternals.c
374 pattern.c
375 relaxng.c
376 SAX.c
377 SAX2.c
378 schematron.c
379 threads.c
380 tree.c
381 uri.c
382 valid.c
383 xinclude.c
384 xlink.c
385 xmlIO.c
386 xmlmemory.c
387 xmlmodule.c
388 xmlreader.c
389 xmlregexp.c
390 xmlsave.c
391 xmlschemas.c
392 xmlschemastypes.c
393 xmlstring.c
394 xmlunicode.c
395 xmlwriter.c
396 xpath.c
397 xpointer.c
398 xzlib.c
399)
400
401if(WIN32)
402 list(APPEND LIBXML2_SRCS win32/libxml2.rc)
403 file(
404 WRITE
405 ${CMAKE_CURRENT_BINARY_DIR}/rcVersion.h
406 "#define LIBXML_MAJOR_VERSION ${LIBXML_MAJOR_VERSION}\n"
407 "#define LIBXML_MINOR_VERSION ${LIBXML_MINOR_VERSION}\n"
408 "#define LIBXML_MICRO_VERSION ${LIBXML_MICRO_VERSION}\n"
409 "#define LIBXML_DOTTED_VERSION \"${VERSION}\"\n"
410 )
411endif()
412
413if(LIBXML2_WITH_SAX1)
414 list(APPEND LIBXML2_SRCS DOCBparser.c)
415endif()
416
417if(LIBXML2_WITH_TRIO)
418 list(APPEND LIBXML2_SRCS trio.c triostr.c)
419endif()
420
421add_library(LibXml2 ${LIBXML2_HDRS} ${LIBXML2_SRCS})
Elliott Hughes60f5c162021-08-20 17:09:52 -0700422add_library(LibXml2::LibXml2 ALIAS LibXml2)
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700423
Haibo Huang3496e1e2020-11-30 18:17:15 -0800424if(NOT BUILD_SHARED_LIBS)
425 target_compile_definitions(LibXml2 INTERFACE LIBXML_STATIC)
Haibo Huang615b24a2021-02-05 01:38:09 -0800426 set(XML_CFLAGS "-DLIBXML_STATIC")
Haibo Huang3496e1e2020-11-30 18:17:15 -0800427endif()
428
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700429if(LIBXML2_WITH_THREADS)
430 target_compile_definitions(LibXml2 PRIVATE _REENTRANT)
431 if(WIN32)
432 target_compile_definitions(LibXml2 PRIVATE HAVE_WIN32_THREADS)
433 endif()
434endif()
435
436target_include_directories(
437 LibXml2
438 PUBLIC
439 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
440 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
441 $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/libxml2>
442)
443
444if(HAVE_DLOPEN)
445 target_link_libraries(LibXml2 PRIVATE dl)
Haibo Huang615b24a2021-02-05 01:38:09 -0800446 set(MODULE_PLATFORM_LIBS "-ldl")
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700447endif()
448
449if(HAVE_SHLLOAD)
450 target_link_libraries(LibXml2 PRIVATE dld)
Haibo Huang615b24a2021-02-05 01:38:09 -0800451 set(MODULE_PLATFORM_LIBS "-ldld")
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700452endif()
453
454if(UNIX)
455 target_link_libraries(LibXml2 PRIVATE m)
Haibo Huang615b24a2021-02-05 01:38:09 -0800456 set(M_LIBS "-lm")
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700457endif()
458
459if(WIN32)
460 target_link_libraries(LibXml2 PRIVATE ws2_32)
Haibo Huang615b24a2021-02-05 01:38:09 -0800461 set(WIN32_EXTRA_LIBADD "-lws2_32")
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700462endif()
463
464if(LIBXML2_WITH_ICONV)
465 target_link_libraries(LibXml2 PUBLIC Iconv::Iconv)
Haibo Huang615b24a2021-02-05 01:38:09 -0800466 if(NOT Iconv_IS_BUILT_IN)
467 set(ICONV_LIBS "-liconv")
468 endif()
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700469endif()
470
471if(LIBXML2_WITH_ICU)
Haibo Huang615b24a2021-02-05 01:38:09 -0800472 target_link_libraries(LibXml2 PRIVATE ICU::data ICU::i18n ICU::uc)
473 if(WIN32)
474 set(ICU_LIBS "-licudt -licuin -licuuc")
475 else()
476 set(ICU_LIBS "-licudata -licui18n -licuuc")
477 endif()
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700478endif()
479
480if(LIBXML2_WITH_LZMA)
481 target_link_libraries(LibXml2 PRIVATE LibLZMA::LibLZMA)
Haibo Huang615b24a2021-02-05 01:38:09 -0800482 set(LZMA_LIBS "-llzma")
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700483endif()
484
485if(LIBXML2_WITH_THREADS)
486 target_link_libraries(LibXml2 PRIVATE Threads::Threads)
Haibo Huang615b24a2021-02-05 01:38:09 -0800487 set(THREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700488endif()
489
490if(LIBXML2_WITH_ZLIB)
491 target_link_libraries(LibXml2 PRIVATE ZLIB::ZLIB)
Haibo Huang615b24a2021-02-05 01:38:09 -0800492 set(Z_LIBS "-lz")
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700493endif()
494
495set_target_properties(
496 LibXml2
497 PROPERTIES
498 IMPORT_PREFIX lib
499 OUTPUT_NAME xml2
500 POSITION_INDEPENDENT_CODE ON
501 PREFIX lib
Haibo Huang735158e2021-02-23 17:48:08 -0800502 VERSION ${PROJECT_VERSION}
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700503)
504
Elliott Hughes5cefca72021-05-06 13:23:15 -0700505if(MSVC)
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700506 if(BUILD_SHARED_LIBS)
507 set_target_properties(
508 LibXml2
509 PROPERTIES
510 DEBUG_POSTFIX d
511 )
512 else()
513 set_target_properties(
514 LibXml2
515 PROPERTIES
516 DEBUG_POSTFIX sd
517 MINSIZEREL_POSTFIX s
518 RELEASE_POSTFIX s
519 RELWITHDEBINFO_POSTFIX s
520 )
521 endif()
522endif()
523
524install(FILES ${LIBXML2_HDRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development)
525
526install(
527 TARGETS LibXml2
528 EXPORT LibXml2
529 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development
Haibo Huang3496e1e2020-11-30 18:17:15 -0800530 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime NAMELINK_COMPONENT development
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700531 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
532)
533
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700534if(MSVC AND BUILD_SHARED_LIBS)
535 install(FILES $<TARGET_PDB_FILE:LibXml2> DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug)
536endif()
537
538if(LIBXML2_WITH_PROGRAMS)
539 set(
540 PROGRAMS
541 xmlcatalog
542 xmllint
543 )
544 foreach(PROGRAM ${PROGRAMS})
545 add_executable(${PROGRAM} ${PROGRAM}.c)
Elliott Hughes60f5c162021-08-20 17:09:52 -0700546 add_executable(LibXml2::${PROGRAM} ALIAS ${PROGRAM})
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700547 target_link_libraries(${PROGRAM} LibXml2)
548 if(HAVE_LIBHISTORY)
549 target_link_libraries(${PROGRAM} history)
550 endif()
551 if(HAVE_LIBREADLINE)
552 target_link_libraries(${PROGRAM} readline)
553 endif()
Haibo Huangd75f3892021-01-05 21:34:50 -0800554 install(TARGETS ${PROGRAM} EXPORT LibXml2 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT programs)
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700555 endforeach()
556endif()
557
558if(LIBXML2_WITH_TESTS)
559 enable_testing()
560 set(
561 TESTS
562 runxmlconf
563 runsuite
564 testapi
565 testAutomata
566 testC14N
567 testchar
568 testdict
569 testHTML
570 testModule
571 testlimits
572 testReader
573 testrecurse
574 testRegexp
575 testRelax
576 testSAX
577 testSchemas
578 testURI
579 testXPath
580 )
581 foreach(TEST ${TESTS})
582 add_executable(${TEST} ${TEST}.c)
583 target_link_libraries(${TEST} LibXml2)
584 endforeach()
585 if(EXISTS ${LIBXML2_XMLCONF_WORKING_DIR}/xmlconf/xmlconf.xml)
586 add_test(NAME runxmlconf COMMAND runxmlconf WORKING_DIRECTORY ${LIBXML2_XMLCONF_WORKING_DIR})
587 endif()
588 if(NOT WIN32)
589 add_test(NAME testapi COMMAND testapi)
590 endif()
591 add_test(NAME testchar COMMAND testchar)
592 add_test(NAME testdict COMMAND testdict)
593 add_test(NAME testrecurse COMMAND testrecurse WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
594 if(Threads_FOUND)
595 set(
596 TESTS_THREADS
597 runtest
598 testThreads
599 )
600 foreach(TEST ${TESTS_THREADS})
601 add_executable(${TEST} ${TEST}.c)
602 if(WIN32)
603 target_compile_definitions(${TEST} PRIVATE HAVE_WIN32_THREADS)
604 endif()
605 target_link_libraries(${TEST} LibXml2 Threads::Threads)
606 endforeach()
607 add_test(NAME runtest COMMAND runtest --out ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
608 add_test(NAME testThreads COMMAND testThreads WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
609 endif()
610endif()
611
612if(LIBXML2_WITH_PYTHON)
613 execute_process(
614 COMMAND
615 ${Python_EXECUTABLE}
616 ${CMAKE_CURRENT_SOURCE_DIR}/python/generator.py
617 ${CMAKE_CURRENT_SOURCE_DIR}/doc/libxml2-api.xml
618 ${CMAKE_CURRENT_SOURCE_DIR}/python/libxml2-python-api.xml
619 WORKING_DIRECTORY
620 ${CMAKE_CURRENT_BINARY_DIR}
621 )
622 file(READ python/libxml.py LIBXML_PY)
623 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in "${LIBXML_PY}")
624 file(READ ${CMAKE_CURRENT_BINARY_DIR}/libxml2class.py LIBXML2CLASS_PY)
625 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in "${LIBXML2CLASS_PY}")
626 configure_file(${CMAKE_CURRENT_BINARY_DIR}/libxml2.py.in libxml2.py COPYONLY)
627 add_library(
628 LibXml2Mod
629 libxml2-py.c
630 libxml2-py.h
631 python/libxml.c
632 python/libxml_wrap.h
633 python/types.c
634 )
635 target_include_directories(
636 LibXml2Mod
637 PUBLIC
638 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/python>
639 )
640 target_link_libraries(LibXml2Mod LibXml2 Python::Python)
641 set_target_properties(
642 LibXml2Mod
643 PROPERTIES
644 IMPORT_PREFIX lib
645 OUTPUT_NAME xml2mod
646 PREFIX lib
Haibo Huang735158e2021-02-23 17:48:08 -0800647 VERSION ${PROJECT_VERSION}
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700648 )
649 install(
650 TARGETS LibXml2Mod
651 ARCHIVE DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT development
Haibo Huang3496e1e2020-11-30 18:17:15 -0800652 LIBRARY DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime NAMELINK_COMPONENT development
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700653 RUNTIME DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime
654 )
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700655 if(MSVC AND BUILD_SHARED_LIBS)
656 install(FILES $<TARGET_PDB_FILE:LibXml2Mod> DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug)
657 endif()
658 install(FILES python/drv_libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime)
659 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime)
660endif()
661
662install(FILES libxml.3 DESTINATION ${CMAKE_INSTALL_MANDIR}/man3 COMPONENT documentation)
663install(FILES doc/xmlcatalog.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
664install(FILES doc/xmllint.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
665install(DIRECTORY doc/ DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/libxml2 COMPONENT documentation PATTERN Makefile.* EXCLUDE)
666
667configure_package_config_file(
668 libxml2-config.cmake.cmake.in libxml2-config.cmake
Haibo Huang735158e2021-02-23 17:48:08 -0800669 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700670)
671
672install(
673 FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config.cmake
Haibo Huang735158e2021-02-23 17:48:08 -0800674 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700675 COMPONENT development
676)
677
678write_basic_package_version_file(
679 ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake
Haibo Huang735158e2021-02-23 17:48:08 -0800680 VERSION ${PROJECT_VERSION}
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700681 COMPATIBILITY ExactVersion
682)
683
684install(
685 FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake
Haibo Huang735158e2021-02-23 17:48:08 -0800686 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700687 COMPONENT development
688)
689
690install(
691 EXPORT LibXml2
Haibo Huang735158e2021-02-23 17:48:08 -0800692 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2-${PROJECT_VERSION}
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700693 NAMESPACE LibXml2::
694 FILE libxml2-export.cmake
695 COMPONENT development
696)
697
698configure_file(include/libxml/xmlversion.h.in libxml/xmlversion.h)
699install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml/xmlversion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development)
700
701if(MSVC)
702 configure_file(include/libxml/xmlwin32version.h.in libxml/xmlwin32version.h)
703 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml/xmlwin32version.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development)
704endif()
705
706if(LIBXML2_WITH_PYTHON)
707 set(prefix "${CMAKE_INSTALL_PREFIX}")
708 configure_file(python/setup.py.in setup.py @ONLY)
709endif()
710
Haibo Huang615b24a2021-02-05 01:38:09 -0800711set(XML_INCLUDEDIR "-I\${includedir}/libxml2")
712set(XML_LIBDIR "-L\${libdir}")
713set(XML_LIBS "-lxml2")
714set(XML_PRIVATE_LIBS "${Z_LIBS} ${LZMA_LIBS} ${THREAD_LIBS} ${ICONV_LIBS} ${ICU_LIBS} ${M_LIBS}")
715
716file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig" "${CMAKE_INSTALL_PREFIX}")
717string(REGEX REPLACE "/$" "" PACKAGE_RELATIVE_PATH "${PACKAGE_RELATIVE_PATH}")
718
719set(prefix "\${pcfiledir}/${PACKAGE_RELATIVE_PATH}")
720set(exec_prefix "\${prefix}")
721set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
722set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
723configure_file(libxml-2.0.pc.in libxml-2.0.pc @ONLY)
724install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml-2.0.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT development)
725
726set(prefix "\$(cd \"\$(dirname \"\$0\")\"; pwd -P)/..")
727configure_file(xml2-config.in xml2-config @ONLY)
728install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/xml2-config DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT development)
729
730set(XML_INCLUDEDIR "-I${CMAKE_INSTALL_FULL_INCLUDEDIR}/libxml2")
731set(XML_LIBDIR "-L${CMAKE_INSTALL_FULL_LIBDIR}")
732configure_file(xml2Conf.sh.in xml2Conf.sh @ONLY)
733install(FILES ${CMAKE_CURRENT_BINARY_DIR}/xml2Conf.sh DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development)
734
Haibo Huangcfd91dc2020-07-30 23:01:33 -0700735set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime)
736set(CPACK_COMPONENT_PROGRAMS_DEPENDS runtime)
737set(CPACK_DEB_COMPONENT_INSTALL ON)
738set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_DEPENDS "${PACKAGE_TARNAME}")
739set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_NAME "${PACKAGE_TARNAME}-dev")
740set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_SECTION "libdevel")
741set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${PACKAGE_URL})
742set(CPACK_DEBIAN_PACKAGE_NAME ${PACKAGE_TARNAME})
743set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
744set(CPACK_DEBIAN_PROGRAMS_PACKAGE_DEPENDS "${PACKAGE_TARNAME}")
745set(CPACK_DEBIAN_PROGRAMS_PACKAGE_NAME "${PACKAGE_TARNAME}-utils")
746set(CPACK_DEBIAN_PROGRAMS_PACKAGE_SECTION "utils")
747set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME ${PACKAGE_TARNAME})
748set(CPACK_DEBIAN_RUNTIME_PACKAGE_RECOMMENDS "${PACKAGE_TARNAME}-utils")
749set(CPACK_DEBIAN_RUNTIME_PACKAGE_SECTION "libs")
750set(CPACK_NSIS_PACKAGE_NAME ${PACKAGE_STRING})
751set(CPACK_NSIS_URL_INFO_ABOUT ${PACKAGE_URL})
752set(CPACK_PACKAGE_CONTACT ${PACKAGE_BUGREPORT})
753set(CPACK_PACKAGE_DISPLAY_NAME ${PACKAGE_STRING})
754set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PACKAGE_TARNAME}-${PACKAGE_VERSION}")
755set(CPACK_PACKAGE_NAME ${PACKAGE_TARNAME})
756set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
757set(CPACK_PACKAGE_VERSION_MAJOR ${LIBXML_MAJOR_VERSION})
758set(CPACK_PACKAGE_VERSION_MINOR ${LIBXML_MINOR_VERSION})
759set(CPACK_PACKAGE_VERSION_PATCH ${LIBXML_MICRO_VERSION})
760set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/Copyright)
761set(CPACK_RPM_COMPONENT_INSTALL ON)
762set(CPACK_RPM_development_PACKAGE_NAME "${PACKAGE_NAME}-devel")
763set(CPACK_RPM_development_PACKAGE_REQUIRES "${PACKAGE_NAME}")
764set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
765set(CPACK_RPM_PACKAGE_NAME ${PACKAGE_TARNAME})
766set(CPACK_RPM_PACKAGE_URL ${PACKAGE_URL})
767set(CPACK_RPM_programs_PACKAGE_NAME "${PACKAGE_NAME}-utils")
768set(CPACK_RPM_programs_PACKAGE_REQUIRES "${PACKAGE_NAME}")
769set(CPACK_RPM_runtime_PACKAGE_NAME "${PACKAGE_NAME}")
770set(CPACK_RPM_runtime_PACKAGE_SUGGESTS "${PACKAGE_NAME}-utils")
771
772include(CPack)