• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1cmake_minimum_required(VERSION 3.15)
2
3project(myxml2 LANGUAGES C)
4#include(CheckCSourceCompiles)
5#include(CheckIncludeFiles)
6#include(CheckStructHasMember)
7#include(CheckFunctionExists)
8#include(CheckLibraryExists)
9#include(CheckSymbolExists)
10
11include(CheckCSourceCompiles)
12include(CheckFunctionExists)
13include(CheckIncludeFiles)
14include(CheckIncludeFile)
15include(CheckLibraryExists)
16include(CheckStructHasMember)
17include(CheckSymbolExists)
18include(CMakePackageConfigHelpers)
19include(GNUInstallDirs)
20
21option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
22set(LIBXML2_WITH_AUTOMATA ON)
23option(LIBXML2_WITH_C14N "Add the Canonicalization support" ON)
24option(LIBXML2_WITH_CATALOG "Add the Catalog support" ON)
25option(LIBXML2_WITH_DEBUG "Add the debugging module" ON)
26option(LIBXML2_WITH_DOCB "Add Docbook SGML support" ON)
27set(LIBXML2_WITH_EXPR ON)
28option(LIBXML2_WITH_FTP "Add the FTP support" ON)
29option(LIBXML2_WITH_HTML "Add the HTML support" ON)
30option(LIBXML2_WITH_HTTP "Add the HTTP support" ON)
31option(LIBXML2_WITH_ICONV "Add ICONV support" OFF)
32option(LIBXML2_WITH_ICU "Add ICU support" OFF)
33option(LIBXML2_WITH_ISO8859X "Add ISO8859X support if no iconv" ON)
34option(LIBXML2_WITH_LEGACY "Add deprecated APIs for compatibility" ON)
35option(LIBXML2_WITH_LZMA "Use liblzma" OFF)
36option(LIBXML2_WITH_MEM_DEBUG "Add the memory debugging module" OFF)
37option(LIBXML2_WITH_MODULES "Add the dynamic modules support" ON)
38option(LIBXML2_WITH_OUTPUT "Add the serialization support" ON)
39option(LIBXML2_WITH_PATTERN "Add the xmlPattern selection interface" ON)
40option(LIBXML2_WITH_PROGRAMS "Build programs" ON)
41option(LIBXML2_WITH_PUSH "Add the PUSH parser interfaces" ON)
42option(LIBXML2_WITH_PYTHON "Build Python bindings" OFF)
43option(LIBXML2_WITH_READER "Add the xmlReader parsing interface" ON)
44option(LIBXML2_WITH_REGEXPS "Add Regular Expressions support" ON)
45option(LIBXML2_WITH_RUN_DEBUG "Add the runtime debugging module" OFF)
46option(LIBXML2_WITH_SAX1 "Add the older SAX1 interface" ON)
47option(LIBXML2_WITH_SCHEMAS "Add Relax-NG and Schemas support" ON)
48option(LIBXML2_WITH_SCHEMATRON "Add Schematron support" ON)
49option(LIBXML2_WITH_THREADS "Add multithread support" ON)
50option(LIBXML2_WITH_THREAD_ALLOC "Add per-thread memory" OFF)
51option(LIBXML2_WITH_TREE "Add the DOM like tree manipulation APIs" ON)
52set(LIBXML2_WITH_TRIO OFF)
53set(LIBXML2_WITH_UNICODE ON)
54option(LIBXML2_WITH_VALID "Add the DTD validation support" ON)
55option(LIBXML2_WITH_WRITER "Add the xmlWriter saving interface" ON)
56option(LIBXML2_WITH_XINCLUDE "Add the XInclude support" ON)
57option(LIBXML2_WITH_XPATH "Add the XPATH support" ON)
58option(LIBXML2_WITH_XPTR "Add the XPointer support" ON)
59option(LIBXML2_WITH_ZLIB "Use libz" OFF)
60
61set(LIBXML_MAJOR_VERSION 2)
62set(LIBXML_MINOR_VERSION 9)
63set(LIBXML_MICRO_VERSION 10)
64
65set(VERSION "${LIBXML_MAJOR_VERSION}.${LIBXML_MINOR_VERSION}.${LIBXML_MICRO_VERSION}")
66set(LIBXML_VERSION ${LIBXML_MAJOR_VERSION}0${LIBXML_MINOR_VERSION}0${LIBXML_MICRO_VERSION})
67set(LIBXML_VERSION_STRING "${LIBXML_VERSION}")
68set(LIBXML_VERSION_EXTRA "")
69set(LIBXML_VERSION_NUMBER ${LIBXML_VERSION})
70
71foreach(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_SAX1 WITH_LEGACY WITH_LZMA WITH_MEM_DEBUG WITH_MODULES WITH_OUTPUT WITH_PATTERN WITH_PUSH WITH_READER WITH_REGEXPS WITH_RUN_DEBUG 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)
72    if (LIBXML2_${VARIABLE})
73        set(${VARIABLE} 1)
74    else()
75        set(${VARIABLE} 0)
76    endif()
77endforeach()
78
79check_c_source_compiles("
80		void __attribute__((destructor))
81		f(void) {}
82		int main(void) { return 0; }
83	" ATTRIBUTE_DESTRUCTOR)
84check_c_source_compiles("
85		#include <netdb.h>
86		int main() { (void) gethostbyname((const char*) \"\"); return 0; }
87	" GETHOSTBYNAME_ARG_CAST_CONST)
88if(NOT GETHOSTBYNAME_ARG_CAST_CONST)
89	set(GETHOSTBYNAME_ARG_CAST "(char *)")
90else()
91	set(GETHOSTBYNAME_ARG_CAST "/**/")
92endif()
93CHECK_INCLUDE_FILE(arpa/inet.h HAVE_ARPA_INET_H)
94check_include_files(arpa/nameser.h HAVE_ARPA_NAMESER_H)
95check_struct_has_member("struct sockaddr_storage" ss_family "sys/socket.h;sys/types.h" HAVE_SS_FAMILY)
96check_struct_has_member("struct sockaddr_storage" __ss_family "sys/socket.h;sys/types.h" HAVE_BROKEN_SS_FAMILY)
97if(HAVE_BROKEN_SS_FAMILY)
98	set(ss_family __ss_family)
99endif()
100check_function_exists(class HAVE_CLASS)
101check_include_files(ctype.h HAVE_CTYPE_H)
102check_include_files(dirent.h HAVE_DIRENT_H)
103check_include_files(dlfcn.h HAVE_DLFCN_H)
104check_library_exists(dl dlopen "" HAVE_DLOPEN)
105check_include_files(dl.h HAVE_DL_H)
106check_include_files(errno.h HAVE_ERRNO_H)
107check_include_files(fcntl.h HAVE_FCNTL_H)
108check_function_exists(finite HAVE_FINITE)
109check_include_files(float.h HAVE_FLOAT_H)
110check_function_exists(fpclass HAVE_FPCLASS)
111check_function_exists(fprintf HAVE_FPRINTF)
112check_function_exists(fp_class HAVE_FP_CLASS)
113check_function_exists(ftime HAVE_FTIME)
114check_function_exists(getaddrinfo HAVE_GETADDRINFO)
115check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
116check_include_files(inttypes.h HAVE_INTTYPES_H)
117check_function_exists(isascii HAVE_ISASCII)
118check_function_exists(isinf HAVE_ISINF)
119check_function_exists(isnan HAVE_ISNAN)
120check_function_exists(isnand HAVE_ISNAND)
121check_library_exists(history append_history "" HAVE_LIBHISTORY)
122check_library_exists(lzma lzma_code "" HAVE_LIBLZMA)
123check_library_exists(pthread pthread_join "" HAVE_LIBPTHREAD)
124check_library_exists(readline readline "" HAVE_LIBREADLINE)
125check_library_exists(z gzread "" HAVE_LIBZ)
126check_include_files(limits.h HAVE_LIMITS_H)
127check_function_exists(localtime HAVE_LOCALTIME)
128check_include_files(lzma.h HAVE_LZMA_H)
129check_include_files(malloc.h HAVE_MALLOC_H)
130check_include_files(math.h HAVE_MATH_H)
131check_include_files(memory.h HAVE_MEMORY_H)
132check_function_exists(mmap HAVE_MMAP)
133check_function_exists(munmap HAVE_MUNMAP)
134check_symbol_exists(DIR ndir.h HAVE_NDIR_H)
135check_include_files(netdb.h HAVE_NETDB_H)
136check_include_files(netinet/in.h HAVE_NETINET_IN_H)
137check_include_files(poll.h HAVE_POLL_H)
138check_function_exists(printf HAVE_PRINTF)
139check_include_files(pthread.h HAVE_PTHREAD_H)
140check_function_exists(putenv HAVE_PUTENV)
141check_function_exists(rand HAVE_RAND)
142check_function_exists(rand_r HAVE_RAND_R)
143check_include_files(resolv.h HAVE_RESOLV_H)
144check_library_exists(dld shl_load "" HAVE_SHLLOAD)
145check_function_exists(signal HAVE_SIGNAL)
146check_include_files(signal.h HAVE_SIGNAL_H)
147check_function_exists(snprintf HAVE_SNPRINTF)
148check_function_exists(sprintf HAVE_SPRINTF)
149check_function_exists(srand HAVE_SRAND)
150check_function_exists(sscanf HAVE_SSCANF)
151check_function_exists(stat HAVE_STAT)
152check_include_files(stdarg.h HAVE_STDARG_H)
153check_include_files(stdint.h HAVE_STDINT_H)
154check_include_files(stdlib.h HAVE_STDLIB_H)
155check_function_exists(strftime HAVE_STRFTIME)
156check_include_files(strings.h HAVE_STRINGS_H)
157check_include_files(string.h HAVE_STRING_H)
158check_symbol_exists(DIR sys/dir.h HAVE_SYS_DIR_H)
159check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
160check_symbol_exists(DIR sys/ndir.h HAVE_SYS_NDIR_H)
161check_include_files(sys/select.h HAVE_SYS_SELECT_H)
162check_include_files(sys/socket.h HAVE_SYS_SOCKET_H)
163check_include_files(sys/stat.h HAVE_SYS_STAT_H)
164check_include_files(sys/timeb.h HAVE_SYS_TIMEB_H)
165check_include_files(sys/time.h HAVE_SYS_TIME_H)
166check_include_files(sys/types.h HAVE_SYS_TYPES_H)
167check_function_exists(time HAVE_TIME)
168check_include_files(time.h HAVE_TIME_H)
169check_include_files(unistd.h HAVE_UNISTD_H)
170check_function_exists(va_copy HAVE_VA_COPY)
171check_function_exists(vfprintf HAVE_VFPRINTF)
172check_function_exists(vsnprintf HAVE_VSNPRINTF)
173check_function_exists(vsprintf HAVE_VSPRINTF)
174check_function_exists(__va_copy HAVE___VA_COPY)
175check_c_source_compiles("
176	#include <stdlib.h>
177	#include <iconv.h>
178	extern
179	#ifdef __cplusplus
180	\"C\"
181	#endif
182	#if defined(__STDC__) || defined(__cplusplus)
183	size_t iconv(iconv_t cd, char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft);
184	#else
185	size_t iconv();
186	#endif
187	int main() { return 0; }
188" ICONV_CONST_TEST)
189if(NOT ICONV_CONST_TEST)
190	set(ICONV_CONST "const")
191endif()
192set(LT_OBJDIR ".libs/")
193check_c_source_compiles("
194	#include <sys/socket.h>
195	#include <sys/types.h>
196	int main() { (void) send(1, (const char*) \"\", 1, 1); return 0; }
197" SEND_ARG2_CAST_CONST)
198if(NOT SEND_ARG2_CAST_CONST)
199	set(SEND_ARG2_CAST "(char *)")
200else()
201	set(SEND_ARG2_CAST "/**/")
202endif()
203check_include_files("float.h;stdarg.h;stdlib.h;string.h" STDC_HEADERS)
204check_c_source_compiles("
205	#include <stdarg.h>
206	void a(va_list* ap) {};
207	int main() { va_list ap1, ap2; a(&ap1); ap2 = (va_list) ap1; return 0; }
208" VA_LIST_IS_ARRAY_TEST)
209if(VA_LIST_IS_ARRAY_TEST)
210	set(VA_LIST_IS_ARRAY FALSE)
211else()
212	set(VA_LIST_IS_ARRAY TRUE)
213endif()
214check_c_source_compiles("
215	#include <stddef.h>
216	#include <sys/socket.h>
217	#include <sys/types.h>
218	int main() { (void) getsockopt(1, 1, 1, NULL, (socklen_t*) NULL); return 0; }
219" XML_SOCKLEN_T_SOCKLEN_T)
220if(XML_SOCKLEN_T_SOCKLEN_T)
221	set(XML_SOCKLEN_T socklen_t)
222else()
223	check_c_source_compiles("
224		#include <stddef.h>
225		#include <sys/socket.h>
226		#include <sys/types.h>
227		int main() { (void) getsockopt(1, 1, 1, NULL, (size_t*) NULL); return 0; }
228	" XML_SOCKLEN_T_SIZE_T)
229	if(XML_SOCKLEN_T_SIZE_T)
230		set(XML_SOCKLEN_T size_t)
231	else()
232		check_c_source_compiles("
233			#include <stddef.h>
234			#include <sys/socket.h>
235			#include <sys/types.h>
236			int main() { (void) getsockopt (1, 1, 1, NULL, (int*) NULL); return 0; }
237		" XML_SOCKLEN_T_INT)
238		set(XML_SOCKLEN_T int)
239	endif()
240endif()
241
242
243file(COPY ${libxml2_dir} DESTINATION ./)
244set(libxml2_original ${CMAKE_CURRENT_BINARY_DIR}/libxml2)
245include_directories(${libxml2_original}/include)
246set(third_party_libxml2 ${CMAKE_CURRENT_BINARY_DIR}/../../../../third_party/libxml2)
247configure_file(${third_party_libxml2}/config.h.cmake.in ${third_party_libxml2}/include/config.h)
248set(libxml2_original_header
249    ${libxml2_original}/include/libxml/c14n.h
250    ${libxml2_original}/include/libxml/catalog.h
251    ${libxml2_original}/include/libxml/chvalid.h
252    ${libxml2_original}/include/libxml/debugXML.h
253    ${libxml2_original}/include/libxml/dict.h
254    ${libxml2_original}/include/libxml/DOCBparser.h
255    ${libxml2_original}/include/libxml/encoding.h
256    ${libxml2_original}/include/libxml/entities.h
257    ${libxml2_original}/include/libxml/globals.h
258    ${libxml2_original}/include/libxml/hash.h
259    ${libxml2_original}/include/libxml/HTMLparser.h
260    ${libxml2_original}/include/libxml/HTMLtree.h
261    ${libxml2_original}/include/libxml/list.h
262    ${libxml2_original}/include/libxml/nanoftp.h
263    ${libxml2_original}/include/libxml/nanohttp.h
264    ${libxml2_original}/include/libxml/parser.h
265    ${libxml2_original}/include/libxml/parserInternals.h
266    ${libxml2_original}/include/libxml/pattern.h
267    ${libxml2_original}/include/libxml/relaxng.h
268    ${libxml2_original}/include/libxml/SAX.h
269    ${libxml2_original}/include/libxml/SAX2.h
270    ${libxml2_original}/include/libxml/schemasInternals.h
271    ${libxml2_original}/include/libxml/schematron.h
272    ${libxml2_original}/include/libxml/threads.h
273    ${libxml2_original}/include/libxml/tree.h
274    ${libxml2_original}/include/libxml/uri.h
275    ${libxml2_original}/include/libxml/valid.h
276    ${libxml2_original}/include/libxml/xinclude.h
277    ${libxml2_original}/include/libxml/xlink.h
278    ${libxml2_original}/include/libxml/xmlIO.h
279    ${libxml2_original}/include/libxml/xmlautomata.h
280    ${libxml2_original}/include/libxml/xmlerror.h
281    ${libxml2_original}/include/libxml/xmlexports.h
282    ${libxml2_original}/include/libxml/xmlmemory.h
283    ${libxml2_original}/include/libxml/xmlmodule.h
284    ${libxml2_original}/include/libxml/xmlreader.h
285    ${libxml2_original}/include/libxml/xmlregexp.h
286    ${libxml2_original}/include/libxml/xmlsave.h
287    ${libxml2_original}/include/libxml/xmlschemas.h
288    ${libxml2_original}/include/libxml/xmlschemastypes.h
289    ${libxml2_original}/include/libxml/xmlstring.h
290    ${libxml2_original}/include/libxml/xmlunicode.h
291    ${libxml2_original}/include/libxml/xmlwriter.h
292    ${libxml2_original}/include/libxml/xpath.h
293    ${libxml2_original}/include/libxml/xpathInternals.h
294    ${libxml2_original}/include/libxml/xpointer.h
295    ${libxml2_original}/include/wsockcompat.h
296)
297
298set(libxml2_original_other_header
299    ${libxml2_original}/buf.h
300    ${libxml2_original}/elfgcchack.h
301    ${libxml2_original}/enc.h
302    ${libxml2_original}/libxml.h
303    ${libxml2_original}/save.h
304    ${libxml2_original}/timsort.h
305)
306
307set(libxml2_original_source
308    ${libxml2_original}/buf.c
309    ${libxml2_original}/c14n.c
310    ${libxml2_original}/catalog.c
311    ${libxml2_original}/chvalid.c
312    ${libxml2_original}/debugXML.c
313    ${libxml2_original}/dict.c
314    ${libxml2_original}/encoding.c
315    ${libxml2_original}/entities.c
316    ${libxml2_original}/error.c
317    ${libxml2_original}/globals.c
318    ${libxml2_original}/hash.c
319    ${libxml2_original}/HTMLparser.c
320    ${libxml2_original}/HTMLtree.c
321    ${libxml2_original}/legacy.c
322    ${libxml2_original}/list.c
323    ${libxml2_original}/nanoftp.c
324    ${libxml2_original}/nanohttp.c
325    ${libxml2_original}/parser.c
326    ${libxml2_original}/parserInternals.c
327    ${libxml2_original}/pattern.c
328    ${libxml2_original}/relaxng.c
329    ${libxml2_original}/SAX.c
330    ${libxml2_original}/SAX2.c
331    ${libxml2_original}/schematron.c
332    ${libxml2_original}/threads.c
333    ${libxml2_original}/tree.c
334    ${libxml2_original}/uri.c
335    ${libxml2_original}/valid.c
336    ${libxml2_original}/xinclude.c
337    ${libxml2_original}/xlink.c
338    ${libxml2_original}/xmlIO.c
339    ${libxml2_original}/xmlmemory.c
340    ${libxml2_original}/xmlmodule.c
341    ${libxml2_original}/xmlreader.c
342    ${libxml2_original}/xmlregexp.c
343    ${libxml2_original}/xmlsave.c
344    ${libxml2_original}/xmlschemas.c
345    ${libxml2_original}/xmlschemastypes.c
346    ${libxml2_original}/xmlstring.c
347    ${libxml2_original}/xmlunicode.c
348    ${libxml2_original}/xmlwriter.c
349    ${libxml2_original}/xpath.c
350    ${libxml2_original}/xpointer.c
351    ${libxml2_original}/xzlib.c
352)
353
354#set(CMAKE_THREAD_LIBS_INIT "-lpthread")
355#message("pthread " ${CMAKE_THREAD_LIBS_INIT})
356find_package(Threads REQUIRED)
357add_library(myxml2 STATIC ${libxml2_original_header} ${libxml2_original_other_header} ${libxml2_original_source})
358target_link_libraries(myxml2 PRIVATE Threads::Threads)
359
360if(WIN32)
361	target_link_libraries(myxml2 PRIVATE ws2_32)
362	set(WIN32_EXTRA_LIBADD "-lws2_32")
363endif()
364configure_file(${libxml2_original}/include/libxml/xmlversion.h.in ${libxml2_original}/include/libxml/xmlversion.h)
365
366file(COPY ${libxml2_original_header} DESTINATION ./include/libxml)
367file(COPY ${libxml2_original}/include/libxml/xmlversion.h DESTINATION ./include/libxml)