ilib_for_link, ilib_build do not accept files with ".o" or ".obj" extensions for...
[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 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 //=============================================================================
11 function ilib_build(ilib_name, ..
12                     table, ..
13                     files, ..
14                     libs, ..
15                     makename, ..
16                     ldflags, ..
17                     cflags, ..
18                     fflags, ..
19                     ismex, ..
20                     cc)
21
22   if ~haveacompiler() then
23     error(msprintf(gettext("%s: A Fortran or C compiler is required.\n"), "ilib_build"));
24     return;
25   end
26
27   [lhs,rhs] = argn(0);
28   if rhs < 4 then
29     error(msprintf(gettext("%s: Wrong number of input argument(s).\n"), "ilib_build"));
30     return
31   end
32
33   if type(ilib_name) <> 10 then
34     error(999, msprintf(_("%s: Wrong type for input argument #%d: A string expected.\n"), "ilib_build", 1));
35   end
36
37   if size(ilib_name,"*") <> 1 then
38     error(999, msprintf(_("%s: Wrong size for input argument #%d: A string expected.\n"), "ilib_build", 1));
39   end
40
41   if type(table) <> 10 then
42     error(999,msprintf(_("%s: Wrong type for input argument #%d: A matrix of strings expected.\n"), "ilib_build", 2));
43   end
44
45   if size(table,"*") > 999 * 2 then
46     error(999,msprintf(_("%s: Wrong size for input argument #%d: A matrix of strings < 999 expected.\n"), "ilib_build", 2));
47   end
48
49   if getos() <> "Windows" & strncpy(ilib_name, 3) <> "lib" then
50     // We add a leading lib under Linux/Unix because it is the way
51     ilib_name = "lib" + ilib_name;
52   end
53
54   if ~isempty(files) & (or(fileext(files)==".o") | or(fileext(files)==".obj")) then
55     error(999, msprintf(_("%s: A managed file extension for input argument #%d expected."), "ilib_build", 3));
56   end
57
58   if rhs > 4 then
59     if (makename <> [] & makename <> "") then
60       warning(msprintf(_("%s: Wrong value for input argument #%d: """" or ""[]"" expected.\n"), "ilib_build", 5));
61     end
62   end
63
64   if ~isempty(files) & ~and(isfile(files)) then
65     error(999, msprintf(_("%s: Wrong value for input argument #%d: existing file(s) expected.\n"), "ilib_build", 3));
66   end  
67
68
69   if rhs <= 5 then ldflags = ""; end
70   if rhs <= 6 then cflags  = ""; end
71   if rhs <= 7 then fflags  = ""; end
72   if rhs <= 8 then ismex  = %f; end
73   if rhs <= 9 then cc  = ""; end
74
75   if getos() == "Windows" then
76     if ~isdef("makename") | (makename == "") | (makename == []) then
77       // Load dynamic_link Internal lib if it"s not already loaded
78       if ~exists("dynamic_linkwindowslib") then
79         load("SCI/modules/dynamic_link/macros/windows/lib");
80       end
81       makename = dlwGetDefltMakefileName();
82     end
83   else
84     makename = "Makefile";
85   end
86
87   // check if library is not already loaded
88   if or(link() == ilib_name) then
89     error(999, msprintf(_("%s: ""%s"" already loaded in scilab."),"ilib_build",ilib_name) + ..
90     ascii(10) + _("You need to unload this library before."));
91   end
92
93   // generate the gateway file
94   if ( ilib_verbose() <> 0 ) then
95     mprintf(_("   Generate a gateway file\n"));
96   end
97
98   file_gw_name = ilib_gen_gateway(ilib_name, table);
99
100   // generate a loader file
101   if ( ilib_verbose() <> 0 ) then
102     mprintf(_("   Generate a loader file\n"));
103   end
104   if ~ismex then
105     ilib_gen_loader(ilib_name,table,libs);
106   else
107     ilib_gen_loader(ilib_name,table);
108   end
109
110   // generate a Makefile
111   if ( ilib_verbose() <> 0 ) then
112       if getos() == "Windows"
113         mprintf(_("   Generate a Makefile: %s\n"), makename);
114       else
115         mprintf(_("   Generate a Makefile\n"));
116       end
117   end
118
119   if getos() <> "Windows" then // Needs to copy the libfoo.c which contains important stuff
120     files = files(:)';
121     files = [files, ilib_name + ".c"];
122   end
123
124   ilib_gen_Make(ilib_name, table, files, libs, makename, %t, ldflags, cflags, fflags, cc);
125
126   // we call make
127   if ( ilib_verbose() <> 0 ) then
128     mprintf(_("   Running the makefile\n"));
129   end
130
131   libn = ilib_compile(ilib_name, makename, files);
132
133   if ( ilib_verbose() <> 0 ) then
134     mprintf(_("   Generate a cleaner file\n"));
135   end
136   ilib_gen_cleaner(makename, "loader.sce", [libn; file_gw_name]);
137
138 endfunction
139 //=============================================================================
140