Merge remote-tracking branch 'origin/6.1'
[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 // Copyright (C) 2012 - 2016 - Scilab Enterprises
8 //
9 // This file is hereby licensed under the terms of the GNU GPL v2.0,
10 // pursuant to article 5.3.4 of the CeCILL v.2.1.
11 // This file was originally licensed under the terms of the CeCILL v2.1,
12 // and continues to be available under such terms.
13 // For more information, see the COPYING file which you should have received
14 // along with this program.
15
16 //=============================================================================
17 function libn = ilib_compile(lib_name, ..
18     makename, ..
19     files, ..
20     ldflags, ..
21     cflags, ..
22     fflags, ..
23     cc)
24
25     [lhs,rhs] = argn(0);
26     if rhs < 2 then
27         error(msprintf(gettext("%s: Wrong number of input argument(s).\n"),"ilib_compile"));
28         return
29     end
30
31     // The name of the library starts by "lib", strip it
32     lib_name_orig = strsubst(lib_name,"/^lib/","","r");
33
34     libn=""; //** init variable
35     if getos() == "Windows" & ~haveacompiler() then
36         error(_("A Fortran or C compiler is required."))
37         return;
38     end
39
40     [lhs,rhs]=argn(0);
41
42     if rhs < 3 then
43         files = [];
44     else
45         if ~isempty(files) & (or(fileext(files)==".o") | or(fileext(files)==".obj")) then
46             error(msprintf(_("%s: A managed file extension for input argument #%d expected."), "ilib_compile", 3));
47         end
48     end
49
50     if typeof(lib_name)<>"string" then
51         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"ilib_compile",1));
52         return ;
53     end
54
55     if isempty(ldflags)
56         ldflags = ""
57     end
58     if isempty(cflags)
59         cflags = ""
60     end
61     if isempty(fflags)
62         fflags = ""
63     end
64     if isempty(cc)
65         cc = ""
66     end
67
68     oldpath = pwd();
69     files = files(:)';
70
71     [make_command, lib_name_make, lib_name, path, makename, files]= ...
72     ilib_compile_get_names(lib_name, files);
73
74     if isdir(path) then
75         chdir(path);
76     end
77
78     if getos() == "Windows" then
79         //** ----------- Windows section  -----------------
80
81         // Load dynamic_link Internal lib if it's not already loaded
82         if ~ exists("dynamic_linkwindowslib") then
83             load("SCI/modules/dynamic_link/macros/windows/lib");
84         end
85
86         dlwCompile(files, make_command, makename);
87
88     else
89         //** ---------- Linux/MacOS/Unix section ---------------------
90
91         ScilabTreeFound=%f;
92
93         // Source tree version
94         // Headers are dispatched in the source tree
95         if isdir(SCI+"/modules/core/includes/") then
96             defaultModulesCHeader=[ "core", "mexlib","api_scilab","output_stream","localization",  "dynamic_link",  "threads",  "string",  "console"];
97             defaultKernelCHeader=[ "analysis" "ast" "exps" "operations" "parse" "symbol" "system_env" "types"];
98             defaultModulesFHeader=[ "core" ];
99             ScilabTreeFound=%t
100
101             if isdef("MPI_Init") then
102                 defaultModulesCHeader = [defaultModulesCHeader, "mpi"]
103             end
104
105             for x = defaultModulesCHeader;
106                 cflags = cflags + " -I" + SCI + "/modules/" + x + "/includes/ ";
107             end
108
109             for x = defaultKernelCHeader;
110                 cflags = cflags + " -I" + SCI + "/modules/ast/includes/" + x;
111             end
112
113             for x = defaultModulesFHeader(:)';
114                 fflags=" -I"+SCI+"/modules/"+x+"/includes/ " + fflags;
115             end
116         end
117
118         // Binary version
119         if isdir(SCI+"/../../include/scilab/") & ~ScilabTreeFound then
120             cflags="-I"+SCI+"/../../include/scilab/ -I"+SCI+"/../../include/ " + cflags
121             fflags="-I"+SCI+"/../../include/scilab/ " + fflags
122             if isdef("MPI_Init") then
123                 cflags = "-I"+SCI+"/../../include/scilab/mpi/ " + cflags
124             end
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             if isdef("MPI_Init") then
133                 cflags="-I/usr/include/scilab/mpi/ "+cflags
134             end
135             ScilabTreeFound=%t
136         end
137
138         global cppCompilation;
139         if cppCompilation then
140             cflags = cflags + " -std=c++11";
141         end
142         clearglobal cppCompilation;
143
144         if ( ilib_verbose() <> 0 & ScilabTreeFound <> %t) then
145             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");
146         end
147
148         oldPath = pwd();
149
150         // Switch back to the TMPDIR where the mandatory files are
151
152         chdir(TMPDIR+"/"+lib_name_orig);
153
154         // Detect the actual path to the libstdc++ library. For the dynamic link
155         // build, we want to use the same lib as the compiler installed.
156         // CF bug #7887 for more information.
157         // Note that, for the configure, the setup is done by compilerDetection.sh
158         cmdGCC="if test -x ""$(which gcc 2>/dev/null)""; then echo $(LC_ALL=C gcc -print-search-dirs|awk -F= ''$1==""libraries: ""{print $2}''); fi";
159         [GCClibpath, ierr, stderr] = unix_g(cmdGCC);
160
161         if (GCClibpath <> "" & GCClibpath <> [] & ierr == 0 & grep(getenv("LD_LIBRARY_PATH"),GCClibpath) == []) then
162             setenv("LD_LIBRARY_PATH",GCClibpath+":"+getenv("LD_LIBRARY_PATH"));
163         end
164
165         cmd = "make "
166
167         cmd = cmd + gencompilationflags_unix(ldflags, cflags, fflags, cc, "build")
168
169         //** BEWARE : this function can cause errors if used with "old style" Makefile inside a Scilab 5
170         //**          environment where the Makefile are created from a "./configure"
171         [msg, ierr, stderr] = unix_g(cmd) ;
172
173         if ( ilib_verbose() == 2 ) then
174             mprintf(gettext("%s: Build command: %s\n"),"ilib_compile",cmd);
175             mprintf(gettext("Output: %s\n"),msg);
176             mprintf(gettext("stderr: %s\n"),stderr);
177         end
178
179         if ierr <> 0 then
180             errMsg = sprintf(gettext("%s: An error occurred during the compilation:\n"), "ilib_compile");
181             errMsg = [errMsg ; stderr];
182             errMsg = [errMsg ; sprintf(gettext("%s: The command was:\n"), "ilib_compile")];
183             errMsg = [errMsg ; cmd];
184             chdir(oldPath); // Go back to the working dir
185             error(errMsg);
186             return ;
187         end
188
189         if stderr <> "" then
190             if ( ilib_verbose() <> 0 ) then
191                 mprintf(gettext("%s: Warning: No error code returned by the compilation but the error output is not empty:\n"),"ilib_compile");
192                 mprintf(stderr);
193             end
194             return ;
195         end
196
197         generatedLibrary=".libs/" + lib_name;
198         // Copy the produce lib to the working path
199         if ~isfile(generatedLibrary) then
200             error(msprintf(gettext("%s: Could not find the built library ''%s''.\n"),"ilib_compile",generatedLibrary));
201         end
202         copyfile(generatedLibrary, oldPath);
203
204     end
205
206     libn = path + lib_name_make ;
207     chdir(oldpath);
208
209 endfunction
210 //=============================================================================
211 // function only defined in ilib_compile
212 //=============================================================================
213 function [make_command, lib_name_make, lib_name,path, makename, files] = ..
214     ilib_compile_get_names(lib_name, files)
215
216     if getos() <> "Windows" then
217         path = "";
218
219         lib_name = lib_name + getdynlibext();
220         lib_name_make = lib_name;
221
222         make_command = "make ";
223         if files <> [] then
224             files = files + ".o";
225         end
226
227         makename = "Makefile";
228
229     else // Windows
230         // Load dynamic_link Internal lib if it"s not already loaded
231         if ~ exists("dynamic_linkwindowslib") then
232             load("SCI/modules/dynamic_link/macros/windows/lib");
233         end
234
235         [make_command, lib_name_make, lib_name, path, makename, files] = ..
236         dlwGetParamsIlibCompil(lib_name, files);
237     end
238
239 endfunction
240 //=============================================================================
241