lpac/driver/CMakeLists.txt
Coelacanthus b23f0e4991
refactor(lpac): use __attribute__((cleanup)) to do SBRM (#270)
* refactor(driver): make json_print() reusable

So we can get rid of redefinition issue of json_print() and use helper.h
in all driver code.

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* refactor(driver): use __attribute__((cleanup)) to do SBRM

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* refactor: split helpers of driver into a new object library

* To use in lpac frontend code.
* To add lpac path prefix to avoid common header name conflict.

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* chore(gitignore): add clangd per-project index directory

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* refactor(src): use __attribute__((cleanup)) to do SBRM

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* fix(applet/notification/replay): tidy #include usage

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* fix(applet/profile/download): memory leak of error_detail

In current code, we always do strdup() on error_detail to avoid invoking
free() on static string. It's safe but will cause memory leak. Let's do
strdup() when assign static string to error_detail to avoid memory leak
and still keep safe.

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* fix(mingw): get rid of MinGW's stupid interface macro definition

In [1], they defined interface to struct although the code is not
Object-C or Object-C++. It's stupid and violate C/C++ standard: all
identifiers used by compiler or standard library should either be
a keyword, or be start with an underline plus a uppercase latter or two
underline to avoid conflict with user defined identifiers.

[1]: a51690d44e

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

* refactor(lpac): remove unnecessary goto logic

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>

---------

Signed-off-by: Coelacanthus <uwu@coelacanthus.name>
2025-08-15 20:00:53 +08:00

153 lines
6.5 KiB
CMake

include(CMakeDependentOption)
cmake_dependent_option(LPAC_DYNAMIC_DRIVERS "Build lpac/libeuicc driver backends as a dynamic library" OFF "LPAC_DYNAMIC_LIBEUICC" OFF)
option(LPAC_WITH_APDU_PCSC "Build APDU PCSC Backend (requires PCSC libraries)" ON)
cmake_dependent_option(LPAC_WITH_APDU_AT "Build APDU AT Backend" ON UNIX OFF)
cmake_dependent_option(LPAC_WITH_APDU_AT_WIN32 "Build APDU AT Backend for Win32" ON WIN32 OFF)
option(LPAC_WITH_APDU_GBINDER "Build APDU Gbinder backend for libhybris devices (requires gbinder headers)" OFF)
option(LPAC_WITH_APDU_QMI "Build QMI backend for Qualcomm devices (requires libqmi)" OFF)
option(LPAC_WITH_APDU_QMI_QRTR "Build QMI-over-QRTR backend for Qualcomm devices (requires libqrtr and libqmi headers)" OFF)
option(LPAC_WITH_APDU_MBIM "Build MBIM backend for MBIM devices (requires libmbim)" OFF)
option(LPAC_WITH_HTTP_CURL "Build HTTP Curl interface" ON)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} DIR_INTERFACE_SRCS)
if(LPAC_DYNAMIC_DRIVERS)
add_library(euicc-drivers SHARED ${DIR_INTERFACE_SRCS})
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libeuicc = ${PROJECT_VERSION}")
else()
add_library(euicc-drivers STATIC ${DIR_INTERFACE_SRCS})
endif()
target_link_libraries(euicc-drivers euicc cjson-static lpac-utils)
target_include_directories(euicc-drivers PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/apdu/stdio.c)
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/http/stdio.c)
if(LPAC_WITH_APDU_PCSC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_APDU_PCSC")
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/apdu/pcsc.c)
if(WIN32)
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/apdu/pcsc_win32.c)
target_link_libraries(euicc-drivers winscard)
elseif(APPLE)
target_link_libraries(euicc-drivers "-framework PCSC")
if(LPAC_DYNAMIC_DRIVERS)
# for pkg-config
set(LIBEUICC_DRIVERS_EXTRA_CFLAGS "-framework PCSC")
endif()
else()
find_package(PCSCLite)
target_link_libraries(euicc-drivers PCSCLite::PCSCLite)
if(LPAC_DYNAMIC_DRIVERS)
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libpcsclite")
endif()
endif()
endif()
if(LPAC_WITH_APDU_AT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_APDU_AT")
target_sources(euicc-drivers PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/apdu/at_common.c
${CMAKE_CURRENT_SOURCE_DIR}/apdu/at.c
)
endif()
if(LPAC_WITH_APDU_AT_WIN32)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_APDU_AT_WIN32")
target_link_libraries(euicc-drivers setupapi)
target_sources(euicc-drivers PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/apdu/at_common.c
${CMAKE_CURRENT_SOURCE_DIR}/apdu/at_win32.c
)
endif()
if(LPAC_WITH_APDU_GBINDER)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_APDU_GBINDER")
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/apdu/gbinder_hidl.c)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GBINDER REQUIRED IMPORTED_TARGET libgbinder)
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
target_link_libraries(euicc-drivers PkgConfig::GBINDER PkgConfig::GLIB)
if(LPAC_DYNAMIC_DRIVERS)
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libgbinder")
list(APPEND LIBEUICC_DRIVERS_REQUIRES "glib-2.0")
endif()
endif()
if(LPAC_WITH_APDU_QMI)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_APDU_QMI")
target_sources(euicc-drivers PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi.c
${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi_helpers.c
${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi_common.c)
find_package(PkgConfig REQUIRED)
pkg_check_modules(QMI_GLIB REQUIRED IMPORTED_TARGET qmi-glib>=1.35.5)
target_link_libraries(euicc-drivers PkgConfig::QMI_GLIB)
if(LPAC_DYNAMIC_DRIVERS)
list(APPEND LIBEUICC_DRIVERS_REQUIRES "qmi-glib")
endif()
endif()
if(LPAC_WITH_APDU_QMI_QRTR)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_APDU_QMI_QRTR")
target_sources(euicc-drivers PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi_qrtr.c
${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi_helpers.c
${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi_common.c)
find_package(PkgConfig REQUIRED)
pkg_check_modules(QRTR_GLIB REQUIRED IMPORTED_TARGET qrtr-glib)
pkg_check_modules(QMI_GLIB REQUIRED IMPORTED_TARGET qmi-glib>=1.35.5)
target_link_libraries(euicc-drivers PkgConfig::QRTR_GLIB PkgConfig::QMI_GLIB)
if(LPAC_DYNAMIC_DRIVERS)
list(APPEND LIBEUICC_DRIVERS_REQUIRES "qrtr-glib")
list(APPEND LIBEUICC_DRIVERS_REQUIRES "qmi-glib")
endif()
endif()
if(LPAC_WITH_APDU_MBIM)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_APDU_MBIM")
target_sources(euicc-drivers PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/apdu/mbim.c
${CMAKE_CURRENT_SOURCE_DIR}/apdu/mbim_helpers.c)
find_package(PkgConfig REQUIRED)
pkg_check_modules(MBIM_GLIB REQUIRED IMPORTED_TARGET mbim-glib)
target_link_libraries(euicc-drivers PkgConfig::MBIM_GLIB PkgConfig::MBIM_GLIB)
if(LPAC_DYNAMIC_DRIVERS)
list(APPEND LIBEUICC_DRIVERS_REQUIRES "mbim-glib")
endif()
endif()
if(LPAC_WITH_HTTP_CURL)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLPAC_WITH_HTTP_CURL")
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/http/curl.c)
if(WIN32)
target_link_libraries(euicc-drivers ${DL_LIBRARY})
else()
find_package(CURL REQUIRED)
target_link_libraries(euicc-drivers curl)
if(LPAC_DYNAMIC_DRIVERS)
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libcurl")
endif()
endif()
endif()
if(LPAC_DYNAMIC_DRIVERS)
# Install headers
file(GLOB ALL_HEADERS "*.h")
foreach(header ${ALL_HEADERS})
if(${header} MATCHES "^.*\.private\.h$")
list(REMOVE_ITEM ALL_HEADERS ${header})
endif()
endforeach()
set_target_properties(euicc-drivers PROPERTIES PUBLIC_HEADER "${ALL_HEADERS}")
# Install a pkg-config file (mainly for Linux; macOS is untested; Win32 is not supported)
if(UNIX)
list(JOIN LIBEUICC_DRIVERS_REQUIRES ", " LIBEUICC_DRIVERS_REQUIRES)
configure_file(libeuicc-drivers.pc.in libeuicc-drivers.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libeuicc-drivers.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
endif()
set_target_properties(euicc-drivers PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR})
install(TARGETS euicc-drivers LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/euicc)
endif()