Updated TODO.
[mp-5.x.git] / mp_build.mpsl
blob1e9baa02772183bd077dc9b0cf9c25b13cd20ba8
1 /*
3     Minimum Profit 5.x
4     A Programmer's Text Editor
6     A simple IDE-like build system.
8     Copyright (C) 1991-2011 Angel Ortega <angel@triptico.com>
10     This program is free software; you can redistribute it and/or
11     modify it under the terms of the GNU General Public License
12     as published by the Free Software Foundation; either version 2
13     of the License, or (at your option) any later version.
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24     http://www.triptico.com
28 /** editor actions **/
30 mp.actions['build']     = sub(doc) {
32         local t, target;
34         if ((t = mp.build_get_targets()) == NULL) {
35                 mp.alert(L("No Makefile targets found."));
36                 return;
37         }
39         /* more than one target? ask user to pick one */
40         if (size(t) > 1) {
41                 local r = mp.form( [
42                         { 'label'       => L("Makefile target") ~ ':',
43                           'type'        => 'list',
44                           'list'        => t }
45                         ]);
47                 if (r == NULL)
48                         return;
50                 if (r[0] == 0)
51                         target = '';
52                 else
53                         target = t[r[0]];
54         }
56         mp.long_op(mp.build_execute, target);
60 mp.actions['insert_next_item'] = sub(doc) {
61         local n = 0;
63         foreach (l, doc.txt.lines) {
64                 local r = regex(l, ['/^ \* /', '/[0-9]+/', '/: /']);
66                 if (r[1] > n)
67                         n = r[1];
68         }
70         mp.store_undo(doc);
71         mp.insert(doc, ' * ' ~ (n + 1) ~ ': ');
74 /** Default key bindings **/
76 mp.keycodes['f2'] = "build";
78 /** action descriptions **/
80 mp.actdesc['build'] = LL("Build project...");
81 mp.actdesc['insert_next_item'] = LL("Insert next item");
84 /** code **/
86 sub mp.build_get_targets
88         local r, f;
90         if ((f = open('Makefile', 'r')) != NULL) {
91                 local l;
93                 r = [ '<default>' ];
95                 while (l = read(f)) {
96                         local t;
98                         if (t = regex(l, '/^[A-Za-z0-9_\.-]+:/'))
99                                 push(r, sregex(t, '/:/', ''));
100                 }
102                 close(f);
103         }
105         return r;
109 sub mp.build_execute(target)
111         local log = mp.open('<make output>');
113         log.txt.lines = [];
114         log.txt.y = 0;
116         /* pipe through make */
117         local p;
118         if ((p = popen('make ' ~ target, 'r')) != NULL) {
119                 local l;
121                 while (l = read(p))
122                         mp.insert(log, l);
124                 pclose(p);
126                 log.txt.mod = 0;
127                 log.read_only = 1;
129                 log.syntax = mp.syntax.make_output;
131                 mp.move_bof(log);
133                 /* set the last search regex to match file:line strings,
134                    so that calling seek-next and seek-prev moves there */
135                 mp.last_search = '/^[a-z\.\_0-9\/-]+:[0-9]+:/m';
137         mp.redraw();
138         }