6d9a2a367711d23277fdd57e51f2a3d044662ac4
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_gen_Make.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) ENPC
3 // Copyright (C) DIGITEO - 2009 - Allan CORNET
4 // 
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at    
9 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10
11 function Makename=ilib_gen_Make(name,tables,files,libs,makename,with_gateway,ldflags,cflags,fflags,cc)
12 //------------------------------------
13 // generate a Makefile for gateway
14
15   [lhs,rhs] = argn(0);
16   if rhs < 4 then
17     error(msprintf(gettext("%s: Wrong number of input argument(s).\n"), "ilib_gen_Make"));
18     return
19   end
20
21   if argn(2)<6 then with_gateway=%t,ldflags='',cflags='',fflags='', cc='';end
22   for i=1:size(files,'*') // compatibility scilab 4.x
23     [path_f, file_f, ext_f] = fileparts(files(i));
24     if or(ext_f == ['.o','.obj']) then
25       files(i) = path_f + file_f;
26     else
27       files(i) = path_f + file_f + ext_f;
28     end
29   end
30   
31   // change table if necessary 
32   if typeof(tables)<>'list' then 
33     tables= list(tables)
34   end
35   L=length(tables); 
36   for it = 1:L 
37     table = tables(it);
38     [mt,nt]=size(table);
39         
40         if nt==2 then 
41           col= "csci";  // @TODO what is csci
42           table = [table, col(ones(mt,1))];
43           nt=3; 
44         end 
45         
46         if nt<>3 then 
47           error(msprintf(gettext("%s: Wrong size for input argument #%d.\n"),"ilib_gen_Make",2));
48         end 
49         
50         tables(it)=table;
51   end
52       
53   comp_target = COMPILER;
54   if with_lcc() == %T then
55         Makename = makename+'.lcc'
56         ilib_gen_Make_lcc(name,tables,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
57   else if getenv('WIN32','NO')=='OK' then
58     select comp_target
59      case 'VC++'   then Makename = makename+'.mak'
60       ilib_gen_Make_win32(name,tables,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
61      case 'gcc' then 
62       Makename = makename; 
63       ilib_gen_Make_unix(name,files,libs,Makename,with_gateway,ldflags,cflags,fflags,cc,tables)
64     else
65        Makename = makename;
66        ilib_gen_Make_win32(name,tables,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
67     end
68   else
69      Makename = makename;
70      ilib_gen_Make_unix(name,files,libs,name,ldflags,cflags,fflags,cc,tables)
71   end
72   end
73 endfunction
74
75
76 function ilib_gen_Make_win32(name,table,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
77  
78   managed_ext = ['.cxx', '.cpp', '.c', '.f90', '.f'];
79   obj_ext = ['.o', '.obj', ''];
80   
81   SCIDIR = SCI;
82   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
83   LIBRARY = name;
84   FILES_SRC = '';
85   OBJS = '';
86   OBJS_WITH_PATH = '';
87   FORTRAN_RUNTIME = '';
88   OTHERLIBS = '';
89   CC = '';
90   CFLAGS = cflags;
91   MEXCFLAGS = '';
92   FFLAGS = fflags;
93   MEXFFLAGS = '';
94   LDFLAGS = ldflags;
95   
96   FILES_SRC_MATRIX = [];
97   
98   [path_Make, file_Make, ext_Make] = fileparts(Makename);
99   
100   for i=1:size(files,'*') 
101     [path_f, file_f, ext_f] = fileparts(files(i));
102     
103     if or(obj_ext == ext_f) then
104       FILENAME = [];
105       FILE_FOUNDED = %f;
106       for y = managed_ext(:)'
107         if (FILE_FOUNDED == %f) then
108           if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
109             FILENAME = path_f + file_f + y;
110             FILE_FOUNDED = %t;
111           end
112         end
113       end
114     else
115       FILENAME = files(i);
116     end
117     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
118   end
119   
120   if typeof(tables) <> 'list' then 
121     tables = list(tables);
122   end
123   L = length(tables); 
124
125   if with_gateway then 
126     if L == 1 then 
127       FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + '.c'];
128     else
129        for i=1:L
130         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + '.c'];
131        end 
132     end
133   end
134
135   for it=1:L 
136     table = tables(it);
137     [mt,nt] = size(table);
138  
139     for i=1:mt  
140       if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' then
141         MEXCFLAGS = "-Dmexfunction_=mex" + table(i,2) + "_ -DmexFunction=mex_" + table(i,2);
142         MEXFFLAGS = "-Dmexfunction=mex" + table(i,2);
143         if table(i,3)=='cmex' then
144           filenameMex = table(i,2) + '.c';
145         else
146           filenameMex = table(i,2) + '.f';
147         end
148         if grep(FILES_SRC_MATRIX,filenameMex) == [] then
149           FILES_SRC_MATRIX = [FILES_SRC_MATRIX , filenameMex];
150         end
151       end
152     end
153   end
154
155   
156   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
157   
158
159   OBJ_DEST_PATH = '';
160   if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
161     OBJ_DEST_PATH = "Release/";
162   else
163     OBJ_DEST_PATH = "Debug/";
164   end
165   
166   OBJS_MATRIX = [];
167   OBJS_WITH_PATH_MATRIX = [];
168   
169   for y = 1:size(FILES_SRC_MATRIX,'*')
170     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
171     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
172     OBJS_WITH_PATH_MATRIX = [OBJS_WITH_PATH_MATRIX, OBJ_DEST_PATH + path_f + file_f + '.obj'];
173   end
174   
175   OBJS = strcat(OBJS_MATRIX, ' ');
176   OBJS_WITH_PATH =  strcat(OBJS_WITH_PATH_MATRIX, ' ');
177
178   if ( or(fileext(FILES_SRC_MATRIX) == '.f90') | or(fileext(FILES_SRC_MATRIX) == '.f') ) then
179     if findmsifortcompiler() <> 'unknown' then
180       if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
181         FORTRAN_RUNTIME = 'libifcoremd.lib libmmd.lib';
182       else
183         FORTRAN_RUNTIME = 'libifcoremdd.lib libmmdd.lib';
184       end
185     end
186   end
187   
188   for x=libs(:)'
189      if OTHERLIBS <> '' then
190        OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
191      else
192        OTHERLIBS = x + '.lib';
193      end 
194   end
195
196   try
197     MAKEFILE_VC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC');
198   catch
199     MAKEFILE_VC = '';
200   end
201   
202   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCI__", SCIDIR);
203   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCIDIR1__", SCIDIR1);
204   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LIBNAME__", LIBRARY);
205   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FILES_SRC__", FILES_SRC);
206   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS__", OBJS);
207   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS_WITH_PATH__", OBJS_WITH_PATH);
208   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FORTRAN_RUNTIME__", FORTRAN_RUNTIME);
209   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OTHERSLIBS__", OTHERLIBS);
210   
211   if CC <> '' then
212     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CC__",CC);
213   else
214     MAKEFILE_VC = strsubst(MAKEFILE_VC, "CC = __CC__","#CC = ");
215   end
216   
217   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CFLAGS__", CFLAGS);
218   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXCFLAGS__", MEXCFLAGS);
219   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FFLAGS__", FFLAGS);
220   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXFFLAGS__", MEXFFLAGS);
221   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LDFLAGS__", LDFLAGS);
222
223   if ( MAKEFILE_VC <> '') then
224     fd = mopen(Makename, "wt");
225     mputl(MAKEFILE_VC, fd);
226     mclose(fd);
227     
228     if ilib_verbose() > 1 then
229       disp(MAKEFILE_VC);
230     end
231     
232   else
233     // TEMPLATE_MAKEFILE.VC not found
234     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC'+ _('not found.') );
235   end
236 endfunction
237 //---------------------------------------------------------------------------------------
238          
239 function ilib_gen_Make_lcc(name,table,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
240   managed_ext = ['.c', '.f'];
241   obj_ext = ['.o', '.obj', ''];
242   
243   CFLAGS = cflags;
244   MEXCFLAGS = '';
245   FFLAGS = fflags;
246   MEXFFLAGS = '';
247   LDFLAGS = ldflags;
248   SCIDIR = SCI;
249   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
250   LCCLIBDIR = SCIHOME + filesep() + 'lcclib';
251   LIBRARY = name;
252   FILES_SRC = '';
253   OBJS = '';
254   OTHERLIBS = '';
255
256   
257   FILES_SRC_MATRIX = [];
258   
259   [path_Make, file_Make, ext_Make] = fileparts(Makename);
260   
261   for i=1:size(files,'*') 
262     [path_f, file_f, ext_f] = fileparts(files(i));
263     
264     if or(obj_ext == ext_f) then
265       FILENAME = [];
266       FILE_FOUNDED = %f;
267       for y = managed_ext(:)'
268         if (FILE_FOUNDED == %f) then
269           if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
270             FILENAME = path_f + file_f + y;
271             FILE_FOUNDED = %t;
272           end
273         end
274       end
275     else
276       FILENAME = files(i);
277     end
278     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
279   end
280
281   if typeof(tables) <> 'list' then 
282     tables = list(tables);
283   end
284   L = length(tables); 
285
286   if with_gateway then 
287     if L == 1 then 
288       FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + '.c'];
289     else
290        for i=1:L
291         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + '.c'];
292        end 
293     end
294   end
295   
296   for it=1:L 
297     table = tables(it);
298     [mt,nt] = size(table);
299  
300     for i=1:mt ; 
301       // mex files to be added 
302       if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' 
303         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , table(i,2)];
304       end
305     end
306   end
307   
308   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
309   
310   if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' then
311     MEXCFLAGS = "-Dmexfunction_=mex$*_ -DmexFunction=mex_$*";
312     MEXFFLAGS = "-Dmexfunction=mex$*";
313   end 
314
315   OBJS_MATRIX = [];
316   
317   for y = 1:size(FILES_SRC_MATRIX,'*')
318     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
319     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
320   end
321   
322   OBJS = strcat(OBJS_MATRIX, ' ');
323
324   for x=libs(:)'
325      if OTHERLIBS <> '' then
326        OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
327      else
328        OTHERLIBS = x + '.lib';
329      end 
330   end
331   OTHERLIBS = strsubst(OTHERLIBS,'/',filesep());
332
333   try
334     MAKEFILE_LCC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.LCC');
335   catch
336     MAKEFILE_LCC = '';
337   end
338
339   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LDFLAGS__" , LDFLAGS);
340   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__SCI__" , SCIDIR);
341   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__SCIDIR1__" , SCIDIR1);
342   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LCCLIBDIR__" , LCCLIBDIR);
343   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LIBRARY__" , LIBRARY);
344   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__FILES_SRC__" , FILES_SRC);
345   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__OTHERSLIBS__" , OTHERLIBS);
346   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__CFLAGS__" , CFLAGS);
347   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__MEXCFLAGS__" , MEXCFLAGS);
348   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__FFLAGS__" , FFLAGS);
349   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__MEXFFLAGS__" , MEXFFLAGS);
350   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__OBJS__" , OBJS);
351   
352   if ( MAKEFILE_LCC <> '') then
353     fd = mopen(Makename, "wt");
354     mputl(MAKEFILE_LCC, fd);
355     mclose(fd);
356     
357     if ilib_verbose() > 1 then
358       disp(mgetl(Makename));
359     end
360   else
361     // TEMPLATE_MAKEFILE.LCC not found
362     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.LCC'+ _('not found.') );
363   end
364  
365 endfunction
366 //---------------------------------------------------------------------------------------