bug 5138
[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     if isdef('makename') then
56       if (makename == []) | (makename == '') then
57         makename = 'makelib';
58       end
59     end
60     Makename = makename + '.lcc';
61     ilib_gen_Make_lcc(name,tables,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
62   else if getenv('WIN32','NO')=='OK' then
63     if isdef('makename') then
64       if (makename == []) | (makename == '') then
65         makename = 'makelib';
66       end
67     end
68     select comp_target
69      case 'VC++'   then Makename = makename + '.mak';
70       ilib_gen_Make_win32(name,tables,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
71      case 'gcc' then 
72       Makename = makename; 
73       ilib_gen_Make_unix(name,files,libs,Makename,with_gateway,ldflags,cflags,fflags,cc,tables)
74     else
75        Makename = makename;
76        ilib_gen_Make_win32(name,tables,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
77     end
78   else
79      Makename = makename;
80      ilib_gen_Make_unix(name,files,libs,name,ldflags,cflags,fflags,cc,tables)
81   end
82   end
83 endfunction
84
85
86 function ilib_gen_Make_win32(name,table,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
87  
88   managed_ext = ['.cxx', '.cpp', '.c', '.f90', '.f'];
89   obj_ext = ['.o', '.obj', ''];
90   
91   SCIDIR = SCI;
92   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
93   LIBRARY = name;
94   FILES_SRC = '';
95   OBJS = '';
96   OBJS_WITH_PATH = '';
97   FORTRAN_RUNTIME = '';
98   OTHERLIBS = '';
99   CC = '';
100   CFLAGS = cflags;
101   MEXCFLAGS = '';
102   FFLAGS = fflags;
103   MEXFFLAGS = '';
104   LDFLAGS = ldflags;
105   
106   FILES_SRC_MATRIX = [];
107   
108   [path_Make, file_Make, ext_Make] = fileparts(Makename);
109   
110   for i=1:size(files,'*') 
111     [path_f, file_f, ext_f] = fileparts(files(i));
112     
113     if or(obj_ext == ext_f) then
114       FILENAME = [];
115       FILE_FOUNDED = %f;
116       for y = managed_ext(:)'
117         if (FILE_FOUNDED == %f) then
118           if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
119             FILENAME = path_f + file_f + y;
120             FILE_FOUNDED = %t;
121           end
122         end
123       end
124     else
125       FILENAME = files(i);
126     end
127     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
128   end
129   
130   if typeof(tables) <> 'list' then 
131     tables = list(tables);
132   end
133   L = length(tables); 
134
135   if with_gateway then 
136     if L == 1 then 
137       FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + '.c'];
138     else
139        for i=1:L
140         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + '.c'];
141        end 
142     end
143   end
144
145   for it=1:L 
146     table = tables(it);
147     [mt,nt] = size(table);
148  
149     for i=1:mt  
150       if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' then
151         MEXCFLAGS = "-Dmexfunction_=mex" + table(i,2) + "_ -DmexFunction=mex_" + table(i,2);
152         MEXFFLAGS = "-Dmexfunction=mex" + table(i,2);
153         if table(i,3)=='cmex' then
154           filenameMex = table(i,2) + '.c';
155         else
156           filenameMex = table(i,2) + '.f';
157         end
158         if grep(FILES_SRC_MATRIX,filenameMex) == [] then
159           FILES_SRC_MATRIX = [FILES_SRC_MATRIX , filenameMex];
160         end
161       end
162     end
163   end
164
165   
166   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
167   
168
169   OBJ_DEST_PATH = '';
170   if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
171     OBJ_DEST_PATH = "Release/";
172   else
173     OBJ_DEST_PATH = "Debug/";
174   end
175   
176   OBJS_MATRIX = [];
177   OBJS_WITH_PATH_MATRIX = [];
178   
179   for y = 1:size(FILES_SRC_MATRIX,'*')
180     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
181     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
182     OBJS_WITH_PATH_MATRIX = [OBJS_WITH_PATH_MATRIX, OBJ_DEST_PATH + path_f + file_f + '.obj'];
183   end
184   
185   OBJS = strcat(OBJS_MATRIX, ' ');
186   OBJS_WITH_PATH =  strcat(OBJS_WITH_PATH_MATRIX, ' ');
187
188   if ( or(fileext(FILES_SRC_MATRIX) == '.f90') | or(fileext(FILES_SRC_MATRIX) == '.f') ) then
189     if findmsifortcompiler() <> 'unknown' then
190       if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
191         FORTRAN_RUNTIME = 'libifcoremd.lib libmmd.lib';
192       else
193         FORTRAN_RUNTIME = 'libifcoremdd.lib libmmdd.lib';
194       end
195     end
196   end
197   
198   for x=libs(:)'
199      if OTHERLIBS <> '' then
200        OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
201      else
202        OTHERLIBS = x + '.lib';
203      end 
204   end
205
206   try
207     MAKEFILE_VC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC');
208   catch
209     MAKEFILE_VC = '';
210   end
211   
212   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCI__", SCIDIR);
213   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCIDIR1__", SCIDIR1);
214   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LIBNAME__", LIBRARY);
215   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FILES_SRC__", FILES_SRC);
216   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS__", OBJS);
217   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS_WITH_PATH__", OBJS_WITH_PATH);
218   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FORTRAN_RUNTIME__", FORTRAN_RUNTIME);
219   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OTHERSLIBS__", OTHERLIBS);
220   
221   if CC <> '' then
222     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CC__",CC);
223   else
224     MAKEFILE_VC = strsubst(MAKEFILE_VC, "CC = __CC__","#CC = ");
225   end
226   
227   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CFLAGS__", CFLAGS);
228   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXCFLAGS__", MEXCFLAGS);
229   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FFLAGS__", FFLAGS);
230   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXFFLAGS__", MEXFFLAGS);
231   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LDFLAGS__", LDFLAGS);
232
233   if ( MAKEFILE_VC <> '') then
234     fd = mopen(Makename, "wt");
235     mputl(MAKEFILE_VC, fd);
236     mclose(fd);
237     
238     if ilib_verbose() > 1 then
239       disp(MAKEFILE_VC);
240     end
241     
242   else
243     // TEMPLATE_MAKEFILE.VC not found
244     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC'+ _('not found.') );
245   end
246 endfunction
247 //---------------------------------------------------------------------------------------
248          
249 function ilib_gen_Make_lcc(name,table,files,libs,Makename,with_gateway,ldflags,cflags,fflags)
250   managed_ext = ['.c', '.f'];
251   obj_ext = ['.o', '.obj', ''];
252   
253   CFLAGS = cflags;
254   MEXCFLAGS = '';
255   FFLAGS = fflags;
256   MEXFFLAGS = '';
257   LDFLAGS = ldflags;
258   SCIDIR = SCI;
259   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
260   LCCLIBDIR = SCIHOME + filesep() + 'lcclib';
261   LIBRARY = name;
262   FILES_SRC = '';
263   OBJS = '';
264   OTHERLIBS = '';
265
266   
267   FILES_SRC_MATRIX = [];
268   
269   [path_Make, file_Make, ext_Make] = fileparts(Makename);
270   
271   for i=1:size(files,'*') 
272     [path_f, file_f, ext_f] = fileparts(files(i));
273     
274     if or(obj_ext == ext_f) then
275       FILENAME = [];
276       FILE_FOUNDED = %f;
277       for y = managed_ext(:)'
278         if (FILE_FOUNDED == %f) then
279           if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
280             FILENAME = path_f + file_f + y;
281             FILE_FOUNDED = %t;
282           end
283         end
284       end
285     else
286       FILENAME = files(i);
287     end
288     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
289   end
290
291   if typeof(tables) <> 'list' then 
292     tables = list(tables);
293   end
294   L = length(tables); 
295
296   if with_gateway then 
297     if L == 1 then 
298       FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + '.c'];
299     else
300        for i=1:L
301         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + '.c'];
302        end 
303     end
304   end
305   
306   for it=1:L 
307     table = tables(it);
308     [mt,nt] = size(table);
309  
310     for i=1:mt ; 
311       // mex files to be added 
312       if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' 
313         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , table(i,2)];
314       end
315     end
316   end
317   
318   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
319   
320   if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' then
321     MEXCFLAGS = "-Dmexfunction_=mex$*_ -DmexFunction=mex_$*";
322     MEXFFLAGS = "-Dmexfunction=mex$*";
323   end 
324
325   OBJS_MATRIX = [];
326   
327   for y = 1:size(FILES_SRC_MATRIX,'*')
328     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
329     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
330   end
331   
332   OBJS = strcat(OBJS_MATRIX, ' ');
333
334   for x=libs(:)'
335      if OTHERLIBS <> '' then
336        OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
337      else
338        OTHERLIBS = x + '.lib';
339      end 
340   end
341   OTHERLIBS = strsubst(OTHERLIBS,'/',filesep());
342
343   try
344     MAKEFILE_LCC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.LCC');
345   catch
346     MAKEFILE_LCC = '';
347   end
348
349   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LDFLAGS__" , LDFLAGS);
350   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__SCI__" , SCIDIR);
351   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__SCIDIR1__" , SCIDIR1);
352   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LCCLIBDIR__" , LCCLIBDIR);
353   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LIBRARY__" , LIBRARY);
354   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__FILES_SRC__" , FILES_SRC);
355   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__OTHERSLIBS__" , OTHERLIBS);
356   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__CFLAGS__" , CFLAGS);
357   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__MEXCFLAGS__" , MEXCFLAGS);
358   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__FFLAGS__" , FFLAGS);
359   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__MEXFFLAGS__" , MEXFFLAGS);
360   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__OBJS__" , OBJS);
361   
362   if ( MAKEFILE_LCC <> '') then
363     fd = mopen(Makename, "wt");
364     mputl(MAKEFILE_LCC, fd);
365     mclose(fd);
366     
367     if ilib_verbose() > 1 then
368       disp(mgetl(Makename));
369     end
370   else
371     // TEMPLATE_MAKEFILE.LCC not found
372     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.LCC'+ _('not found.') );
373   end
374  
375 endfunction
376 //---------------------------------------------------------------------------------------