package("libnfc") set_homepage("https://github.com/nfc-tools/libnfc") set_description("Header-only binary fuse and xor filter library.") set_license("LGPL-3.0") add_urls("https://github.com/nfc-tools/libnfc/archive/refs/tags/libnfc-$(version).tar.gz", {alias = "tarball"}) add_urls("https://github.com/nfc-tools/libnfc.git", {alias = "git"}) add_versions("tarball:1.8.0", "0ab7d9b41442e7edc2af7c54630396edc73ce51128aa28a5c6e4135dc5595495") add_versions("tarball:1.7.1", "30de35b4f1af3f57dab40d91ffb2275664a35859ff2b014ba7b226aa3f5465f5") add_versions("git:1.8.0", "libnfc-1.8.0") add_versions("git:1.7.1", "libnfc-1.7.1") add_configs("shared", {description = "Build shared library.", default = false, type = "boolean", readonly = true}) add_configs("logging", {description = "Enable log facility. (errors, warning, info and debug messages)", default = true, type = "boolean"}) add_configs("envvars", {description = "Enable envvars facility.", default = true, type = "boolean"}) add_configs("configurable", {description = "Enable configuration files.", default = true, type = "boolean"}) -- drivers add_configs("pcsc", {description = "Enable PC/SC reader support (Depends on PC/SC)", default = false, type = "boolean"}) add_configs("acr122_pcsc", {description = "Enable ACR122 support (Depends on PC/SC)", default = false, type = "boolean"}) add_configs("acr122_usb", {description = "Enable ACR122 support (Direct USB connection)", default = true, type = "boolean"}) add_configs("acr122s", {description = "Enable ACR122S support (Use serial port)", default = true, type = "boolean"}) add_configs("arygon", {description = "Enable ARYGON support (Use serial port)", default = true, type = "boolean"}) add_configs("pn532_i2c", {description = "Enable PN532 I2C support (Use I2C bus)", default = is_plat("linux"), type = "boolean"}) add_configs("pn532_spi", {description = "Enable PN532 SPI support (Use SPI bus)", default = is_plat("linux"), type = "boolean"}) add_configs("pn532_uart", {description = "Enable PN532 UART support (Use serial port)", default = true, type = "boolean"}) add_configs("pn53x_usb", {description = "Enable PN531 and PN531 USB support (Depends on libusb)", default = true, type = "boolean"}) if not is_plat("bsd") then if not is_plat("windows", "mingw", "msys", "cygwin") then add_deps("libusb-compat") else add_deps("libusb-win32") add_syslinks("wsock32") end end add_deps("cmake") if not is_subhost("windows") then add_deps("pkg-config") else add_deps("pkgconf") end on_check("!linux", function (package) assert(not package:config("pn532_i2c") and not package:config("pn532_spi"), "package(libnfc): I2C/SPI is only (yet) supported in Linux!") end) on_load(function (package) if package:config("pcsc") or package:config("acr122_pcsc") then if package:is_plat("linux", "bsd") then package:add("deps", "libpcsclite") end end if package:version():le("1.7.1") and package:is_plat("windows", "mingw", "msys", "cygwin") then package:add("deps", "pcre") end end) -- about windows: -- @see https://github.com/nfc-tools/libnfc/pull/734 on_install("!iphoneos and !wasm and !windows", function (package) local configs = { "-DBUILD_UTILS=OFF", "-DBUILD_EXAMPLES=OFF" } table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release")) table.insert(configs, "-DLIBNFC_LOG=" .. (package:config("logging") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_ENVVARS=" .. (package:config("envvars") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_CONFFILES_MODE=" .. (package:config("configurable") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_PCSC=" .. (package:config("pcsc") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_ACR122_PCSC=" .. (package:config("acr122_pcsc") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_ACR122_USB=" .. (package:config("acr122_usb") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_ACR122S=" .. (package:config("acr122s") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_ARYGON=" .. (package:config("arygon") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_PN532_I2C=" .. (package:config("pn532_i2c") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_PN532_SPI=" .. (package:config("pn532_spi") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_PN532_UART=" .. (package:config("pn532_uart") and "ON" or "OFF")) table.insert(configs, "-DLIBNFC_DRIVER_PN53X_USB=" .. (package:config("pn53x_usb") and "ON" or "OFF")) if package:is_plat("windows", "mingw", "msys", "cygwin") then local usb = package:dep("libusb-win32") if usb then local fetchinfo = usb:fetch() if fetchinfo then local includedirs = table.wrap(fetchinfo.includedirs or fetchinfo.sysincludedirs) if #includedirs > 0 then table.insert(configs, "-DLIBUSB_INCLUDE_DIRS=" .. table.concat(includedirs, ";")) end local libfiles = table.wrap(fetchinfo.libfiles) if #libfiles > 0 then table.insert(configs, "-DLIBUSB_LIBRARIES=" .. libfiles[1]) end end end end if package:is_plat("mingw") then table.insert(configs, "-DDLLTOOL=" .. package:tool("dlltool")) if package:version():le("1.7.1") then io.replace("libnfc/CMakeLists.txt", "dlltool", "${DLLTOOL}", {plain = true}) end end local opts = {} if package:is_plat("macosx") then opts.shflags = {"-framework", "CoreFoundation", "-framework", "IOKit", "-framework", "Security"} end if package:is_plat("windows", "mingw", "msys", "cygwin") then opts.cflags = [[-DSYSCONFDIR="./config"]] io.replace("CMakeLists.txt", "FIND_PACKAGE(PCRE REQUIRED)", [[ find_package(PkgConfig REQUIRED) pkg_check_modules(PCRECORE REQUIRED libpcre) pkg_check_modules(PCRE REQUIRED libpcreposix) add_compile_options(${PCRE_CFLAGS}) ]], {plain = true}) io.replace("libnfc/CMakeLists.txt", "${PCRE_LIBRARIES}", "${PCRE_LIBRARIES} ${PCRECORE_LIBRARIES}", {plain = true}) io.replace("libnfc/conf.c", "#include ", "#include ", {plain = true}) end if package:version():le("1.7.1") then io.replace("CMakeLists.txt", "# version.rc for Windows\nIF(WIN32)", "IF(0)", {plain = true}) io.replace("CMakeLists.txt", "ADD_SUBDIRECTORY(utils)", "", {plain = true}) io.replace("CMakeLists.txt", "ADD_SUBDIRECTORY(examples)", "", {plain = true}) end io.replace("CMakeLists.txt", [[CMAKE_SYSTEM_PROCESSOR STREQUAL "x86"]], [[CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3-6]86)$"]], {plain = true}) io.replace("libnfc/CMakeLists.txt", [[LIST(APPEND WINDOWS_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/../windows/libnfc.rc)]], "", {plain = true}) io.replace("libnfc/CMakeLists.txt", "DESTINATION bin", "DESTINATION ${CMAKE_INSTALL_LIBDIR}", {plain = true}) io.replace("cmake/modules/FindLIBUSB.cmake", "PKG_CHECK_MODULES(LIBUSB REQUIRED libusb)", "PKG_CHECK_MODULES(LIBUSB REQUIRED libusb-compat)", {plain = true}) io.replace("contrib/win32/stdlib.c", "char *str[32];", "char str[32];", {plain = true}) io.replace("CMakeLists.txt", "INCLUDE(UseDoxygen)", "", {plain = true}) import("package.tools.cmake").install(package, configs, opts) end) on_test(function (package) assert(package:has_cfuncs("nfc_version", {configs = {languages = "c99"}, includes = "nfc/nfc.h"})) end)