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)