-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
262 lines (233 loc) · 7.54 KB
/
Copy pathCMakeLists.txt
File metadata and controls
262 lines (233 loc) · 7.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# Generate font resources using bin2c.py
set(RES_FONTS
res/Roboto-Regular.ttf
res/Roboto-Bold.ttf
res/Roboto-Light.ttf
)
set(RES_GENERATED)
foreach(font ${RES_FONTS})
get_filename_component(font_name ${font} NAME_WE)
set(output "${CMAKE_CURRENT_BINARY_DIR}/${font_name}.h")
add_custom_command(
OUTPUT ${output}
COMMAND ${Python3_EXECUTABLE} "${CMAKE_SOURCE_DIR}/scripts/bin2c.py"
${CMAKE_CURRENT_SOURCE_DIR}/${font} ${output} ${CMAKE_CURRENT_SOURCE_DIR}/${font}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${font}
COMMENT "Generating ${font_name}.h"
)
list(APPEND RES_GENERATED ${output})
endforeach()
# Main library sources
set(LIBLUI_SOURCES
button.cpp
embed.cpp
entry.cpp
font.cpp
graphics.cpp
image.cpp
main.cpp
fitment.cpp
slider.cpp
style.cpp
view.cpp
widget.cpp
pugl/src/common.c
pugl/src/internal.c
)
# Platform-specific sources and options
if(APPLE)
list(APPEND LIBLUI_SOURCES
embed_mac.mm
pugl/src/mac.m)
set_source_files_properties(
pugl/src/mac.m
pugl/src/mac_cairo.m
pugl/src/mac_gl.m PROPERTIES
COMPILE_FLAGS "-Wno-deprecated")
elseif(UNIX AND NOT APPLE)
list(APPEND LIBLUI_SOURCES
embed_x11.cpp
pugl/src/x11.c)
elseif(WIN32)
list(APPEND LIBLUI_SOURCES
embed_win32.cpp)
endif()
# Create the main library
add_library(lui-${LUI_ABI_VERSION}
${LIBLUI_SOURCES}
)
# Set properties
set_target_properties(lui-${LUI_ABI_VERSION} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${LUI_ABI_VERSION}
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
)
# Add compile definitions
target_compile_definitions(lui-${LUI_ABI_VERSION}
PRIVATE
LUI_BUILD
PUGL_STATIC
)
# Include directories
target_include_directories(lui-${LUI_ABI_VERSION} PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
$<INSTALL_INTERFACE:include>
)
# Include pugl from subproject and nanovg sources
target_include_directories(lui-${LUI_ABI_VERSION} PRIVATE
${PROJECT_SOURCE_DIR}/src/pugl/include)
# Link dependencies
target_include_directories(lui-${LUI_ABI_VERSION} PRIVATE)
target_link_directories(lui-${LUI_ABI_VERSION} PRIVATE)
target_link_libraries(lui-${LUI_ABI_VERSION}
PRIVATE Threads::Threads)
# X11 support for Linux
if(UNIX AND NOT APPLE)
target_compile_options(lui-${LUI_ABI_VERSION} PRIVATE -fPIC)
target_link_libraries(lui-${LUI_ABI_VERSION}
PRIVATE
X11::X11
X11::Xcursor
X11::Xext
X11::Xrandr)
# Xsync is optional, may not be available on all systems
if(TARGET X11::Xsync)
target_link_libraries(lui-${LUI_ABI_VERSION} PRIVATE X11::Xsync)
endif()
endif()
# Apple frameworks
if(APPLE)
target_link_libraries(lui-${LUI_ABI_VERSION}
PUBLIC
"-framework Foundation"
"-framework CoreVideo"
"-framework CoreGraphics"
"-framework Cocoa"
)
endif()
# Install just the main library for now
install(TARGETS lui-${LUI_ABI_VERSION}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# Generate and install pkg-config file for main library
configure_file(
${CMAKE_SOURCE_DIR}/lui.pc.in
${CMAKE_BINARY_DIR}/lui-${LUI_ABI_VERSION}.pc
@ONLY
)
install(FILES ${CMAKE_BINARY_DIR}/lui-${LUI_ABI_VERSION}.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)
function(lui_add_backend tgt)
set_target_properties(${tgt} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${LUI_ABI_VERSION}
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
)
target_compile_definitions(${tgt} PRIVATE
PUGL_STATIC
LUI_BUILD
)
target_include_directories(${tgt}
PRIVATE
${PROJECT_SOURCE_DIR}/src/pugl/include
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src>
PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
${CAIRO_INCLUDE_DIRS}
)
target_link_libraries(${tgt} PUBLIC lui-${LUI_ABI_VERSION})
if(UNIX AND NOT APPLE)
target_compile_options(${tgt} PRIVATE -fPIC)
endif()
install(TARGETS ${tgt}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
endfunction()
# OpenGL/NanoVG Backend
add_library(lui-gl-${LUI_ABI_VERSION}
nanovg.cpp
nanovglib.cpp
opengl.cpp
${RES_GENERATED}
)
if(APPLE)
target_sources(lui-gl-${LUI_ABI_VERSION} PRIVATE
pugl/src/mac_gl.m)
target_link_libraries(lui-gl-${LUI_ABI_VERSION}
PRIVATE "-framework OpenGL")
target_compile_definitions(lui-gl-${LUI_ABI_VERSION} PRIVATE NANOVG_GL2)
elseif(UNIX AND NOT APPLE)
# Linux: use libepoxy for OpenGL function loading
target_sources(lui-gl-${LUI_ABI_VERSION} PRIVATE
pugl/src/x11_gl.c)
if(LIBEPOXY_FOUND)
target_link_libraries(lui-gl-${LUI_ABI_VERSION}
PRIVATE ${LIBEPOXY_LIBRARIES} GL X11)
target_include_directories(lui-gl-${LUI_ABI_VERSION}
PRIVATE ${LIBEPOXY_INCLUDE_DIRS})
target_compile_definitions(lui-gl-${LUI_ABI_VERSION} PRIVATE NANOVG_GL3)
else()
message(FATAL_ERROR "libepoxy not found - required for OpenGL backend on Linux")
endif()
endif()
lui_add_backend(lui-gl-${LUI_ABI_VERSION})
target_include_directories(lui-gl-${LUI_ABI_VERSION}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/nanovg)
# Generate and install pkg-config file for OpenGL backend
configure_file(
${CMAKE_SOURCE_DIR}/lui-gl.pc.in
${CMAKE_BINARY_DIR}/lui-gl-${LUI_ABI_VERSION}.pc
@ONLY
)
install(FILES ${CMAKE_BINARY_DIR}/lui-gl-${LUI_ABI_VERSION}.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)
# Cairo Backend
if(CAIRO_FOUND)
add_library(lui-cairo-${LUI_ABI_VERSION}
cairo.cpp)
lui_add_backend(lui-cairo-${LUI_ABI_VERSION})
target_include_directories(lui-cairo-${LUI_ABI_VERSION}
PRIVATE ${CAIRO_INCLUDE_DIRS})
target_link_directories(lui-cairo-${LUI_ABI_VERSION}
PRIVATE ${CAIRO_LIBRARY_DIRS})
target_link_libraries(lui-cairo-${LUI_ABI_VERSION}
PUBLIC lui-${LUI_ABI_VERSION})
target_link_libraries(lui-cairo-${LUI_ABI_VERSION}
PRIVATE ${CAIRO_LIBRARIES})
# Platform-specific Cairo libraries
if(APPLE)
target_sources(lui-cairo-${LUI_ABI_VERSION} PRIVATE pugl/src/mac_cairo.m)
target_link_libraries(lui-cairo-${LUI_ABI_VERSION} PRIVATE
"-framework CoreGraphics"
)
elseif(UNIX AND NOT APPLE)
target_sources(lui-cairo-${LUI_ABI_VERSION} PRIVATE pugl/src/x11_cairo.c)
elseif(WIN32)
target_sources(lui-cairo-${LUI_ABI_VERSION} PRIVATE pugl/src/win_cairo.c)
target_link_libraries(lui-cairo-${LUI_ABI_VERSION} PRIVATE gdi32)
endif()
message(STATUS "Cairo backend enabled - building lui-cairo-${LUI_ABI_VERSION}")
# Generate and install pkg-config file for Cairo backend
configure_file(
${PROJECT_SOURCE_DIR}/lui-cairo.pc.in
${PROJECT_BINARY_DIR}/lui-cairo-${LUI_ABI_VERSION}.pc
@ONLY
)
install(FILES ${CMAKE_BINARY_DIR}/lui-cairo-${LUI_ABI_VERSION}.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)
else()
message(STATUS "Cairo not found - Cairo backend will not be built")
endif()