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