Meson · 4999 bytes Raw Blame History
1 # Sniffly - Pure Fortran GUI Disk Analyzer
2 # Build configuration using Meson
3
4 project('sniffly', ['fortran', 'c'],
5 version: '0.2.4', # Also maintained in VERSION file
6 license: 'MIT',
7 default_options: [
8 'warning_level=3',
9 'buildtype=debugoptimized',
10 ])
11
12 # Minimum Meson version
13 meson_version_required = '>=0.60.0'
14
15 # Project information
16 project_description = 'Pure Fortran GUI disk analyzer inspired by SpaceSniffer'
17 project_url = 'https://github.com/FortranGoingOnForty/sniffly'
18
19 # Print build configuration
20 message('===========================================')
21 message('Configuring Sniffly v' + meson.project_version())
22 message('Build type: ' + get_option('buildtype'))
23 message('===========================================')
24
25 # Check for dependencies
26 message('Checking dependencies...')
27
28 # GTK4 via gtk-fortran (required)
29 gtk4_dep = dependency('gtk-4-fortran',
30 version: '>=4.0',
31 required: true,
32 fallback: ['gtk-fortran', 'gtk4_dep'])
33
34 # Cairo (required for drawing)
35 cairo_dep = dependency('cairo',
36 version: '>=1.16',
37 required: true)
38
39 # Optional: threads for background scanning
40 thread_dep = dependency('threads', required: false)
41
42 # Collect all dependencies
43 dependencies = [
44 gtk4_dep,
45 cairo_dep,
46 ]
47
48 if thread_dep.found()
49 dependencies += thread_dep
50 message('Threading support: enabled')
51 else
52 message('Threading support: disabled (will use single-threaded scanning)')
53 endif
54
55 # Print dependency versions
56 message('GTK4-Fortran version: ' + gtk4_dep.version())
57 message('Cairo version: ' + cairo_dep.version())
58
59 # Generate version module from template
60 version_data = configuration_data()
61 version_data.set('VERSION', meson.project_version())
62 version_f90 = configure_file(
63 input: 'src/version.f90.in',
64 output: 'version.f90',
65 configuration: version_data,
66 )
67
68 # Source files
69 # Note: Order matters for Fortran modules (dependencies must come first)
70
71 # C helper sources (for file system operations)
72 c_sources = [
73 'src/core/dir_helpers.c',
74 ]
75
76 # Fortran source files
77 core_sources = [
78 version_f90, # Generated version module (no dependencies)
79 'src/core/types.f90', # Must be first (no dependencies)
80 'src/core/file_system.f90', # Depends on types
81 'src/core/disk_scanner.f90', # Depends on types, file_system
82 'src/core/progressive_scanner.f90', # Depends on types, file_system
83 ]
84
85 layout_sources = [
86 # Layout algorithms
87 'src/layout/squarified.f90', # Depends on types
88 # 'src/layout/cushioned.f90',
89 # 'src/layout/layout_manager.f90',
90 ]
91
92 gui_sources = [
93 # GTK4 interface
94 'src/gui/treemap_widget.f90', # Must come before gtk_app (dependency)
95 'src/gui/gtk_app.f90',
96 # 'src/gui/main_window.f90',
97 # 'src/gui/toolbar.f90',
98 # 'src/gui/statusbar.f90',
99 # 'src/gui/dialogs.f90',
100 # 'src/gui/menus.f90',
101 ]
102
103 rendering_sources = [
104 # Cairo rendering
105 'src/rendering/treemap_renderer.f90', # Depends on types, disk_scanner, squarified_layout, cairo
106 # 'src/rendering/colors.f90',
107 # 'src/rendering/text_layout.f90',
108 # 'src/rendering/effects.f90',
109 ]
110
111 state_sources = [
112 # Application state (will add later)
113 # 'src/state/app_state.f90',
114 # 'src/state/selection.f90',
115 # 'src/state/config.f90',
116 # 'src/state/scan_manager.f90',
117 ]
118
119 app_sources = [
120 'app/main.f90',
121 ]
122
123 # Combine all sources (C first, then Fortran in dependency order)
124 all_sources = c_sources + core_sources + layout_sources + gui_sources + rendering_sources + state_sources + app_sources
125
126 # Compiler flags
127 fortran = meson.get_compiler('fortran')
128 fortran_args = []
129
130 # Warning flags
131 if fortran.get_id() == 'gcc'
132 fortran_args += [
133 '-Wall',
134 '-Wextra',
135 '-Wimplicit-interface',
136 '-fcheck=all', # Runtime checks in debug mode
137 '-fbacktrace', # Backtrace on error
138 ]
139 endif
140
141 # Linker flags for macOS app bundling
142 # -headerpad_max_install_names reserves space for dylibbundler to rewrite library paths
143 link_args = []
144 if host_machine.system() == 'darwin'
145 link_args += ['-Wl,-headerpad_max_install_names']
146 endif
147
148 # Build executable
149 executable('sniffly',
150 sources: all_sources,
151 dependencies: dependencies,
152 fortran_args: fortran_args,
153 link_args: link_args,
154 install: true,
155 install_dir: get_option('bindir'))
156
157 # Tests (to be added)
158 # subdir('test')
159
160 # Installation
161 # install_man('docs/sniffly.1') # Man page (when created)
162
163 # Configuration summary
164 summary({
165 'Version': meson.project_version(),
166 'Build type': get_option('buildtype'),
167 'Install prefix': get_option('prefix'),
168 'GTK4-Fortran': gtk4_dep.version(),
169 'Cairo': cairo_dep.version(),
170 'Threading': thread_dep.found() ? 'yes' : 'no',
171 }, section: 'Configuration')
172
173 message('===========================================')
174 message('Sniffly configuration complete!')
175 message('Next steps:')
176 message(' 1. Add source files to src/ directories')
177 message(' 2. Uncomment source lists in meson.build')
178 message(' 3. Uncomment executable() to build')
179 message(' 4. Run: meson compile -C build')
180 message('===========================================')
181