@ -3,174 +3,116 @@ package("libxml2")
set_description ( " The XML C parser and toolkit of Gnome. " )
set_license ( " MIT " )
add_urls ( " https://download.gnome.org/sources/libxml2/$(version).tar.xz " , { version = function ( version ) return format ( " %d.%d/libxml2-%s " , version : major ( ) , version : minor ( ) , version ) end } )
add_urls ( " https://gitlab.gnome.org/GNOME/libxml2.git " )
add_versions ( " 2.10.3 " , " 5d2cc3d78bec3dbe212a9d7fa629ada25a7da928af432c93060ff5c17ee28a9c " )
add_versions ( " 2.13.2 " , " e7c8f5e0b5542159e0ddc409c22c9164304b581eaa9930653a76fb845b169263 " )
add_urls ( " https://gitlab.gnome.org/GNOME/libxml2/-/archive/$(version)/libxml2-$(version).tar.bz2 " ,
" https://gitlab.gnome.org/GNOME/libxml2.git " ,
" https://github.com/GNOME/libxml2.git " )
add_configs ( " iconv " , { description = " Enable libiconv support. " , default = false , type = " boolean " } )
add_configs ( " python " , { description = " Enable the python interface. " , default = false , type = " boolean " } )
add_versions ( " v2.13.4 " , " ba783b43e8b3475cbd2b1ef40474da6a4465105ee9818d76cd3ac7863550afce " )
add_versions ( " v2.13.2 " , " 5091cf2767c3f7ba08bf59fbe85b01db36ca21abdcb37deea964fcb26a4391fb " )
add_versions ( " v2.12.9 " , " 3cd02671b20954865f5b3e90f192d8cc4d815b2362c2ff9a0b450b41648dac58 " )
add_versions ( " v2.11.9 " , " b9ed243467f82306da608a7a735ed55d90c7aaab0d3c6cf61284c43daa77cfee " )
add_includedirs ( " include/libxml2 " )
if is_plat ( " windows " ) then
includes ( path.join ( os.scriptdir ( ) , " configs.lua " ) )
for name , desc in pairs ( get_libxml2_configs ( ) ) do
add_configs ( name , { description = desc , default = false , type = " boolean " } )
end
add_configs ( " tools " , { description = " Build tools " , default = false , type = " boolean " } )
add_configs ( " all " , { description = " Enable all configs, exclude python " , default = false , type = " boolean " } )
if is_plat ( " windows " , " mingw " ) then
add_syslinks ( " wsock32 " , " ws2_32 " , " bcrypt " )
else
add_links ( " xml2 " )
elseif is_plat ( " linux " , " bsd " ) then
add_sys links ( " m " )
end
if is_plat ( " linux " ) then
add_extsources ( " pkgconfig::libxml-2.0 " , " apt::libxml2-dev " , " pacman::libxml2 " )
add_syslinks ( " m " )
end
on_load ( " windows " , " macosx " , " linux " , " iphoneos " , " android " , " bsd " , function ( package )
if package : is_plat ( " windows " ) then
if not package : config ( " shared " ) then
package : add ( " defines " , " LIBXML_STATIC " )
end
else
if package : gitref ( ) then
package : add ( " deps " , " autoconf " , " automake " , " libtool " , " pkg-config " )
end
add_includedirs ( " include/libxml2 " )
add_deps ( " cmake " )
if on_check then
on_check ( " iphoneos " , function ( package )
raise ( " All version unsupported now. see https://gitlab.gnome.org/GNOME/libxml2/-/issues/774 \n You can use `libxml2 master` branch to build or open a pull request to patch it. " )
end )
end
on_load ( function ( package )
if package : is_plat ( " windows " , " mingw " ) and not package : config ( " shared " ) then
package : add ( " defines " , " LIBXML_STATIC " )
end
if package : config ( " python " ) then
if package : is_cross ( ) then
raise ( " libxml2 python interface does not support cross-compilation " )
end
if not package : config ( " iconv " ) then
raise ( " libxml2 python interface requires iconv to be enabled " )
if package : config ( " all " ) then
for name , _ in pairs ( import ( " configs " ) . get_libxml2_configs ( ) ) do
if name ~= " python " then
package : config_set ( name , true )
end
end
package : add ( " deps " , " python 3.x " )
end
if package : config ( " iconv " ) then
package : add ( " deps " , " libiconv " )
end
end )
on_install ( " windows " , function ( package )
os.cd ( " win32 " )
local args = { " configure.js " , " iso8859x=yes " , " lzma=no " , " zlib=no " , " compiler=msvc " }
table.insert ( args , " cruntime=/ " .. package : config ( " vs_runtime " ) )
table.insert ( args , " debug= " .. ( package : debug ( ) and " yes " or " no " ) )
table.insert ( args , " iconv= " .. ( package : config ( " iconv " ) and " yes " or " no " ) )
table.insert ( args , " python= " .. ( package : config ( " python " ) and " yes " or " no " ) )
table.insert ( args , " prefix= " .. package : installdir ( ) )
if package : config ( " iconv " ) then
table.insert ( args , " include= " .. package : dep ( " libiconv " ) : installdir ( " include " ) )
table.insert ( args , " lib= " .. package : dep ( " libiconv " ) : installdir ( " lib " ) )
end
os.vrunv ( " cscript " , args )
import ( " package.tools.nmake " ) . install ( package , { " /f " , " Makefile.msvc " } )
os.tryrm ( path.join ( package : installdir ( " bin " ) , " run*.exe " ) )
os.tryrm ( path.join ( package : installdir ( " bin " ) , " test*.exe " ) )
os.tryrm ( path.join ( package : installdir ( " lib " ) , " libxml2_a_dll.lib " ) )
if package : config ( " shared " ) then
os.tryrm ( path.join ( package : installdir ( " lib " ) , " libxml2_a.lib " ) )
else
os.tryrm ( path.join ( package : installdir ( " lib " ) , " libxml2.lib " ) )
os.tryrm ( path.join ( package : installdir ( " bin " ) , " libxml2.dll " ) )
if package : config ( " threads " ) and package : is_plat ( " linux " , " bsd " ) then
package : add ( " syslinks " , " pthread " )
end
package : addenv ( " PATH " , package : installdir ( " bin " ) )
if package : config ( " python " ) then
os.cd ( " ../python " )
io.replace ( " libxml_wrap.h " , " XML_IGNORE_PEDANTIC_WARNINGS " , " XML_IGNORE_DEPRECATION_WARNINGS " )
io.replace ( " setup.py " , " [xml_includes] " , " [xml_includes, \" " .. package : dep ( " libiconv " ) : installdir ( " include " ) : gsub ( " \\ " , " \\ \\ " ) .. " \" ] " , { plain = true } )
io.replace ( " setup.py " , " WITHDLLS = 1 " , " WITHDLLS = 0 " , { plain = true } )
if not package : config ( " shared " ) then
io.replace ( " setup.py " , " libdirs = [ " , format ( " libdirs = [ \n '%s', " , package : dep ( " libiconv " ) : installdir ( " lib " ) : gsub ( " \\ " , " \\ \\ " ) ) , { plain = true } )
io.replace ( " setup.py " , " platformLibs = [] " , " platformLibs = ['iconv','wsock32','ws2_32'] " , { plain = true } )
io.replace ( " setup.py " , " \" xml2 \" " , " \" xml2_a \" " , { plain = true } )
io.replace ( " setup.py " , " macros = [] " , " macros = [('LIBXML_STATIC','1')] " , { plain = true } )
else
os.cp ( path.join ( package : installdir ( " bin " ) , " libxml2.dll " ) , path.join ( package : installdir ( " lib " ) , " site-packages " , " libxml2.dll " ) )
end
os.mkdir ( path.join ( package : installdir ( " lib " ) , " site-packages " ) )
os.vrunv ( " python " , { " -m " , " pip " , " install " , " --prefix= " .. package : installdir ( ) , " . " } , { envs = { PYTHONPATH = path.join ( package : installdir ( " lib " ) , " site-packages " ) } } )
package : addenv ( " PYTHONPATH " , path.join ( package : installdir ( " lib " ) , " site-packages " ) )
if package : config ( " tools " ) then
package : config_set ( " programs " , true )
package : addenv ( " PATH " , " bin " )
end
end )
on_install ( " macosx " , " linux " , " iphoneos " , " android@!windows " , " bsd " , function ( package )
if package : is_plat ( " iphoneos " ) then
io.replace ( " dict.c " , " defined(HAVE_GETENTROPY) " , " 0 " , { plain = true } ) -- getentropy is private on iOS
if package : config ( " iconv " ) then
package : add ( " deps " , " libiconv " )
end
import ( " package.tools.autoconf " )
local configs = { " --disable-dependency-tracking " ,
" --without-lzma " ,
" --without-zlib " }
if package : config ( " shared " ) then
table.insert ( configs , " --enable-shared=yes " )
table.insert ( configs , " --enable-static=no " )
else
table.insert ( configs , " --enable-shared=no " )
table.insert ( configs , " --enable-static=yes " )
if package : config ( " icu " ) then
package : add ( " deps " , " icu4c " )
end
if package : config ( " iconv " ) then
local iconvdir
local iconv = package : dep ( " libiconv " ) : fetch ( )
if iconv then
iconvdir = table.wrap ( iconv.sysincludedirs or iconv.includedirs ) [ 1 ]
end
if iconvdir then
table.insert ( configs , " --with-iconv= " .. path.directory ( iconvdir ) )
else
table.insert ( configs , " --with-iconv " )
end
else
table.insert ( configs , " --without-iconv " )
if package : config ( " lzma " ) then
package : add ( " deps " , " xz " )
end
if package : config ( " pic " ) ~= false then
table.insert ( configs , " --with-pic " )
if package : config ( " zlib " ) then
package : add ( " deps " , " zlib " )
end
local envs = autoconf.buildenvs ( package )
if package : config ( " python " ) then
table.insert ( configs , " --with-python " )
table.insert ( configs , " --with-ftp " )
table.insert ( configs , " --with-legacy " )
local python = package : dep ( " python " ) : fetch ( )
if python then
local cflags , ldflags
for _ , includedir in ipairs ( python.sysincludedirs or python.includedirs ) do
cflags = ( cflags or " " ) .. " -I " .. includedir
end
for _ , linkdir in ipairs ( python.linkdirs ) do
ldflags = ( ldflags or " " ) .. " -L " .. linkdir
end
envs.PYTHON_CFLAGS = cflags
envs.PYTHON_LIBS = ldflags
end
else
table.insert ( configs , " --without-python " )
if package : config ( " readline " ) and package : is_plat ( " linux " , " macosx " ) then
package : add ( " deps " , " readline " )
end
autoconf.install ( package , configs , { envs = envs } )
package : addenv ( " PATH " , package : installdir ( " bin " ) )
if package : config ( " python " ) then
os.cd ( " python " )
io.replace ( " setup.py " , " [xml_includes] " , " [xml_includes, \" " .. package : dep ( " libiconv " ) : installdir ( " include " ) .. " \" ] " , { plain = true } )
if not package : config ( " shared " ) then
io.replace ( " setup.py " , " libdirs = [ " , format ( " libdirs = [ \n '%s', " , package : dep ( " libiconv " ) : installdir ( " lib " ) ) , { plain = true } )
io.replace ( " setup.py " , " platformLibs = [ \" m \" , \" z \" ] " , " platformLibs = [ \" iconv \" , \" m \" ] " , { plain = true } )
else
io.replace ( " setup.py " , " platformLibs = [ \" m \" , \" z \" ] " , " platformLibs = [ \" m \" ] " , { plain = true } )
assert ( package : config ( " shared " ) , " package(libxml2) python interface require shared lib " )
if package : is_cross ( ) then
raise ( " libxml2 python interface does not support cross-compilation " )
end
local python = package : dep ( " python " )
local pythonver = nil
if python : is_system ( ) then
pythonver = import ( " core.base.semver " ) . new ( python : fetch ( ) . version )
else
pythonver = python : version ( )
if not package : config ( " iconv " ) then
raise ( " libxml2 python interface requires iconv to be enabled " )
end
os.vrunv ( " python3 " , { " -m " , " pip " , " install " , " --prefix= " .. package : installdir ( ) , " . " } , { envs = { PYTHONPATH = path.join ( package : installdir ( " lib " ) , format ( " python%s.%s " , pythonver : major ( ) , pythonver : minor ( ) ) , " site-packages " ) } } )
package : addenv ( " PYTHONPATH " , path.join ( package : installdir ( " lib " ) , format ( " python%s.%s " , pythonver : major ( ) , pythonver : minor ( ) ) , " site-packages " ) )
package : add ( " deps " , " python 3.x " )
package : addenv ( " PYTHONPATH " , package : installdir ( " python " ) )
end
end )
on_install ( function ( package )
local configs = { " -DLIBXML2_WITH_TESTS=OFF " }
table.insert ( configs , " -DCMAKE_BUILD_TYPE= " .. ( package : is_debug ( ) and " Debug " or " Release " ) )
table.insert ( configs , " -DBUILD_SHARED_LIBS= " .. ( package : config ( " shared " ) and " ON " or " OFF " ) )
for name , _ in pairs ( import ( " configs " ) . get_libxml2_configs ( ) ) do
local enabled = ( package : config ( name ) and " ON " or " OFF " )
table.insert ( configs , format ( " -DLIBXML2_WITH_%s=%s " , name : upper ( ) , enabled ) )
end
local opt = { }
local lzma = package : dep ( " xz " )
if lzma and not lzma : config ( " shared " ) then
opt.cxflags = " -DLZMA_API_STATIC "
end
import ( " package.tools.cmake " ) . install ( package , configs , opt )
end )
on_test ( function ( package )
assert ( package : has_cfuncs ( " xmlInitParser " , { includes = " libxml/parser.h " } ) )
if package : config ( " python " ) then
if package : is_plat ( " windows " ) then
os.vrun ( " python -c \" import libxml2 \" " )
os.vrun ( [[python -c "import libxml2"]] )
else
os.vrun ( " python3 -c \" import libxml2 \" " )
os.vrun ( [[python3 -c "import libxml2"]] )
end
end
assert ( package : has_cfuncs ( " xmlNewNode " , { includes = { " libxml/parser.h " , " libxml/tree.h " } } ) )
end )