11cmake_minimum_required (VERSION 3.18)
2- project (loki C)
2+ project (loki VERSION 0.1.0 LANGUAGES C)
33
44set (CMAKE_C_STANDARD 99)
55set (CMAKE_C_STANDARD_REQUIRED ON )
@@ -10,10 +10,17 @@ if (NOT CMAKE_BUILD_TYPE)
1010endif ()
1111
1212option (LOKI_BUILD_SHARED "Build libloki as a shared library" OFF )
13+ option (BUILD_TESTS "Build unit tests" ON )
1314
15+ # Find required packages
16+ find_package (PkgConfig REQUIRED)
1417find_package (Lua REQUIRED)
1518find_package (CURL REQUIRED)
1619find_package (Threads REQUIRED)
20+
21+ # Find libuv for async support
22+ pkg_check_modules(LIBUV REQUIRED libuv)
23+
1724# Line editing library detection (editline preferred over readline due to BSD license)
1825set (LINEEDIT_FOUND FALSE )
1926set (LINEEDIT_LIBRARY "" )
@@ -88,195 +95,166 @@ if (LOKI_BUILD_SHARED)
8895 set (LOKI_LIBRARY_TYPE SHARED)
8996endif ()
9097
91- add_library (libloki ${LOKI_LIBRARY_TYPE}
92- src/loki_core.c
93- src/loki_lua.c
94- src/loki_editor.c
95- src/loki_syntax.c
96- src/loki_indent.c
97- src/loki_languages.c
98- src/loki_selection.c
99- src/loki_search.c
100- src/loki_modal.c
101- src/loki_command.c
102- src/loki_terminal.c
103- src/loki_undo.c
104- src/loki_buffers.c
98+ # Loki core library - new modular architecture
99+ set (LOKI_SOURCES
100+ src/core.c
101+ src/buffers.c
102+ src/terminal.c
103+ src/renderer.c
104+ src/event.c
105+ src/modal.c
106+ src/selection.c
107+ src/syntax.c
108+ src/languages.c
109+ src/search.c
110+ src/undo.c
111+ src/indent.c
112+ src/json.c
113+ src/serialize.c
114+ src/async_queue.c
115+ src/command .c
116+ src/command /basic.c
117+ src/command /file.c
118+ src/command /goto.c
119+ src/command /substitute.c
120+ src/editor.c
121+ src/lua.c
122+ src/lang_bridge.c
123+ src/session.c
124+ src/host.c
125+ src/cli.c
126+ src/jsonrpc.c
127+ src/repl_helpers.c
128+ src/repl.c
105129 src/loki_markdown.c
130+ src/http.c
106131)
107132
133+ add_library (libloki ${LOKI_LIBRARY_TYPE} ${LOKI_SOURCES} )
134+
108135target_include_directories (libloki
109136 PUBLIC
110137 ${CMAKE_CURRENT_SOURCE_DIR} /include
138+ ${CMAKE_CURRENT_SOURCE_DIR} /src
111139 ${LUA_INCLUDE_DIR}
112140 ${CURL_INCLUDE_DIRS}
141+ ${LIBUV_INCLUDE_DIRS}
113142 ${CMAKE_CURRENT_SOURCE_DIR} /thirdparty/cmark/src
114143)
115144
116145target_compile_options (libloki PRIVATE -Wall -Wextra -pedantic)
117146
147+ target_link_directories (libloki PUBLIC ${LIBUV_LIBRARY_DIRS} )
148+
118149target_link_libraries (libloki
119150 PUBLIC
120151 ${LUA_LIBRARIES}
121152 CURL::libcurl
122153 Threads::Threads
123154 ${CMAKE_DL_LIBS}
155+ ${LIBUV_LIBRARIES}
124156 cmark
125157)
126158
127159if (NOT MSVC )
128160 target_link_libraries (libloki PUBLIC m)
129161endif ()
130162
131- add_executable (loki_editor src/main_editor.c)
132- target_compile_options (loki_editor PRIVATE -Wall -Wextra -pedantic)
133- target_link_libraries (loki_editor PRIVATE libloki)
134- set_target_properties (loki_editor PROPERTIES OUTPUT_NAME "loki-editor" )
135-
136- add_executable (loki_repl src/main_repl.c)
137- target_include_directories (loki_repl PRIVATE
138- ${CMAKE_CURRENT_SOURCE_DIR}
139- ${CMAKE_CURRENT_SOURCE_DIR} /include
140- )
141- target_compile_options (loki_repl PRIVATE -Wall -Wextra -pedantic)
142- target_link_libraries (loki_repl PRIVATE libloki)
143- set_target_properties (loki_repl PROPERTIES OUTPUT_NAME "loki-repl" )
163+ # Main executable
164+ add_executable (loki src/main.c)
165+ target_compile_options (loki PRIVATE -Wall -Wextra -pedantic)
166+ target_link_libraries (loki PRIVATE libloki)
144167
145168if (LINEEDIT_FOUND)
146- target_include_directories (loki_repl PRIVATE ${LINEEDIT_INCLUDE_DIR} )
147- target_link_libraries (loki_repl PRIVATE ${LINEEDIT_LIBRARY} )
169+ target_include_directories (loki PRIVATE ${LINEEDIT_INCLUDE_DIR} )
170+ target_link_libraries (loki PRIVATE ${LINEEDIT_LIBRARY} )
148171 if (LINEEDIT_TYPE STREQUAL "editline" )
149- target_compile_definitions (loki_repl PRIVATE LOKI_HAVE_EDITLINE=1)
172+ target_compile_definitions (loki PRIVATE LOKI_HAVE_EDITLINE=1)
150173 else ()
151- target_compile_definitions (loki_repl PRIVATE LOKI_HAVE_READLINE=1)
174+ target_compile_definitions (loki PRIVATE LOKI_HAVE_READLINE=1)
152175 endif ()
153- message (STATUS "loki-repl will use ${LINEEDIT_TYPE} for line editing (history, completion)" )
176+ message (STATUS "loki will use ${LINEEDIT_TYPE} for line editing (history, completion)" )
154177endif ()
155178
156179add_custom_target (show-config
157180 COMMAND ${CMAKE_COMMAND} -E echo "Lua include: ${LUA_INCLUDE_DIR} "
158181 COMMAND ${CMAKE_COMMAND} -E echo "Lua libraries: ${LUA_LIBRARIES} "
159182 COMMAND ${CMAKE_COMMAND} -E echo "libcurl include: ${CURL_INCLUDE_DIRS} "
160183 COMMAND ${CMAKE_COMMAND} -E echo "libcurl libraries: ${CURL_LIBRARIES} "
184+ COMMAND ${CMAKE_COMMAND} -E echo "libuv include: ${LIBUV_INCLUDE_DIRS} "
185+ COMMAND ${CMAKE_COMMAND} -E echo "libuv libraries: ${LIBUV_LIBRARIES} "
161186 COMMAND ${CMAKE_COMMAND} -E echo "Line editing: ${LINEEDIT_TYPE} "
162187 COMMAND ${CMAKE_COMMAND} -E echo "Line edit library: ${LINEEDIT_LIBRARY} "
163188)
164189
165- enable_testing ()
166- add_test (NAME loki_editor_version COMMAND $<TARGET_FILE:loki_editor> --version )
167- add_test (NAME loki_repl_version COMMAND $<TARGET_FILE:loki_repl> --version )
168-
169- # Test framework library
170- add_library (test_framework STATIC tests/test_framework.c)
171- target_include_directories (test_framework PUBLIC
172- ${CMAKE_CURRENT_SOURCE_DIR} /tests
173- ${CMAKE_CURRENT_SOURCE_DIR} /include
174- )
175-
176- # Unit tests for core functionality
177- add_executable (test_core tests/test_core.c)
178- target_include_directories (test_core PRIVATE
179- ${CMAKE_CURRENT_SOURCE_DIR} /include
180- ${CMAKE_CURRENT_SOURCE_DIR} /src
181- ${CMAKE_CURRENT_SOURCE_DIR} /tests
182- )
183- target_link_libraries (test_core PRIVATE libloki test_framework)
184- add_test (NAME test_core COMMAND test_core)
185-
186- # Integration tests for file I/O
187- add_executable (test_file_io tests/test_file_io.c)
188- target_include_directories (test_file_io PRIVATE
189- ${CMAKE_CURRENT_SOURCE_DIR} /include
190- ${CMAKE_CURRENT_SOURCE_DIR} /src
191- ${CMAKE_CURRENT_SOURCE_DIR} /tests
192- )
193- target_link_libraries (test_file_io PRIVATE libloki test_framework)
194- add_test (NAME test_file_io COMMAND test_file_io)
195-
196- # Integration tests for Lua API
197- add_executable (test_lua_api tests/test_lua_api.c)
198- target_include_directories (test_lua_api PRIVATE
199- ${CMAKE_CURRENT_SOURCE_DIR} /include
200- ${CMAKE_CURRENT_SOURCE_DIR} /src
201- ${CMAKE_CURRENT_SOURCE_DIR} /tests
202- ${LUA_INCLUDE_DIR}
203- )
204- target_link_libraries (test_lua_api PRIVATE libloki test_framework)
205- add_test (NAME test_lua_api COMMAND test_lua_api)
206-
207- # Unit tests for language registration helpers
208- add_executable (test_lang_registration tests/test_lang_registration.c)
209- target_include_directories (test_lang_registration PRIVATE
210- ${CMAKE_CURRENT_SOURCE_DIR} /include
211- ${CMAKE_CURRENT_SOURCE_DIR} /src
212- ${CMAKE_CURRENT_SOURCE_DIR} /tests
213- ${LUA_INCLUDE_DIR}
214- )
215- target_link_libraries (test_lang_registration PRIVATE libloki test_framework)
216- add_test (NAME test_lang_registration COMMAND test_lang_registration)
217-
218- # Unit tests for HTTP security features
219- add_executable (test_http_security tests/test_http_security.c)
220- target_include_directories (test_http_security PRIVATE
221- ${CMAKE_CURRENT_SOURCE_DIR} /include
222- ${CMAKE_CURRENT_SOURCE_DIR} /src
223- ${CMAKE_CURRENT_SOURCE_DIR} /tests
224- ${LUA_INCLUDE_DIR}
225- )
226- target_link_libraries (test_http_security PRIVATE libloki test_framework)
227- add_test (NAME test_http_security COMMAND test_http_security)
190+ # Tests
191+ if (BUILD_TESTS)
192+ enable_testing ()
228193
229- # Unit tests for modal editing (vim-like modes)
230- add_executable (test_modal tests/test_modal.c)
231- target_include_directories (test_modal PRIVATE
232- ${CMAKE_CURRENT_SOURCE_DIR} /include
233- ${CMAKE_CURRENT_SOURCE_DIR} /src
234- ${CMAKE_CURRENT_SOURCE_DIR} /tests
235- ${LUA_INCLUDE_DIR}
236- )
237- target_link_libraries (test_modal PRIVATE libloki test_framework)
238- add_test (NAME test_modal COMMAND test_modal)
194+ add_test (NAME loki_version COMMAND $<TARGET_FILE:loki> --version )
239195
240- # Unit tests for syntax highlighting
241- add_executable (test_syntax tests/test_syntax.c)
242- target_include_directories (test_syntax PRIVATE
243- ${CMAKE_CURRENT_SOURCE_DIR} /include
244- ${CMAKE_CURRENT_SOURCE_DIR} /src
245- ${CMAKE_CURRENT_SOURCE_DIR} /tests
246- ${LUA_INCLUDE_DIR}
247- )
248- target_link_libraries (test_syntax PRIVATE libloki test_framework)
249- add_test (NAME test_syntax COMMAND test_syntax)
196+ # Test framework library
197+ add_library (test_framework STATIC tests/test_framework.c)
198+ target_include_directories (test_framework PUBLIC
199+ ${CMAKE_CURRENT_SOURCE_DIR} /tests
200+ ${CMAKE_CURRENT_SOURCE_DIR} /include
201+ ${CMAKE_CURRENT_SOURCE_DIR} /src
202+ )
203+
204+ # Core editor tests (new modular structure)
205+ set (LOKI_TESTS
206+ test_core
207+ test_buffers
208+ test_modal
209+ test_terminal
210+ test_syntax
211+ test_search
212+ test_selection
213+ test_undo
214+ test_indent
215+ test_command
216+ test_serialize
217+ test_lua_api
218+ test_lang_registration
219+ test_file_io
220+ test_row_operations
221+ test_async_queue
222+ )
223+
224+ foreach (test_name ${LOKI_TESTS} )
225+ add_executable (${test_name} tests/loki/${test_name} .c)
226+ target_include_directories (${test_name} PRIVATE
227+ ${CMAKE_CURRENT_SOURCE_DIR} /include
228+ ${CMAKE_CURRENT_SOURCE_DIR} /src
229+ ${CMAKE_CURRENT_SOURCE_DIR} /tests
230+ ${LUA_INCLUDE_DIR}
231+ )
232+ target_link_libraries (${test_name} PRIVATE libloki test_framework)
233+ add_test (NAME ${test_name} COMMAND ${test_name} )
234+ endforeach ()
250235
251- # Unit tests for search functionality
252- add_executable (test_search tests/test_search .c)
253- target_include_directories (test_search PRIVATE
254- ${CMAKE_CURRENT_SOURCE_DIR} /include
255- ${CMAKE_CURRENT_SOURCE_DIR} /src
256- ${CMAKE_CURRENT_SOURCE_DIR} /tests
257- ${LUA_INCLUDE_DIR}
258- )
259- target_link_libraries (test_search PRIVATE libloki test_framework)
260- add_test (NAME test_search COMMAND test_search )
236+ # HTTP tests
237+ add_executable (test_http_security tests/test_http_security .c)
238+ target_include_directories (test_http_security PRIVATE
239+ ${CMAKE_CURRENT_SOURCE_DIR} /include
240+ ${CMAKE_CURRENT_SOURCE_DIR} /src
241+ ${CMAKE_CURRENT_SOURCE_DIR} /tests
242+ ${LUA_INCLUDE_DIR}
243+ )
244+ target_link_libraries (test_http_security PRIVATE libloki test_framework)
245+ add_test (NAME test_http_security COMMAND test_http_security )
261246
262- # Unit tests for buffer management
263- add_executable (test_buffers tests/test_buffers.c)
264- target_include_directories (test_buffers PRIVATE
265- ${CMAKE_CURRENT_SOURCE_DIR} /include
266- ${CMAKE_CURRENT_SOURCE_DIR} /src
267- ${CMAKE_CURRENT_SOURCE_DIR} /tests
268- ${LUA_INCLUDE_DIR}
269- )
270- target_link_libraries (test_buffers PRIVATE libloki test_framework )
271- add_test ( NAME test_buffers COMMAND test_buffers )
247+ add_executable (test_http_simple tests/test_http_simple.c)
248+ target_include_directories (test_http_simple PRIVATE
249+ ${CMAKE_CURRENT_SOURCE_DIR} / include
250+ ${CMAKE_CURRENT_SOURCE_DIR} /src
251+ ${CMAKE_CURRENT_SOURCE_DIR} /tests
252+ ${LUA_INCLUDE_DIR}
253+ )
254+ target_link_libraries (test_http_simple PRIVATE libloki test_framework )
255+ add_test ( NAME test_http_simple COMMAND test_http_simple )
256+ endif ( )
272257
273- # Unit tests for auto-indentation
274- add_executable (test_indent tests/test_indent.c)
275- target_include_directories (test_indent PRIVATE
276- ${CMAKE_CURRENT_SOURCE_DIR} /include
277- ${CMAKE_CURRENT_SOURCE_DIR} /src
278- ${CMAKE_CURRENT_SOURCE_DIR} /tests
279- ${LUA_INCLUDE_DIR}
280- )
281- target_link_libraries (test_indent PRIVATE libloki test_framework)
282- add_test (NAME test_indent COMMAND test_indent)
258+ # Install
259+ install (TARGETS loki RUNTIME DESTINATION bin)
260+ install (DIRECTORY .loki DESTINATION share/loki)
0 commit comments