diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml
index 3980be3..9e3adbd 100644
--- a/.github/workflows/c-cpp.yml
+++ b/.github/workflows/c-cpp.yml
@@ -14,7 +14,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: build-depends
- run: sudo apt update && sudo apt -y install libgtest-dev build-essential cmake libgtest-dev libuv1-dev && sudo apt clean
+ run: sudo apt update && sudo apt -y install libgtest-dev build-essential cmake libgtest-dev libuv1-dev libcli11-dev && sudo apt clean
- name: configure
run: mkdir build && cd build && cmake ../ -DCMAKE_BUILD_TYPE=Debug
- name: make
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9fe8435..619bfb7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -251,3 +251,4 @@ target_link_libraries( networkprotocoldsl_uv PUBLIC networkprotocoldsl ${LIBUV_L
enable_testing()
add_subdirectory(tests)
+add_subdirectory(examples)
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644
index 0000000..dd44fa9
--- /dev/null
+++ b/examples/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(smtpserver)
\ No newline at end of file
diff --git a/examples/smtpserver/CMakeLists.txt b/examples/smtpserver/CMakeLists.txt
new file mode 100644
index 0000000..0f6a58a
--- /dev/null
+++ b/examples/smtpserver/CMakeLists.txt
@@ -0,0 +1,34 @@
+# Add a custom command to generate the embedded file.
+
+set(SMTP_SOURCE_BASENAME smtp.networkprotocoldsl)
+set(SMTP_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${SMTP_SOURCE_BASENAME})
+set(SMTP_STRING_LITERAL_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SMTP_SOURCE_BASENAME}.literal)
+add_custom_command(
+ OUTPUT ${SMTP_STRING_LITERAL_FILE}
+ COMMAND ${CMAKE_COMMAND}
+ -DINPUT_FILE="${SMTP_SOURCE_FILE}"
+ -DOUTPUT_FILE="${SMTP_STRING_LITERAL_FILE}"
+ -P "${CMAKE_CURRENT_SOURCE_DIR}/generate_string_literals.cmake"
+ DEPENDS ${SMTP_SOURCE_FILE} generate_string_literals.cmake
+ COMMENT "Generating ${SMTP_STRING_LITERAL_FILE} from ${SMTP_SOURCE_FILE}"
+)
+
+# Instead of defining a separate target, mark main.cpp as dependent on the generated file.
+set_source_files_properties(
+ interpreted_program.cpp PROPERTIES OBJECT_DEPENDS ${SMTP_STRING_LITERAL_FILE}
+)
+
+# Build the smtpserver executable and make it depend on the generated file.
+find_package(CLI11 REQUIRED)
+
+add_executable(smtpserver
+ main.cpp
+ interpreted_program.cpp
+ interpreted_program.hpp
+ server_core.cpp
+ server_core.hpp
+ server_processor.cpp
+ server_processor.hpp
+)
+target_link_libraries(smtpserver PRIVATE networkprotocoldsl networkprotocoldsl_uv CLI11::CLI11)
+target_compile_definitions(smtpserver PRIVATE -DSMTP_NETWORKPROTOCOLDSL_LITERAL="${SMTP_STRING_LITERAL_FILE}")
diff --git a/examples/smtpserver/generate_string_literals.cmake b/examples/smtpserver/generate_string_literals.cmake
new file mode 100644
index 0000000..681f1bc
--- /dev/null
+++ b/examples/smtpserver/generate_string_literals.cmake
@@ -0,0 +1,13 @@
+if(NOT DEFINED INPUT_FILE OR NOT DEFINED OUTPUT_FILE)
+ message(FATAL_ERROR "Usage: cmake -DINPUT_FILE= -DOUTPUT_FILE=