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