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