Skip to content

Commit b5dca0b

Browse files
refactor: make all drivers can be built as runtime dynamic driver
Signed-off-by: Coelacanthus <uwu@coelacanthus.name>
1 parent 7d9e736 commit b5dca0b

2 files changed

Lines changed: 57 additions & 55 deletions

File tree

driver/CMakeLists.txt

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
include(CMakeDependentOption)
22
cmake_dependent_option(LPAC_DYNAMIC_DRIVERS "Build lpac/libeuicc driver backends as a dynamic library" OFF "LPAC_DYNAMIC_LIBEUICC" OFF)
3+
cmake_dependent_option(LPAC_DYNAMIC_DRIVERS_SOLID "Build lpac/libeuicc driver backends as a solid dynamic library" OFF "LPAC_DYNAMIC_LIBEUICC AND LPAC_DYNAMIC_DRIVERS" OFF)
34

45
option(LPAC_WITH_APDU_PCSC "Build APDU PCSC Backend (requires PCSC libraries)" ON)
56
option(LPAC_WITH_APDU_AT "Build APDU AT Backend" ON)
@@ -14,7 +15,7 @@ cmake_dependent_option(LPAC_WITH_HTTP_WINHTTP "Build HTTP WinHTTP interface (Win
1415
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} DIR_INTERFACE_SRCS)
1516
if(LPAC_DYNAMIC_DRIVERS)
1617
add_library(euicc-drivers SHARED ${DIR_INTERFACE_SRCS})
17-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libeuicc = ${PROJECT_VERSION}")
18+
list(APPEND LIBEUICC_DRIVERS_REQUIRES0 "libeuicc = ${PROJECT_VERSION}")
1819
else()
1920
add_library(euicc-drivers STATIC ${DIR_INTERFACE_SRCS})
2021
endif()
@@ -24,11 +25,17 @@ target_include_directories(euicc-drivers PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
2425
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/apdu/stdio.c)
2526
target_sources(euicc-drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/http/stdio.c)
2627

28+
if ((LPAC_DYNAMIC_DRIVERS AND LPAC_DYNAMIC_DRIVERS_SOLID) OR NOT LPAC_DYNAMIC_DRIVERS)
29+
set(DRIVER_BUILD_TYPE OBJECT)
30+
else()
31+
set(DRIVER_BUILD_TYPE SHARED)
32+
endif()
33+
2734
if (LPAC_WITH_APDU_PCSC)
28-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_APDU_PCSC)
29-
add_library(driver_apdu_pcsc OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/apdu/pcsc.c)
35+
add_library(driver_apdu_pcsc ${DRIVER_BUILD_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/apdu/pcsc.c)
3036
target_include_directories(driver_apdu_pcsc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
3137
target_link_libraries(driver_apdu_pcsc PRIVATE euicc cjson-ext lpac-utils)
38+
set_target_properties(driver_apdu_pcsc PROPERTIES PREFIX "")
3239
if (WIN32)
3340
target_sources(driver_apdu_pcsc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/apdu/pcsc_win32.c)
3441
target_link_libraries(driver_apdu_pcsc PRIVATE winscard)
@@ -40,18 +47,16 @@ if (LPAC_WITH_APDU_PCSC)
4047
else ()
4148
find_package(PCSCLite REQUIRED)
4249
target_link_libraries(driver_apdu_pcsc PRIVATE PCSCLite::PCSCLite)
43-
if (LPAC_DYNAMIC_DRIVERS)
44-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libpcsclite")
45-
endif ()
50+
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libpcsclite")
4651
endif ()
4752
list(APPEND LPAC_DRIVERS "driver_apdu_pcsc")
4853
endif ()
4954

5055
if (LPAC_WITH_APDU_AT)
51-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_APDU_AT)
52-
add_library(driver_apdu_at OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/apdu/at_common.c)
56+
add_library(driver_apdu_at ${DRIVER_BUILD_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/apdu/at_common.c)
5357
target_include_directories(driver_apdu_at PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
5458
target_link_libraries(driver_apdu_at PRIVATE euicc lpac-utils)
59+
set_target_properties(driver_apdu_at PROPERTIES PREFIX "")
5560
if (UNIX)
5661
target_sources(driver_apdu_at PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/apdu/at_unix.c)
5762
elseif (WIN32)
@@ -64,17 +69,15 @@ if (LPAC_WITH_APDU_AT)
6469
endif ()
6570

6671
if(LPAC_WITH_APDU_GBINDER)
67-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_APDU_GBINDER)
68-
add_library(driver_apdu_gbinder OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/apdu/gbinder_hidl.c)
72+
add_library(driver_apdu_gbinder ${DRIVER_BUILD_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/apdu/gbinder_hidl.c)
6973
target_include_directories(driver_apdu_gbinder PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
74+
set_target_properties(driver_apdu_gbinder PROPERTIES PREFIX "")
7075
find_package(PkgConfig REQUIRED)
7176
pkg_check_modules(GBINDER REQUIRED IMPORTED_TARGET libgbinder)
7277
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
7378
target_link_libraries(driver_apdu_gbinder PkgConfig::GBINDER PkgConfig::GLIB)
74-
if(LPAC_DYNAMIC_DRIVERS)
75-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libgbinder")
76-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "glib-2.0")
77-
endif()
79+
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libgbinder")
80+
list(APPEND LIBEUICC_DRIVERS_REQUIRES "glib-2.0")
7881
list(APPEND LPAC_DRIVERS "driver_apdu_gbinder")
7982
endif()
8083

@@ -89,14 +92,11 @@ if (LPAC_WITH_APDU_QMI OR LPAC_WITH_APDU_QMI_QRTR)
8992
pkg_check_modules(QMI_GLIB REQUIRED IMPORTED_TARGET qmi-glib>=1.35.5)
9093
target_link_libraries(qmi_common PkgConfig::QMI_GLIB)
9194

92-
if (LPAC_DYNAMIC_DRIVERS)
93-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "qmi-glib")
94-
endif ()
95+
list(APPEND LIBEUICC_DRIVERS_REQUIRES "qmi-glib")
9596
endif ()
9697

9798
if (LPAC_WITH_APDU_QMI)
98-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_APDU_QMI)
99-
add_library(driver_apdu_qmi OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi.c)
99+
add_library(driver_apdu_qmi ${DRIVER_BUILD_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi.c)
100100
target_include_directories(driver_apdu_qmi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
101101
target_link_libraries(driver_apdu_qmi PRIVATE qmi_common)
102102
set_target_properties(driver_apdu_qmi PROPERTIES PREFIX "")
@@ -105,22 +105,17 @@ if (LPAC_WITH_APDU_QMI)
105105
endif ()
106106

107107
if (LPAC_WITH_APDU_QMI_QRTR)
108-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_APDU_QMI_QRTR)
109-
add_library(driver_apdu_qmi_qrtr OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi_qrtr.c)
108+
add_library(driver_apdu_qmi_qrtr ${DRIVER_BUILD_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/apdu/qmi_qrtr.c)
110109
target_include_directories(driver_apdu_qmi_qrtr PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
111110
target_link_libraries(driver_apdu_qmi_qrtr PRIVATE qmi_common)
112111
set_target_properties(driver_apdu_qmi_qrtr PROPERTIES PREFIX "")
113112
target_compile_definitions(qmi_common PRIVATE LPAC_WITH_DRIVER_APDU_QMI_QRTR)
114-
115-
if (LPAC_DYNAMIC_DRIVERS)
116-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "qrtr-glib")
117-
endif ()
113+
list(APPEND LIBEUICC_DRIVERS_REQUIRES "qrtr-glib")
118114
list(APPEND LPAC_DRIVERS "driver_apdu_qmi_qrtr")
119115
endif ()
120116

121117
if (LPAC_WITH_APDU_MBIM)
122-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_APDU_MBIM)
123-
add_library(driver_apdu_mbim OBJECT
118+
add_library(driver_apdu_mbim ${DRIVER_BUILD_TYPE}
124119
${CMAKE_CURRENT_SOURCE_DIR}/apdu/mbim.c
125120
${CMAKE_CURRENT_SOURCE_DIR}/apdu/mbim_helpers.c)
126121
target_include_directories(driver_apdu_mbim PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
@@ -131,39 +126,46 @@ if (LPAC_WITH_APDU_MBIM)
131126
pkg_check_modules(MBIM_GLIB REQUIRED IMPORTED_TARGET mbim-glib>=1.26.0)
132127
target_link_libraries(driver_apdu_mbim PkgConfig::MBIM_GLIB PkgConfig::MBIM_GLIB)
133128

134-
if (LPAC_DYNAMIC_DRIVERS)
135-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "mbim-glib")
136-
endif ()
129+
list(APPEND LIBEUICC_DRIVERS_REQUIRES "mbim-glib")
137130
list(APPEND LPAC_DRIVERS "driver_apdu_mbim")
138131
endif ()
139132

140133
if(LPAC_WITH_HTTP_CURL)
141-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_HTTP_CURL)
142-
add_library(driver_http_curl OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/http/curl.c)
134+
add_library(driver_http_curl ${DRIVER_BUILD_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/http/curl.c)
143135
target_include_directories(driver_http_curl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
144136
target_link_libraries(driver_http_curl PRIVATE euicc lpac-utils)
137+
set_target_properties(driver_http_curl PROPERTIES PREFIX "")
145138
if(WIN32)
146139
target_link_libraries(driver_http_curl PRIVATE ${DL_LIBRARY})
147140
else()
148141
find_package(CURL REQUIRED)
149142
target_link_libraries(driver_http_curl PRIVATE curl)
150-
if(LPAC_DYNAMIC_DRIVERS)
151-
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libcurl")
152-
endif()
143+
list(APPEND LIBEUICC_DRIVERS_REQUIRES "libcurl")
153144
endif()
154145
list(APPEND LPAC_DRIVERS "driver_http_curl")
155146
endif()
156147

157148
if (LPAC_WITH_HTTP_WINHTTP)
158-
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_HTTP_WINHTTP)
159-
add_library(driver_http_winhttp OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/http/winhttp.c)
149+
add_library(driver_http_winhttp ${DRIVER_BUILD_TYPE} ${CMAKE_CURRENT_SOURCE_DIR}/http/winhttp.c)
160150
target_include_directories(driver_http_winhttp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
161151
target_link_libraries(driver_http_winhttp PRIVATE winhttp euicc lpac-utils)
162152
set_target_properties(driver_http_winhttp PROPERTIES PREFIX "")
163153
list(APPEND LPAC_DRIVERS "driver_http_winhttp")
164154
endif ()
165155

166-
target_link_libraries(euicc-drivers PUBLIC ${LPAC_DRIVERS})
156+
if ((LPAC_DYNAMIC_DRIVERS AND LPAC_DYNAMIC_DRIVERS_SOLID) OR NOT LPAC_DYNAMIC_DRIVERS)
157+
foreach(driver ${LPAC_DRIVERS})
158+
string(TOUPPER ${driver} DRIVER_MACRO)
159+
target_compile_definitions(euicc-drivers PRIVATE LPAC_WITH_${DRIVER_MACRO})
160+
endforeach()
161+
target_link_libraries(euicc-drivers PUBLIC ${LPAC_DRIVERS})
162+
list(APPEND LIBEUICC_DRIVERS_REQUIRES0 ${LIBEUICC_DRIVERS_REQUIRES})
163+
else()
164+
foreach(driver ${LPAC_DRIVERS})
165+
install(TARGETS ${driver} LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/lpac)
166+
endforeach()
167+
endif()
168+
167169

168170
if(LPAC_DYNAMIC_DRIVERS)
169171
# Install headers
@@ -176,7 +178,7 @@ if(LPAC_DYNAMIC_DRIVERS)
176178
set_target_properties(euicc-drivers PROPERTIES PUBLIC_HEADER "${ALL_HEADERS}")
177179
# Install a pkg-config file (mainly for Linux; macOS is untested; Win32 is not supported)
178180
if(UNIX)
179-
list(JOIN LIBEUICC_DRIVERS_REQUIRES ", " LIBEUICC_DRIVERS_REQUIRES)
181+
list(JOIN LIBEUICC_DRIVERS_REQUIRES0 ", " LIBEUICC_DRIVERS_REQUIRES)
180182
configure_file(libeuicc-drivers.pc.in libeuicc-drivers.pc @ONLY)
181183
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libeuicc-drivers.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
182184
endif()

driver/driver.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,60 +22,60 @@
2222
# include <link.h>
2323
#endif
2424

25-
#ifdef LPAC_WITH_APDU_GBINDER
25+
#ifdef LPAC_WITH_DRIVER_APDU_GBINDER
2626
# include "driver/apdu/gbinder_hidl.h"
2727
#endif
2828

29-
#ifdef LPAC_WITH_APDU_MBIM
29+
#ifdef LPAC_WITH_DRIVER_APDU_MBIM
3030
# include "driver/apdu/mbim.h"
3131
#endif
3232

33-
#ifdef LPAC_WITH_APDU_QMI
33+
#ifdef LPAC_WITH_DRIVER_APDU_QMI
3434
# include "driver/apdu/qmi.h"
3535
#endif
3636

37-
#ifdef LPAC_WITH_APDU_QMI_QRTR
37+
#ifdef LPAC_WITH_DRIVER_APDU_QMI_QRTR
3838
# include "driver/apdu/qmi_qrtr.h"
3939
#endif
4040

41-
#ifdef LPAC_WITH_APDU_PCSC
41+
#ifdef LPAC_WITH_DRIVER_APDU_PCSC
4242
# include "driver/apdu/pcsc.h"
4343
#endif
44-
#ifdef LPAC_WITH_APDU_AT
44+
#ifdef LPAC_WITH_DRIVER_APDU_AT
4545
# include "driver/apdu/at.h"
4646
#endif
47-
#ifdef LPAC_WITH_HTTP_CURL
47+
#ifdef LPAC_WITH_DRIVER_HTTP_CURL
4848
# include "driver/http/curl.h"
4949
#endif
50-
#ifdef LPAC_WITH_HTTP_WINHTTP
50+
#ifdef LPAC_WITH_DRIVER_HTTP_WINHTTP
5151
# include "driver/http/winhttp.h"
5252
#endif
5353
#include "driver/apdu/stdio.h"
5454
#include "driver/http/stdio.h"
5555

5656
static const struct euicc_driver *drivers[] = {
57-
#ifdef LPAC_WITH_APDU_GBINDER
57+
#ifdef LPAC_WITH_DRIVER_APDU_GBINDER
5858
&driver_apdu_gbinder_hidl,
5959
#endif
60-
#ifdef LPAC_WITH_APDU_MBIM
60+
#ifdef LPAC_WITH_DRIVER_APDU_MBIM
6161
&driver_apdu_mbim,
6262
#endif
63-
#ifdef LPAC_WITH_APDU_QMI
63+
#ifdef LPAC_WITH_DRIVER_APDU_QMI
6464
&driver_apdu_qmi,
6565
#endif
66-
#ifdef LPAC_WITH_APDU_QMI_QRTR
66+
#ifdef LPAC_WITH_DRIVER_APDU_QMI_QRTR
6767
&driver_apdu_qmi_qrtr,
6868
#endif
69-
#ifdef LPAC_WITH_APDU_PCSC
69+
#ifdef LPAC_WITH_DRIVER_APDU_PCSC
7070
&driver_apdu_pcsc,
7171
#endif
72-
#ifdef LPAC_WITH_APDU_AT
72+
#ifdef LPAC_WITH_DRIVER_APDU_AT
7373
&driver_apdu_at,
7474
#endif
75-
#ifdef LPAC_WITH_HTTP_WINHTTP // Prefer to use WINHTTP
75+
#ifdef LPAC_WITH_DRIVER_HTTP_WINHTTP // Prefer to use WINHTTP
7676
&driver_http_winhttp,
7777
#endif
78-
#ifdef LPAC_WITH_HTTP_CURL
78+
#ifdef LPAC_WITH_DRIVER_HTTP_CURL
7979
&driver_http_curl,
8080
#endif
8181
&driver_apdu_stdio, &driver_http_stdio, NULL,

0 commit comments

Comments
 (0)