Fix #8039 - library support and add back roopacker dependancy
[roobuilder] / src / Project / Meson.vala
1 /**
2  write meson build so that the language server works..
3 */
4
5 namespace Project {
6
7         public class Meson : Object {
8         
9                 Gtk project;
10                 public Meson(Gtk project) 
11                 {
12                         this.project = project;
13                 }
14                 
15                 public void save()
16                 {
17                         this.has_resources = false;
18                         var project_name = this.project.name;
19                         var project_version =  this.project.version;
20                         var project_licence =   this.project.licence;
21
22                         var deps = "";
23                         foreach(var p in this.project.packages) {
24                                 if (p == "posix" ) {
25                                         deps += "   valac.find_library('" + p  + "'),\n";
26                                 } else {
27                                         deps += "   dependency('" + p  + "'),\n";                               
28                                 }
29                         }
30                         /*
31                           dependency('glib-2.0'),
32                                 dependency('gobject-2.0'), << for others.. ut will this wrok using find_lib for all?
33                                 valac.find_library('posix'), << for posix
34                         */
35
36                         // ?? why use subdir ?? seems pointless?
37                         
38                         //subdir('src')
39
40                         var addvapidir = "";
41                         foreach(var p in this.project.vapidirs()) {
42                                 addvapidir += "add_project_arguments(['--vapidir',  meson.current_source_dir() / '" + p + "'], language: 'vala')\n";
43                         }
44                         //vapi_dir = meson.current_source_dir() / 'vapi'
45                         //add_project_arguments(['--vapidir', vapi_dir], language: 'vala')
46
47                         var targets = "";
48                         var icons = "";
49                         var desktops = "";
50                         
51                         var resources = this.addResources();
52                         
53                         foreach(var cg in this.project.compilegroups.values) {
54                                 targets += this.addTarget(cg);
55                                 icons += this.addIcons(cg);
56                                 desktops += this.addDesktop(cg);
57                         }
58                         
59
60                         
61                         var data = 
62
63 @"project('$project_name', 'vala', 'c',
64   version: '$project_version',
65   license: '$project_licence',
66   default_options: [
67     'default_library=static',
68     'c_std=gnu11'       # for C subprojects
69   ]
70 )
71 gnome = import('gnome')
72
73 valac = meson.get_compiler('vala')
74
75 extra_vala_sources = []
76
77 $addvapidir
78
79 deps = [
80 $deps
81 ]
82  
83 # let Vala add the appropriate defines for GLIB_X_X
84 add_project_arguments(['--target-glib=auto'], language: 'vala')
85
86  
87
88 conf = configuration_data()
89 conf.set('PROJECT_NAME', meson.project_name())
90
91 $addvapidir
92
93 $icons
94
95 $resources
96
97 $desktops
98
99 $targets
100 ";              
101
102 GLib.debug("write meson : %s" , data);
103 // removed.. add_project_arguments(['--enable-gobject-tracing', '--fatal-warnings'], language: 'vala')
104
105                         try {
106                                 FileUtils.set_contents(this.project.path + "/meson.build", data, data.length);
107                         } catch (GLib.Error e) {
108                                 GLib.error("failed  to save file %s", e.message);
109                         }
110                                 
111                 }
112                 
113                 string addTarget(GtkValaSettings cg)
114                 {
115                         
116                         var str = cg.name + "_src = files([\n";
117                         foreach(var s in cg.sources) {
118                                 var f= this.project.getByPath(this.project.path + "/" +  s);
119                                 if (f == null) {
120                                         continue;
121                                 }
122                                 var add =  f.relTargetName();
123                                 if (add.length  > 0) {
124                                         str += "   '" + add + "',\n";
125                                 }
126                         }
127                         str += "])\n\n";
128                         
129                         var resources = this.has_resources ? (", " + this.project.name + "_resources") : "";
130  
131                         
132                         str +=  cg.writeMesonExe(resources);
133
134                         return str;
135                 }
136                 
137                 string addIcons(GtkValaSettings cg)
138                 {
139                          
140                         var ret = "";
141                         string[] sizes = { "16x16", "22x22","24x24","32x32", "48x48" } ;
142                         foreach(var size in sizes) {
143                                 GLib.debug("looking for on : %s" ,  "pixmaps/" + size + "/apps/" + cg.name  + ".png");
144                                 var img = this.project.getByRelPath( "pixmaps/" + size + "/apps/" + cg.name  + ".png");
145                                 if (img == null) {
146                                         continue;
147                                 }
148                                 var path = img.relpath;
149                                 ret += @"
150 install_data(
151         '$path',
152         install_dir:  get_option('datadir') + '/icons/hicolor/$size/apps/'
153 )
154 ";
155                         }
156                         if (ret == "") {
157                                 return "";
158                         }
159                         ret += "
160
161 gnome.post_install(gtk_update_icon_cache : true)
162 ";
163                         return ret;
164                 }
165                 
166                 string addDesktop(GtkValaSettings cg)
167                 {
168                         // we could actually generate this!?!
169                         var d  = this.project.getByRelPath(   cg.name  + ".desktop");
170                         if (d == null) {
171                                 return "";
172                         }
173                         var path = d.relpath;
174                         return @"
175 install_data(
176         '$path',
177         install_dir : get_option('datadir') + '/applications/'
178 )
179 ";
180                 }
181                 bool has_resources = false;
182                 
183                 string addResources()
184                 {
185                 
186                         if (this.project.findDir(this.project.path + "/resources") == null) {
187                                 GLib.debug("no  resources folder");
188                                 return "";
189                         }
190                         var ar = this.project.pathsUnder("resources");
191                         if (ar.size < 1) {
192                         GLib.debug("no paths under resources");
193                                 return "";
194                         }
195                         // should probably use DOM (but this is a quick dirty fix
196                         var gr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<gresources>";
197                         string[] paths = {};
198                         foreach(var dir in ar) {
199                                 if (dir.childfiles.get_n_items() < 1) {
200                                         continue;
201                                 }
202                                 var sp = dir.relpath.substring(10);
203                                 gr += @"  <gresource prefix=\"/$sp\">\n";
204                                 for (var i = 0; i < dir.childfiles.get_n_items(); i++) {
205                                         var f = (dir.childfiles.get_item(i) as JsRender.JsRender);
206                                         if (f.xtype != "PlainFile") {
207                                                 continue;
208                                         }
209                                         var fn = f.name;
210                                     gr +=  @"    <file>$fn</file>\n";
211                                 }
212                                 paths += ("'" + dir.relpath +"'");
213                                 gr += "  </gresource>\n";
214
215                         
216                         }
217                         gr += "</gresources>\n";
218                         try {
219                                 FileUtils.set_contents(this.project.path + "/resources/gresources.xml", gr, gr.length);
220                         } catch (GLib.Error e) { 
221                                 return "";
222                         }
223                          
224                         
225                         
226                         this.has_resources = true;
227                         
228                         return  "
229 " + this.project.name + "_resources = gnome.compile_resources(
230         '" + this.project.name + "-resources', 'resources/gresources.xml',
231         source_dir: [ " + string.joinv(", ", paths) + " ],
232         c_name: '" + this.project.name + "_resources' 
233 )";
234                         
235                   
236                 
237                 }
238                 
239                 
240                 
241         } 
242 }