You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

93 lines
3.6 KiB

cmake_minimum_required(VERSION 3.18)
project(ZXingPython)
# check if we are called from the top-level ZXing project
get_directory_property(hasParent PARENT_DIRECTORY)
if (NOT hasParent)
# TODO: replace with symlinks once https://github.com/scikit-build/scikit-build-core/issues/801 is resolved
message(STATUS "Copying files from parent folder needed for sdist")
foreach(NAME zxing.cmake LICENSE)
if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${NAME}")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${CMAKE_CURRENT_SOURCE_DIR}/../../${NAME}"
"${CMAKE_CURRENT_SOURCE_DIR}/${NAME}"
)
endif()
endforeach()
set(CMAKE_CXX_STANDARD 20) # required here for the module itself
option (BUILD_SHARED_LIBS "Link python module to shared lib" OFF)
option (ZXING_READERS "Build with reader support (decoders)" ON)
set (ZXING_WRITERS "NEW" CACHE STRING "Build with old and/or new writer (encoder) backend (OFF/ON/OLD/NEW)")
set (ZXING_DEPENDENCIES "AUTO" CACHE STRING "Fetch from github or use locally installed (AUTO/GITHUB/LOCAL)")
option (ZXING_EXPERIMENTAL_API "Build with experimental API" ON)
set(CORE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/core)
if(IS_SYMLINK ${CORE_PATH})
# This is needed because otherwise GCC resolves the symlink which causes paths to randomly
# be prefixed by /core or by /wrappers/python/core depending on include order.
set(CORE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../core)
endif()
if(EXISTS ${CORE_PATH})
add_subdirectory(${CORE_PATH} ZXing EXCLUDE_FROM_ALL)
include(${CMAKE_CURRENT_SOURCE_DIR}/zxing.cmake)
else()
message(FATAL_ERROR "Unable to locate zxing source code")
endif()
endif()
# Try to import all Python components potentially needed by nanobind
find_package(Python 3.10
REQUIRED COMPONENTS Interpreter Development.Module
OPTIONAL_COMPONENTS Development.SABIModule)
zxing_add_package(nanobind nanobind https://github.com/wjakob/nanobind.git v2.11.0)
nanobind_add_module(zxingcpp STABLE_ABI FREE_THREADED zxing.cpp)
target_link_libraries(zxingcpp PRIVATE ZXing::ZXing)
# Copy ZXing.dll alongside zxingcpp.pyd to solve ImportError during stub generation
if (WIN32 AND BUILD_SHARED_LIBS)
add_custom_command(TARGET zxingcpp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:ZXing::ZXing>
$<TARGET_FILE_DIR:zxingcpp>
VERBATIM
)
endif()
nanobind_add_stub(
zxingcpp_stub
MODULE zxingcpp
OUTPUT zxingcpp.pyi
PYTHON_PATH $<TARGET_FILE_DIR:zxingcpp>
DEPENDS zxingcpp
)
if (ZXING_READERS AND ZXING_WRITERS)
add_test(NAME PythonTest COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test.py -v)
set_property(TEST PythonTest PROPERTY ENVIRONMENT PYTHONPATH=$<TARGET_FILE_DIR:zxingcpp>)
endif()
# Default package install directory ("zxingcpp"), enables 'import zxingcpp'
if (NOT DEFINED ZXING_PYTHON_INSTALL_LIBDIR)
set(ZXING_PYTHON_INSTALL_LIBDIR "zxingcpp")
endif()
# Create py.typed marker file for type checking
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/py.typed" "")
install(TARGETS zxingcpp
COMPONENT python
LIBRARY DESTINATION "${ZXING_PYTHON_INSTALL_LIBDIR}")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/init.py
COMPONENT python
RENAME __init__.py
DESTINATION "${ZXING_PYTHON_INSTALL_LIBDIR}")
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/zxingcpp.pyi
${CMAKE_CURRENT_BINARY_DIR}/py.typed
COMPONENT python
DESTINATION "${ZXING_PYTHON_INSTALL_LIBDIR}")