8f56af93292761b7435920605e475dadbe425127
[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-2011 - 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   // The name of the library starts by "lib", strip it
29   lib_name_orig = strsubst(lib_name,"/^lib/","","r");
30
31   libn=""; //** init variable
32
33   if ~haveacompiler() then
34     error(_("A Fortran or C compiler is required."))
35     return;
36   end
37
38   [lhs,rhs]=argn(0);
39
40   if rhs < 3 then
41     files = [];
42   else
43     if ~isempty(files) & (or(fileext(files)==".o") | or(fileext(files)==".obj")) then
44       error(999, msprintf(_("%s: A managed file extension for input argument #%d expected."), "ilib_compile", 3));
45     end
46   end
47
48   if typeof(lib_name)<>"string" then
49     error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"),"ilib_compile",1));
50     return ;
51   end
52
53   oldpath = pwd();
54   files = files(:)';
55
56   [make_command, lib_name_make, lib_name, path, makename, files]= ...
57       ilib_compile_get_names(lib_name, makename, files);
58
59   if isdir(path) then
60     chdir(path);
61   end
62
63   if getos() == "Windows" then
64     //** ----------- Windows section  -----------------
65     msgs_make = "";
66     nf = size(files,"*");
67
68     for i=1:nf
69       if ( ilib_verbose() <> 0 ) then
70         mprintf(_("   Compilation of ") + string(files(i)) +"\n");
71       end
72     end
73
74     // then the shared library
75     if ( ilib_verbose() <> 0 ) then
76       mprintf(_("   Building shared library (be patient)\n"));
77     end
78
79     [msg, stat] = unix_g(make_command + makename + " all 2>&0");
80     if stat <> 0 then
81       // more feedback when compilation fails
82       [msg, stat, stderr] = unix_g(make_command + makename + " all 1>&2"); 
83       disp(stderr);
84       error(msprintf(gettext("%s: Error while executing %s.\n"), "ilib_compile", makename));
85     else
86       if ilib_verbose() > 1 then
87         disp(msg);
88       end
89     end
90
91   else
92     //** ---------- Linux/MacOS/Unix section ---------------------
93
94     ScilabTreeFound=%f;
95
96     // Source tree version
97     // Headers are dispatched in the source tree
98     if isdir(SCI+"/modules/core/includes/") then
99       defaultModulesCHeader=[ "core", "mexlib","api_scilab","output_stream","localization" ];
100       defaultModulesFHeader=[ "core" ];
101       ScilabTreeFound=%t
102
103       for x = defaultModulesCHeader(:)';
104           cflags=" -I"+SCI+"/modules/"+x+"/includes/ "+cflags;
105       end
106       cflags=" -I"+SCI+"/libs/MALLOC/includes/ " + cflags;
107
108       for x = defaultModulesFHeader(:)';
109           fflags=" -I"+SCI+"/modules/"+x+"/includes/ " + fflags;
110           end
111     end
112
113     // Binary version
114     if isdir(SCI+"/../../include/scilab/") & ~ScilabTreeFound then
115       cflags="-I"+SCI+"/../../include/scilab/ " + cflags
116       fflags="-I"+SCI+"/../../include/scilab/ " + fflags
117       ScilabTreeFound=%t
118     end
119
120     // System version (ie: /usr/include/scilab/)
121     if isdir("/usr/include/scilab/") & ~ScilabTreeFound then
122        cflags="-I/usr/include/scilab/ "+cflags
123        fflags="-I/usr/include/scilab/ "+fflags
124        ScilabTreeFound=%t
125     end
126
127     if ( ilib_verbose() <> 0 & ScilabTreeFound <> %t) then
128        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");
129     end
130
131     oldPath = pwd();
132
133     // Switch back to the TMPDIR where the mandatory files are
134
135     chdir(TMPDIR+"/"+lib_name_orig);
136
137    // Detect the actual path to the libstdc++ library. For the dynamic link
138    // build, we want to use the same lib as the compiler installed.
139    // CF bug #7887 for more information.
140    // Note that, for the configure, the setup is done by compilerDetection.sh
141     cmdGCC="if test -x ""$(which gcc 2>/dev/null)""; then echo $(LC_ALL=C gcc -print-search-dirs|awk ''$1==""install:""{print $2}''); fi";
142     [GCClibpath, ierr, stderr] = unix_g(cmdGCC);
143     if (GCClibpath <> "" & ierr == 0 & grep(getenv("LD_LIBRARY_PATH"),GCClibpath) == []) then
144         setenv("LD_LIBRARY_PATH",GCClibpath+"/../../../:"+getenv("LD_LIBRARY_PATH"));
145     end
146
147     cmd = "make "
148
149     cmd = cmd + gencompilationflags_unix(ldflags, cflags, fflags, cc, "build")
150
151     //** BEWARE : this function can cause errors if used with "old style" Makefile inside a Scilab 5
152     //**          environment where the Makefile are created from a "./configure"
153     [msg, ierr, stderr] = unix_g(cmd) ;
154
155     if ( ilib_verbose() == 2 ) then
156       mprintf(gettext("%s: Build command: %s\n"),"ilib_compile",cmd);
157       mprintf(gettext("Output: %s\n"),msg);
158       mprintf(gettext("stderr: %s\n"),stderr);
159     end
160
161     if ierr <> 0 then
162       mprintf(gettext("%s: An error occurred during the compilation:\n"),"ilib_compile");
163       lines(0);
164       disp(stderr);
165       mprintf("\n");
166       mprintf(gettext("%s: The command was:\n"),"ilib_compile");
167       mprintf(cmd);
168       mprintf("\n");
169       chdir(oldPath); // Go back to the working dir
170       return ;
171     end
172
173     if stderr <> "" then
174       if ( ilib_verbose() <> 0 ) then
175         mprintf(gettext("%s: Warning: No error code returned by the compilation but the error output is not empty:\n"),"ilib_compile");
176         mprintf(stderr);
177       end
178       return ;
179     end
180
181     generatedLibrary=".libs/" + lib_name;
182     // Copy the produce lib to the working path
183     if ~isfile(generatedLibrary) then
184       error(msprintf(gettext("%s: Could not find the built library ''%s''.\n"),"ilib_compile",generatedLibrary));
185     end
186     copyfile(generatedLibrary, oldPath);
187     
188   end
189   
190   libn = path + lib_name_make ;
191   chdir(oldpath);
192
193 endfunction
194 //=============================================================================
195 // function only defined in ilib_compile
196 //=============================================================================
197 function [make_command,lib_name_make,lib_name,path,makename,files] = ..
198              ilib_compile_get_names(lib_name, makename, files)
199
200   if getos() <> "Windows" then
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