Merge remote-tracking branch 'origin/6.1'
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_gen_loader.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA/ENPC
3 // Copyright (C) DIGITEO - 2009-2010 - Allan CORNET
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13 //=============================================================================
14 function ilib_gen_loader(varargin)
15     // varargin (max) name, tables, libs, libname, flag, loadername
16     [lhs, rhs] = argn(0);
17
18     if and(rhs <> [2 3 6]) then
19         error(msprintf(_("%s: Wrong number of input argument(s): %d,%d or %d expected.\n"), "ilib_gen_loader", 2, 3, 6));
20     end
21
22     name = varargin(1);
23     tables = varargin(2);
24
25     if rhs > 2 then
26         libs = varargin(3);
27     else
28         libs = [];
29     end
30
31     if rhs > 3 then
32         libname = varargin(4);
33     else
34         libname = "";
35     end
36
37     if rhs > 4 then
38         flag = varargin(5);
39     else
40         flag = "";
41     end
42
43     if rhs > 5 then
44         loadername = varargin(6);
45         if isempty(loadername) then
46             loadername = "loader.sce";
47         end
48     else
49         loadername = "loader.sce";
50     end
51
52     if type(name) <> 10 then
53         error(msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "ilib_gen_loader", 1));
54     end
55
56     if tables <> [] then
57         if type(tables) <> 10 then
58             error(msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "ilib_gen_loader", 2));
59         end
60     else
61         backupTables = tables;
62         if ( typeof(tables) <> "list") then
63             tables = list(tables);
64         end
65         L = length(tables);
66         for it = 1:L
67             [mt, nt] = size(tables(it));
68
69             if ((mt == 0) & (nt == 0)) then
70                 break;
71             end
72
73             if ( (nt <> 3) & ( nt <> 2) ) then
74                 error(msprintf(gettext("%s: Wrong size for input argument #%d.\n"),"ilib_gen_loader", 2));
75             end
76         end
77         tables = backupTables;
78     end
79
80     if libs <> [] & type(libs) <> 10 then
81         error(msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "ilib_gen_loader", 3));
82     end
83
84     if type(libname) <> 10 then
85         error(msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "ilib_gen_loader", 4));
86     end
87
88     if size(libname,"*") <> 1 then
89         error(msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "ilib_gen_loader", 4));
90     end
91
92     if type(flag) <> 10 then
93         error(msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "ilib_gen_loader", 5));
94     end
95
96     if size(flag,"*") <> 1 then
97         error(msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "ilib_gen_loader", 5));
98     end
99
100     if type(loadername) <> 10 then
101         error(msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "ilib_gen_loader", 6));
102     end
103
104     if size(loadername,"*") <> 1 then
105         error(msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "ilib_gen_loader", 6));
106     end
107
108     if libname == "" then
109         libname = name(1);
110     end
111
112     generateLoader(name, tables, libs, libname, flag, loadername);
113
114 endfunction
115 //=============================================================================
116 function bOK = generateLoader(name, tables, libs, libname, flag, loadername)
117     bOK = %F;
118
119     if ( length(libname) + length("_path") ) > 24 then
120         shortlibname_path = part(libname,1:(24 - length("_path")));
121     else
122         shortlibname_path = libname;
123     end
124
125     [fd, err] = mopen(loadername, "wt");
126     if err <> 0 then
127         warning(msprintf(_("%s: Cannot open file %s.\n"), "mopen", loadername));
128         bOK = %F;
129         return
130     end
131
132     mfprintf(fd, "// This file is released under the 3-clause BSD license. See COPYING-BSD.\n");
133     mfprintf(fd, "// Generated by builder.sce : Please, do not edit this file\n");
134     mfprintf(fd, "// ----------------------------------------------------------------------------\n");
135     mfprintf(fd, "//\n");
136
137     // Bug 5737
138     if getos() == "Windows" then
139         if win64() then
140             mfprintf(fd, "if ~win64() then\n");
141             mfprintf(fd, "  warning(_(""This module requires a Windows x64 platform.""));\n");
142         else
143             mfprintf(fd, "if win64() then\n");
144             mfprintf(fd, "  warning(_(""This module requires a Windows x86 platform.""));\n");
145         end
146         mfprintf(fd, "  return\n");
147         mfprintf(fd, "end\n");
148         mfprintf(fd, "//\n");
149     end
150
151     // remove path
152     filenamewithext = fileparts(loadername,"fname") + fileparts(loadername, "extension");
153
154     mfprintf(fd, "%s_path = get_absolute_file_path(''%s'');\n", shortlibname_path, filenamewithext);
155     mfprintf(fd, "//\n");
156
157     // bug 4515 - unlink previous function with same name
158     name = name(:)';
159     n = size(name, "*");
160     mfprintf(fd, "// ulink previous function with same name\n");
161     for i = 1:n
162         mfprintf(fd, "[bOK, ilib] = c_link(''%s'');\n", name(i));
163         mfprintf(fd, "if bOK then\n");
164         mfprintf(fd, "  ulink(ilib);\n");
165         mfprintf(fd, "end\n");
166         mfprintf(fd, "//\n");
167     end
168
169     nl = size(libs ,"*");
170     for i = 1:nl
171         // Add the relative path only if the lib has a relative path
172         isabspath = is_absolute_path(libs(i));
173         libfile = libs(i);
174         if libfile <> "" then
175             if isabspath then
176                 mfprintf(fd, "link(''%s'' + getdynlibext());\n", libfile);
177             else
178                 mfprintf(fd, "link(%s_path + filesep() + ''%s'' + getdynlibext());\n", shortlibname_path, libfile);
179             end
180         end
181     end
182
183     if tables <> [] then
184         //
185         // addinter
186         //
187         if ( typeof(tables) <> "list") then
188             tables = list(tables);
189         end
190         L = length(tables);
191         if L == 1 then
192             // direct call to addinter
193             table = tables(1);
194             mfprintf(fd, "list_functions = [ ");
195             withoutSpace = %T;
196             for x = table(1:$,1)'
197                 if withoutSpace then
198                     withoutSpace = %F;
199                     mfprintf(fd, "''%s'';\n", x);
200                 else
201                     mfprintf(fd, "                   ''%s'';\n", x);
202                 end
203             end
204             mfprintf(fd, "];\n");
205
206             mfprintf(fd, "addinter(%s_path + filesep() + ''%s'' + getdynlibext(), ''%s'', list_functions);\n", shortlibname_path, ..
207             name, name);
208         else
209             // on link then a set of addinter
210             mfprintf(fd, "ilib = link(%s_path + filesep() + ''%s'' + getdynlibext());\n", shortlibname_path, ..
211             name);
212             for itable =1 :L
213                 // loop on a list of tables
214                 table = tables(itable);
215
216                 mfprintf(fd, "list_functions = [ ''%s'';\n", table(1,1));
217                 for x = table(2:$, 1)'
218                     mfprintf(fd, "                  ''%s'';\n", x);
219                 end
220                 mfprintf(fd, "];\n");
221
222                 mfprintf(fd, "addinter(ilib, ''%s'', list_functions);\n", ..
223                 name + string(itable));
224             end
225         end
226
227     else
228         //
229         // link
230         //
231         mfprintf(fd,"link(%s_path + ''lib%s'' + getdynlibext(), [", shortlibname_path, libname);
232
233         for i = 1:n
234             mfprintf(fd, "''%s''", name(i));
235             if i <> n then
236                 mfprintf(fd, ",");
237             else
238                 mfprintf(fd, "],");
239             end
240         end
241         mfprintf(fd,"''%s'');\n",flag);
242     end
243
244     mfprintf(fd, "// remove temp. variables on stack\n");
245     mfprintf(fd,"clear %s_path;\n", shortlibname_path);
246     mfprintf(fd,"clear bOK;\n");
247     mfprintf(fd,"clear ilib;\n");
248
249     if tables <> [] then
250         mfprintf(fd, "clear list_functions;\n");
251     end
252
253     mfprintf(fd, "// ----------------------------------------------------------------------------\n");
254     mclose(fd);
255
256     if ilib_verbose() > 1 then
257         disp(mgetl(loadername));
258     end
259
260     bOK = %T;
261 endfunction
262 //=============================================================================