bug 5138
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_for_link.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA/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 // Generate a shared library which can be used by link command. 
12 function libn = ilib_for_link(names, ..
13                               files, ..
14                               libs, ..
15                               flag, ..
16                               makename, ..
17                               loadername, ..
18                               libname, ..
19                               ldflags, ..
20                               cflags, ..
21                               fflags, ..
22                               cc)
23
24   [lhs,rhs] = argn(0);
25   if rhs < 4 then
26     error(msprintf(gettext("%s: Wrong number of input argument(s).\n"),"ilib_for_link"));
27     return
28   end
29   
30   if rhs <= 4 then makename = "Makelib";end
31   if rhs <= 5 then loadername = "loader.sce";end
32   if rhs <= 6 then libname = ""; end
33   if rhs <= 7 then ldflags = ""; end 
34   if rhs <= 8 then cflags  = ""; end 
35   if rhs <= 9 then fflags  = ""; end 
36   if rhs <= 10 then cc  = ""; end 
37   
38   if MSDOS then
39     if isdef('makename') then
40       if (makename == []) | (makename == '') then
41         makename = 'makelib';
42       end
43     end
44   end
45   
46   // generate a loader file
47   if ( ilib_verbose() <> 0 ) then
48     mprintf(gettext("   Generate a loader file\n"));
49   end
50   
51   ilib_gen_loader(names,flag,loadername,libs,libname);
52   
53   // bug 4515 - unlink previous function with same name
54   n = size(names,'*');
55   for i = 1:n
56     execstr("[bOK,ilib] = c_link(''" + names(i) + "'');if (bOK) then ulink(ilib),end");
57   end
58   
59   // generate a Makefile
60   if ( ilib_verbose() <> 0 ) then
61     mprintf(gettext("   Generate a Makefile\n"));
62   end
63
64   ilib_link_gen_Make(names, ..
65                      files, ..
66                      libs, ..
67                      makename, ..
68                      libname, ..
69                                  ldflags, ..
70                                  cflags, ..
71                                  fflags, ..
72                                  cc, ..
73                                  flag);
74                                  
75   // we call make
76   if ( ilib_verbose() <> 0 ) then
77     mprintf(gettext("   Running the Makefile\n"));
78   end
79   if (libname == "") then libname = names(1);end
80   libn = ilib_compile('lib' + libname, makename, files);
81   
82   if ( ilib_verbose() <> 0 ) then
83     mprintf(_("   Generate a cleaner file\n"));
84   end
85   ilib_gen_cleaner(makename,loadername,libn);
86
87   
88 endfunction
89 //==========================================
90 function ilib_link_gen_Make(names, ..
91                             files, ..
92                             libs, ..
93                             makename, ..
94                             libname, ..
95                             ldflags, ..
96                             cflags, ..
97                             fflags, ..
98                             cc, ..
99                             flag)
100
101   // generate a Makefile for gateway
102   [lhs,rhs] = argn(0);
103   if rhs <= 2 then libs = [];end
104   if rhs <= 3 then makename = 'Makelib';end
105   if rhs <= 4 then libname = "";end
106   if rhs <= 5 then ldflags = ""; end 
107   if rhs <= 6 then cflags  = ""; end 
108   if rhs <= 7 then fflags  = ""; end 
109   if rhs <= 8 then cc  = ""; end 
110   if rhs <= 9 then flag  = "c"; end 
111   
112   if MSDOS then // Windows
113     // Visual Studio C++ 
114     if ( findmsvccompiler() <> 'unknown' ) then 
115       Makename = makename+'.mak';
116       ilib_link_gen_Make_msvc(names, ..
117                               files, ..
118                               libs, ..
119                               Makename, ..
120                               libname, ..
121                                                 ldflags, ..
122                                                 cflags, ..
123                                                 fflags, ..
124                                                 cc);
125     else
126       // LCC-WIN32
127       if findlcccompiler() then
128         Makename = makename+'.lcc';
129             ilib_link_gen_Make_lcc(names, ..
130                                    files, ..
131                                    libs, ..
132                                    Makename, ..
133                                    libname, ..
134                                    ldflags, ..
135                                    cflags, ..
136                                    fflags, ..
137                                    cc);
138       else
139       // TO DO : Add another compiler here
140       end
141     end
142   
143   else // LINUX
144    Makename = makename;
145
146    ilib_gen_Make_unix(names, ..
147                            files, ..
148                            libs, ..
149                            libname, ..
150                            ldflags, ..
151                            cflags, ..
152                            fflags, ..
153                            cc);
154   end
155   
156 endfunction
157 //==========================================
158 function ilib_link_gen_Make_msvc(names, ..
159                                   files, ..
160                                   libs, ..
161                                   Makename, ..
162                                   libname, ..
163                                   ldflags, ..
164                                   cflags, ..
165                                   fflags, ..
166                                   cc)
167
168   managed_ext = ['.cxx', '.cpp', '.c', '.f90', '.f'];
169   obj_ext = ['.o', '.obj', ''];
170
171   SCIDIR = SCI;
172   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
173   LIBRARY = '';
174   FILES_SRC = '';
175   OBJS = '';
176   OBJS_WITH_PATH = '';
177   FORTRAN_RUNTIME = '';
178   OTHERLIBS = '';
179   CC = cc;
180   CFLAGS = cflags;
181   MEXCFLAGS = '';
182   FFLAGS = fflags;
183   MEXFFLAGS = '';
184   LDFLAGS = ldflags;
185
186   FILES_SRC_MATRIX = [];  
187   
188   [path_Make, file_Make, ext_Make] = fileparts(Makename);
189   
190   for i=1:size(files,'*') 
191     [path_f, file_f, ext_f] = fileparts(files(i));
192
193     if or(obj_ext == ext_f) then
194       FILENAME = [];
195       FILE_FOUNDED = %f;
196       for y = managed_ext(:)'
197         if (FILE_FOUNDED == %f) then
198           if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
199             FILENAME = path_f + file_f + y;
200             FILE_FOUNDED = %t;
201           end
202         end
203       end
204     else
205       FILENAME = files(i);
206     end
207     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
208   end
209
210   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
211   
212   OBJ_DEST_PATH = '';
213   if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
214     OBJ_DEST_PATH = "Release/";
215   else
216     OBJ_DEST_PATH = "Debug/";
217   end
218   
219   OBJS_MATRIX = [];
220   OBJS_WITH_PATH_MATRIX = [];
221   
222   for y = 1:size(FILES_SRC_MATRIX,'*')
223     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
224     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
225     OBJS_WITH_PATH_MATRIX = [OBJS_WITH_PATH_MATRIX, OBJ_DEST_PATH + path_f + file_f + '.obj'];
226   end
227   
228   if ( or(fileext(FILES_SRC_MATRIX) == '.f90') | or(fileext(FILES_SRC_MATRIX) == '.f') ) then
229      if findmsifortcompiler() <> 'unknown' then
230        if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
231          FORTRAN_RUNTIME = 'libifcoremd.lib libmmd.lib';
232        else
233          FORTRAN_RUNTIME = 'libifcoremdd.lib libmmdd.lib';
234        end
235      end
236   end
237   
238   OBJS = strcat(OBJS_MATRIX, ' ');
239   OBJS_WITH_PATH =  strcat(OBJS_WITH_PATH_MATRIX, ' ');
240
241   if (libname == '') then
242     LIBRARY = 'lib' + names(1);
243   else
244     LIBRARY = 'lib' + libname;
245   end
246
247   if (libs <> []) then
248     for x = libs(:)'
249       if x <> '' then
250         OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
251       end
252     end
253   end
254
255   try
256     MAKEFILE_VC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC');
257   catch
258     MAKEFILE_VC = '';
259   end
260   
261   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCI__", SCIDIR);
262   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCIDIR1__", SCIDIR1);
263   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LIBNAME__", LIBRARY);
264   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FILES_SRC__", FILES_SRC);
265   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS__", OBJS);
266   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS_WITH_PATH__", OBJS_WITH_PATH);
267   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FORTRAN_RUNTIME__", FORTRAN_RUNTIME);
268   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OTHERSLIBS__", OTHERLIBS);
269   
270   if CC <> '' then
271     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CC__",CC);
272   else
273     MAKEFILE_VC = strsubst(MAKEFILE_VC, "CC = __CC__","#CC = ");
274   end
275   
276   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CFLAGS__", CFLAGS);
277   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXCFLAGS__", MEXCFLAGS);
278   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FFLAGS__", FFLAGS);
279   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXFFLAGS__", MEXFFLAGS);
280   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LDFLAGS__", LDFLAGS);
281
282   if ( MAKEFILE_VC <> '') then
283     fd = mopen(Makename, "wt");
284     mputl(MAKEFILE_VC, fd);
285     mclose(fd);
286     if ilib_verbose() > 1 then
287       disp(MAKEFILE_VC);
288     end
289   else
290     // TEMPLATE_MAKEFILE.VC not found
291     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC'+ _('not found.') );
292   end
293
294 endfunction
295 //==========================================    
296 function ilib_link_gen_Make_lcc(names, ..
297                                 files, ..
298                                 libs, ..
299                                 Makename, ..
300                                 libname, ..
301                                 ldflags, ..
302                                 cflags, ..
303                                 fflags, ..
304                                 cc)
305                                 
306   managed_ext = ['.c', '.f'];
307   obj_ext = ['.o', '.obj', ''];
308   
309   CFLAGS = cflags;
310   MEXCFLAGS = '';
311   FFLAGS = fflags;
312   MEXFFLAGS = '';
313   LDFLAGS = ldflags;
314   SCIDIR = SCI;
315   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
316   LCCLIBDIR = SCIHOME + filesep() + 'lcclib';
317   LIBRARY = '';
318   FILES_SRC = '';
319   OBJS = '';
320   OTHERLIBS = '';
321   
322   FILES_SRC_MATRIX = [];
323   
324   [path_Make, file_Make, ext_Make] = fileparts(Makename);
325   
326   for i=1:size(files,'*') 
327     [path_f, file_f, ext_f] = fileparts(files(i));
328     
329     if or(obj_ext == ext_f) then
330       FILENAME = [];
331       FILE_FOUNDED = %f;
332       for y = managed_ext(:)'
333         if (FILE_FOUNDED == %f) then
334           if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
335             FILENAME = path_f + file_f + y;
336             FILE_FOUNDED = %t;
337           end
338         end
339       end
340     else
341       FILENAME = files(i);
342     end
343     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
344   end
345   
346   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
347
348   OBJS_MATRIX = [];
349   
350   for y = 1:size(FILES_SRC_MATRIX,'*')
351     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
352     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
353   end
354   
355   OBJS = strcat(OBJS_MATRIX, ' ');
356   
357   if (libname == '') then
358     LIBRARY = 'lib' + names(1);
359   else
360     LIBRARY = 'lib' + libname;
361   end
362   
363   if (libs <> []) then
364     for x = libs(:)'
365       if x <> '' then
366         OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
367       end
368     end
369   end
370   OTHERLIBS = strsubst(OTHERLIBS,'/',filesep());
371
372   try
373     MAKEFILE_LCC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.LCC');
374   catch
375     MAKEFILE_LCC = '';
376   end
377   
378
379   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LDFLAGS__" , LDFLAGS);
380   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__SCI__" , SCIDIR);
381   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__SCIDIR1__" , SCIDIR1);
382   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LCCLIBDIR__" , LCCLIBDIR);
383   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__LIBRARY__" , LIBRARY);
384   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__FILES_SRC__" , FILES_SRC);
385   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__OTHERSLIBS__" , OTHERLIBS);
386   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__CFLAGS__" , CFLAGS);
387   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__MEXCFLAGS__" , MEXCFLAGS);
388   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__FFLAGS__" , FFLAGS);
389   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__MEXFFLAGS__" , MEXFFLAGS);
390   MAKEFILE_LCC = strsubst(MAKEFILE_LCC , "__OBJS__" , OBJS);
391   
392   if ( MAKEFILE_LCC <> '') then
393     fd = mopen(Makename, "wt");
394     mputl(MAKEFILE_LCC, fd);
395     mclose(fd);
396     if ilib_verbose() > 1 then
397       disp(mgetl(Makename));
398     end
399   else
400     // TEMPLATE_MAKEFILE.LCC not found
401     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.LCC'+ _('not found.') );
402   end
403   
404 endfunction
405 //==========================================