* Bug #15137 fixed : ilib_build cannot build a library with more than 999 function...
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_build.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) ENPC/INRIA
3 // Copyright (C) DIGITEO - 2009-2011 - 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_build(ilib_name, ..
15     table, ..
16     files, ..
17     libs, ..
18     makename, ..
19     ldflags, ..
20     cflags, ..
21     fflags, ..
22     ismex, ..
23     cc)
24
25     if ~haveacompiler() then
26         error(msprintf(gettext("%s: A Fortran or C compiler is required.\n"), "ilib_build"));
27         return;
28     end
29
30     [lhs,rhs] = argn(0);
31     if rhs < 4 then
32         error(msprintf(gettext("%s: Wrong number of input argument(s).\n"), "ilib_build"));
33         return
34     end
35
36     if type(ilib_name) <> 10 then
37         error(999, msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "ilib_build", 1));
38     end
39
40     if size(ilib_name,"*") <> 1 then
41         error(999, msprintf(_("%s: Wrong size for input argument #%d: string expected.\n"), "ilib_build", 1));
42     end
43
44     if type(table) <> 10 then
45         error(999,msprintf(_("%s: Wrong type for input argument #%d: A matrix of strings expected.\n"), "ilib_build", 2));
46     end
47
48     if getos() <> "Windows" & strncpy(ilib_name, 3) <> "lib" then
49         // We add a leading lib under Linux/Unix because it is the way
50         ilib_name = "lib" + ilib_name;
51     end
52
53     if ~isempty(files) & (or(fileext(files)==".o") | or(fileext(files)==".obj")) then
54         error(999, msprintf(_("%s: A managed file extension for input argument #%d expected."), "ilib_build", 3));
55     end
56
57     if rhs > 4 then
58         if (makename <> [] & makename <> "") then
59             warning(msprintf(_("%s: Wrong value for input argument #%d: """" or ""[]"" expected.\n"), "ilib_build", 5));
60         end
61     end
62
63     if ~isempty(files) & ~and(isfile(files)) then
64         error(999, msprintf(_("%s: Wrong value for input argument #%d: existing file(s) expected.\n"), "ilib_build", 3));
65     end
66
67
68     if rhs <= 5 then ldflags = ""; end
69     if rhs <= 6 then cflags  = ""; end
70     if rhs <= 7 then fflags  = ""; end
71     if rhs <= 8 then ismex  = %f; end
72     if rhs <= 9 then cc  = ""; end
73
74     if getos() == "Windows" then
75         if ~isdef("makename") | (makename == "") | (makename == []) then
76             // Load dynamic_link Internal lib if it's not already loaded
77             if ~exists("dynamic_linkwindowslib") then
78                 load("SCI/modules/dynamic_link/macros/windows/lib");
79             end
80             makename = dlwGetDefltMakefileName();
81         end
82     else
83         makename = "Makefile";
84     end
85
86     // check if library is not already loaded
87     if or(link() == ilib_name) then
88         error(999, msprintf(_("%s: ""%s"" already loaded in scilab."),"ilib_build",ilib_name) + ..
89         ascii(10) + _("You need to unload this library before."));
90     end
91
92     // generate the gateway file
93     if ( ilib_verbose() <> 0 ) then
94         mprintf(_("   Generate a gateway file\n"));
95     end
96
97     //check supported language
98     l = ilib_language();
99     if size(table, "c") > 2 then
100         lang = table(:, 3);
101     else
102         lang(1:size(table, "r")) = "csci";
103     end
104
105     for i = 1:size(lang, "*")
106         if isempty(grep(l, lang(i))) then
107             error(999, msprintf(_("%s: ""%s"" format is not supported by your compiler."), "ilib_build", lang(i)));
108         end
109     end
110
111     file_gw_name = ilib_gen_gateway(ilib_name, table);
112
113     // generate a loader file
114     if ( ilib_verbose() <> 0 ) then
115         mprintf(_("   Generate a loader file\n"));
116     end
117     if ~ismex then
118         ilib_gen_loader(ilib_name,table,libs);
119     else
120         ilib_gen_loader(ilib_name,table);
121     end
122
123     // generate a Makefile
124     if ( ilib_verbose() <> 0 ) then
125         mprintf(_("   Generate a Makefile\n"));
126     end
127
128     files = files(:)';
129     files = unique([files, file_gw_name]);
130
131     makename = ilib_gen_Make(ilib_name, table, files, libs, makename, %t, ldflags, cflags, fflags, cc);
132
133     // we call make
134     if ( ilib_verbose() <> 0 ) then
135         mprintf(_("   Running the makefile\n"));
136     end
137
138     libn = ilib_compile(ilib_name, makename, files);
139
140     if ( ilib_verbose() <> 0 ) then
141         mprintf(_("   Generate a cleaner file\n"));
142     end
143     ilib_gen_cleaner(makename, "loader.sce", [libn; file_gw_name']);
144
145 endfunction
146 //=============================================================================
147