Fix a long standing bug in Scilab.
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_compile.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) ENPC
4 // Copyright (C) DIGITEO - 2009
5 // 
6 // This file must be used under the terms of the CeCILL.
7 // This source file is licensed as described in the file COPYING, which
8 // you should have received as part of this distribution.  The terms
9 // are also available at    
10 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 function libn = ilib_compile(lib_name,makename,files, ..
12                                                          ldflags, ..
13                                                          cflags, ..
14                                                          fflags, ..
15                                                          cc)
16
17
18   libn=""; //** init variable 
19
20   if ~haveacompiler() then
21         error(_("A Fortran or C compiler is required."))
22         return;
23   end
24
25   [lhs,rhs]=argn(0);
26   
27   if rhs < 3 then files = []; end 
28   
29   if typeof(lib_name)<>'string' then
30     error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"),"ilib_compile",1));
31     return ;
32   end
33   
34   oldpath = pwd();
35   files = files(:)';
36   
37   managed_ext = ['.obj','.o'];
38   for i=1:size(files,'*') // compatibility scilab 4.x
39     [path_f, file_f, ext_f] = fileparts(files(i));
40     if or(managed_ext == ext_f) then
41       files1(i) = path_f + file_f;
42     else
43       files1(i) = path_f + file_f + ext_f;
44     end
45   end
46   
47   [make_command,lib_name_make,lib_name,path,makename,files]= ...
48       ilib_compile_get_names(lib_name,makename,files);
49
50   if path<> '';  chdir(path);  end 
51   
52    
53   // first try to build each file step by step 
54   if MSDOS then
55     //** ----------- Windows section  -----------------
56     msgs_make = '';
57     nf = size(files,'*');
58     
59     for i=1:nf
60       if ( ilib_verbose() <> 0 ) then
61         mprintf(_("   Compilation of ") + string(files1(i)) +'\n');
62       end
63     end
64     
65     // then the shared library 
66     if ( ilib_verbose() <> 0 ) then
67       mprintf(_("   Building shared library (be patient)\n"));
68     end
69     
70     // TO DO : Check if it is always needed ...
71     if ilib_verbose() > 1 then
72       msg = unix_g(make_command + makename + ' all'); 
73       disp(msg);
74     else
75       unix_s(make_command + makename + ' all'); 
76     end
77    
78   else
79     //** ---------- Linux/MacOS/Unix section ---------------------  
80         
81         ScilabTreeFound=%f
82
83     // Source tree version
84         // Headers are dispatched in the source tree
85         if isdir(SCI+"/modules/core/includes/") then
86           defaultModulesCHeader=[ "core", "mexlib","api_scilab","output_stream","localization" ];
87           defaultModulesFHeader=[ "core" ];
88           ScilabTreeFound=%t
89
90           for x = defaultModulesCHeader(:)' 
91               cflags=" -I"+SCI+"/modules/"+x+"/includes/ "+cflags;
92           end
93           cflags=" -I"+SCI+"/libs/MALLOC/includes/ " + cflags;
94
95           for x = defaultModulesFHeader(:)' 
96                   fflags=" -I"+SCI+"/modules/"+x+"/includes/ " + fflags;
97           end
98         end
99
100         // Binary version
101         if isdir(SCI+"/../../include/scilab/") && ScilabTreeFound == %t then
102           cflags="-I"+SCI+"/../../include/scilab/ " + cflags
103           fflags="-I"+SCI+"/../../include/scilab/ " + fflags
104           ScilabTreeFound=%t
105         end
106
107         // System version (ie: /usr/include/scilab/)    
108         if isdir("/usr/include/scilab/") && ScilabTreeFound == %t then
109            cflags="-I/usr/include/scilab/ "+cflags
110            fflags="-I/usr/include/scilab/ "+fflags
111         end
112
113         if ( ilib_verbose() <> 0 ) then
114            mprintf(gettext("%s: Warning: Scilab has not been able to find where the Scilab sources are. Please submit a bug report on http://bugzilla.scilab.org/\n"),"ilib_compile");  
115         end
116
117       oldPath = pwd();
118           // Switch back to the TMPDIR where the mandatory files are
119           chdir(TMPDIR);
120           cmd = "make "
121           
122           cmd = cmd + gencompilationflags_unix(ldflags, cflags, fflags, cc)
123
124     //** BEWARE : this function can cause errors if used with "old style" Makefile inside a Scilab 5
125     //**          environment where the Makefile are created from a "./configure"  
126           [msg, ierr, stderr] = unix_g(cmd) ; 
127
128             if ( ilib_verbose() == 2 ) then
129                    mprintf(gettext("%s: Build command: %s\n"),"ilib_compile",cmd);
130                    mprintf(gettext("Output: %s\n"),msg);
131                    mprintf(gettext("stderr: %s\n"),stderr);
132                 end
133           if ierr <> 0 then
134             if ( ilib_verbose() <> 0 ) then
135               mprintf(gettext("%s: An error occured during the compilation:\n"),"ilib_compile");
136               lines(0);
137               disp(stderr);
138                     mprintf("\n");
139                     mprintf(gettext("%s: The command was:\n"),"ilib_compile");
140                     mprintf(cmd);
141                     mprintf("\n");
142                   end
143                   chdir(oldPath); // Go back to the working dir
144             return ;
145           end
146           if stderr <> "" then
147             if ( ilib_verbose() <> 0 ) then
148               mprintf(gettext("%s: Warning: No error code returned by the compilation but the error output is not empty:\n"),"ilib_compile");
149               mprintf(stderr);
150             end
151             return ;
152           end
153
154           // Copy the produce lib to the working path
155           copyfile(".libs/" + lib_name, oldPath);
156   end
157         
158   libn = path + lib_name_make ; 
159   chdir(oldpath);
160   
161 endfunction
162 //==========================================
163
164 //==========================================
165 // function only defined in ilib_compile
166 //==========================================
167 function [make_command,lib_name_make,lib_name,path,makename,files] = ilib_compile_get_names(lib_name,makename,files) 
168   
169   managed_ext = ['.obj','.o'];
170   for i=1:size(files,'*') // compatibility scilab 4.x
171     [path_f, file_f, ext_f] = fileparts(files(i));
172     if or(managed_ext == ext_f) then
173       files(i) = path_f + file_f;
174     else
175       files(i) = path_f + file_f + ext_f;
176     end
177   end
178     
179   k = strindex(makename,['/','\']);
180   
181   if k~=[] then
182     path = part(makename,1:k($));
183     makename = part(makename,k($)+1:length(makename));
184   else
185      path='';
186   end
187   
188   lib_name = lib_name+getdynlibext();
189   lib_name_make = lib_name;
190   
191   if MSDOS then // WINDOWS
192     FILES = [];
193     for x = files(:)' 
194       [ptmp,ftmp,fext] = fileparts(x);
195       FILES = [FILES,ptmp+ftmp];
196     end
197     
198     // Visual Studio C++ 
199     if ( findmsvccompiler() <> 'unknown' ) then 
200       makename = makename + '.mak' ; 
201       make_command = 'nmake /Y /nologo /f '
202     else
203       // LCC-WIN32
204       if findlcccompiler() then
205         makename = makename + '.lcc' ; 
206         make_command = 'make -f ';
207       else
208       // TO DO : Add another compiler here
209       end
210       
211     end
212     if FILES<>[] then 
213       files = FILES + '.obj' ;
214     end
215   else // LINUX
216   
217     make_command = 'make '; 
218     
219     if files <> [] then 
220       files = files + '.o';
221     end
222     
223   end
224   
225 endfunction 
226
227 //==========================================