meson.build 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. project('clanker-saddle', ['c', 'vala'],
  2. version: '0.1',
  3. )
  4. glib_dep = dependency('glib-2.0')
  5. gobject_dep = dependency('gobject-2.0')
  6. gio_dep = dependency('gio-2.0')
  7. json_glib_dep = dependency('json-glib-1.0')
  8. soup_dep = dependency('libsoup-3.0')
  9. libxml_dep = dependency('libxml-2.0')
  10. sqlite_dep = dependency('sqlite3')
  11. invercargill_dep = dependency('invercargill-1')
  12. invercargill_json_dep = dependency('invercargill-json')
  13. invercargill_sql_dep = dependency('invercargill-sql')
  14. invercargill_sql_inversion_dep = dependency('invercargill-sql-inversion')
  15. inversion_dep = dependency('inversion-0.1')
  16. astralis_dep = dependency('astralis-0.1')
  17. statum_dep = dependency('statum-0.1')
  18. spry_dep = dependency('spry-0.2')
  19. # Web Push crypto primitives (P-256 ECDH/ECDSA + AES-128-GCM for VAPID
  20. # and RFC 8291 payload encryption — plan 11 task E). Found via the C
  21. # compiler (no Vala vapi exists for libcrypto; the shim is C-only).
  22. libcrypto_dep = meson.get_compiler('c').find_library('crypto')
  23. # Statum build tools — statum-mkpstm compiles pages, statum-mkres embeds
  24. # resources. Resolved from PATH at setup time.
  25. statum_mkpstm = find_program('statum-mkpstm')
  26. statum_mkres = find_program('statum-mkres')
  27. # =============================================================================
  28. # Statum pages (statum-mkpstm): HTML → StatumPage subclass. Every page
  29. # composes the shared layout (main.html), which the tool discovers next to
  30. # the pages.
  31. # =============================================================================
  32. template_deps = files('src/pages/main.html')
  33. # spry:pages-begin
  34. home_page = custom_target('home-page',
  35. input: 'src/pages/home.html',
  36. output: 'HomePage.vala',
  37. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'HomePage', '--ns', 'ClankerSaddle', '@INPUT@'],
  38. depend_files: template_deps
  39. )
  40. login_page = custom_target('login-page',
  41. input: 'src/pages/login.html',
  42. output: 'LoginPage.vala',
  43. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'LoginPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  44. depend_files: template_deps
  45. )
  46. projects_page = custom_target('projects-page',
  47. input: 'src/pages/projects.html',
  48. output: 'ProjectsPage.vala',
  49. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'ProjectsPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  50. depend_files: template_deps
  51. )
  52. project_detail_page = custom_target('project-detail-page',
  53. input: 'src/pages/project_detail.html',
  54. output: 'ProjectDetailPage.vala',
  55. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'ProjectDetailPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  56. depend_files: template_deps
  57. )
  58. tasks_page = custom_target('tasks-page',
  59. input: 'src/pages/tasks.html',
  60. output: 'TasksPage.vala',
  61. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'TasksPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  62. depend_files: template_deps
  63. )
  64. task_detail_page = custom_target('task-detail-page',
  65. input: 'src/pages/task_detail.html',
  66. output: 'TaskDetailPage.vala',
  67. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'TaskDetailPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  68. depend_files: template_deps
  69. )
  70. task_terminal_page = custom_target('task-terminal-page',
  71. input: 'src/pages/task_terminal.html',
  72. output: 'TaskTerminalPage.vala',
  73. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'TaskTerminalPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  74. depend_files: template_deps
  75. )
  76. goals_page = custom_target('goals-page',
  77. input: 'src/pages/goals.html',
  78. output: 'GoalsPage.vala',
  79. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'GoalsPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  80. depend_files: template_deps
  81. )
  82. goal_detail_page = custom_target('goal-detail-page',
  83. input: 'src/pages/goal_detail.html',
  84. output: 'GoalDetailPage.vala',
  85. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'GoalDetailPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  86. depend_files: template_deps
  87. )
  88. saddles_page = custom_target('saddles-page',
  89. input: 'src/pages/saddles.html',
  90. output: 'SaddlesPage.vala',
  91. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'SaddlesPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  92. depend_files: template_deps
  93. )
  94. rules_page = custom_target('rules-page',
  95. input: 'src/pages/rules.html',
  96. output: 'RulesPage.vala',
  97. command: [statum_mkpstm, '-o', '@OUTPUT@', '-n', 'RulesPage', '--ns', 'ClankerSaddle', '@INPUT@'],
  98. depend_files: template_deps
  99. )
  100. # spry:pages-end
  101. # =============================================================================
  102. # Embedded resources (statum-mkres): the stylesheet precompressed at build
  103. # time and served from /_statum/resource/app.css.
  104. # =============================================================================
  105. app_css = custom_target('app-css',
  106. input: 'src/pages/app.css',
  107. output: 'AppCss.vala',
  108. command: [statum_mkres, '-o', '@OUTPUT@', '-n', 'app.css', '--class-name', 'AppCss',
  109. '--ns', 'ClankerSaddle', '-c', 'text/css', '@INPUT@'],
  110. )
  111. # =============================================================================
  112. # Sources
  113. # =============================================================================
  114. app_sources = files(
  115. # spry:sources-begin
  116. 'src/main.vala',
  117. 'src/Json.vala',
  118. 'src/Data/Entities.vala',
  119. 'src/Data/Migrations/M0001_Initial.vala',
  120. 'src/Services/ProjectService.vala',
  121. 'src/Services/TaskService.vala',
  122. 'src/Services/GoalService.vala',
  123. 'src/Services/SaddleService.vala',
  124. 'src/Services/SaddlePollState.vala',
  125. 'src/Services/AllocationService.vala',
  126. 'src/Services/StatePulse.vala',
  127. 'src/Services/Dispatcher.vala',
  128. 'src/Services/RuleService.vala',
  129. 'src/Services/CapabilityService.vala',
  130. 'src/Services/TimelineService.vala',
  131. 'src/Services/PushService.vala',
  132. 'src/Api/SaddleApi.vala',
  133. 'src/Api/TerminalSse.vala',
  134. 'src/Api/PushApi.vala',
  135. 'src/actions/Forms.vala',
  136. 'src/actions/LoginAction.vala',
  137. 'src/actions/ProjectActions.vala',
  138. 'src/actions/TaskActions.vala',
  139. 'src/actions/GoalActions.vala',
  140. 'src/actions/DashboardActions.vala',
  141. 'src/actions/SaddleActions.vala',
  142. 'src/actions/RuleActions.vala',
  143. 'src/actions/CapabilityActions.vala',
  144. 'src/actions/PushActions.vala',
  145. 'src/entrypoints/HomeEntrypoint.vala',
  146. 'src/entrypoints/LoginEntrypoint.vala',
  147. 'src/entrypoints/ProjectsEntrypoint.vala',
  148. 'src/entrypoints/TasksEntrypoint.vala',
  149. 'src/entrypoints/TaskDetailEntrypoint.vala',
  150. 'src/entrypoints/TaskTerminalEntrypoint.vala',
  151. 'src/entrypoints/GoalDetailEntrypoint.vala',
  152. 'src/entrypoints/SaddlesEntrypoint.vala',
  153. 'src/entrypoints/RulesEntrypoint.vala',
  154. # spry:sources-end
  155. )
  156. # Web Push crypto shim (plan 11 task E): C over OpenSSL's libcrypto —
  157. # P-256 keygen/ECDH/ECDSA + AES-128-GCM behind web-push-crypto.vapi.
  158. push_crypto = files('src/Push/web-push-crypto.c')
  159. app_generated = [
  160. # spry:generated-begin
  161. home_page,
  162. login_page,
  163. projects_page,
  164. project_detail_page,
  165. tasks_page,
  166. task_detail_page,
  167. task_terminal_page,
  168. goals_page,
  169. goal_detail_page,
  170. saddles_page,
  171. rules_page,
  172. # spry:generated-end
  173. ]
  174. clanker_saddle_exe = executable('clanker-saddle',
  175. app_sources + app_generated + [app_css, push_crypto],
  176. include_directories: include_directories('src/Push'),
  177. dependencies: [
  178. glib_dep,
  179. gobject_dep,
  180. gio_dep,
  181. json_glib_dep,
  182. soup_dep,
  183. libxml_dep,
  184. sqlite_dep,
  185. invercargill_dep,
  186. invercargill_json_dep,
  187. invercargill_sql_dep,
  188. invercargill_sql_inversion_dep,
  189. inversion_dep,
  190. astralis_dep,
  191. statum_dep,
  192. spry_dep,
  193. libcrypto_dep,
  194. ],
  195. install: true
  196. )
  197. # =============================================================================
  198. # Tests: test/web_stack_test.py is self-contained (spawns the app binary
  199. # in a scratch dir plus an in-process fake saddle daemon) and asserts the
  200. # web-stack wire contract features. The built binary is passed as its
  201. # first argument. The script shards the scenario groups into seven
  202. # parallel bundle processes (isolated app/daemon/DB each) and aggregates
  203. # their verdicts into this single test's result.
  204. # =============================================================================
  205. python_test = import('python').find_installation('python3')
  206. test('web-stack', python_test,
  207. args: [files('test/web_stack_test.py'), clanker_saddle_exe],
  208. timeout: 900,
  209. )