add ilib_language to retrieve compiler capabilities
[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 size(table,"*") > 999 * 2 then
49         error(999,msprintf(_("%s: Wrong size for input argument #%d: A matrix of strings < 999 expected.\n"), "ilib_build", 2));
50     end
51
52     if getos() <> "Windows" & strncpy(ilib_name, 3) <> "lib" then
53         // We add a leading lib under Linux/Unix because it is the way
54         ilib_name = "lib" + ilib_name;
55     end
56
57     if ~isempty(files) & (or(fileext(files)==".o") | or(fileext(files)==".obj")) then
58         error(999, msprintf(_("%s: A managed file extension for input argument #%d expected."), "ilib_build", 3));
59     end
60
61     if rhs > 4 then
62         if (makename <> [] & makename <> "") then
63             warning(msprintf(_("%s: Wrong value for input argument #%d: """" or ""[]"" expected.\n"), "ilib_build", 5));
64         end
65     end
66
67     if ~isempty(files) & ~and(isfile(files)) then
68         error(999, msprintf(_("%s: Wrong value for input argument #%d: existing file(s) expected.\n"), "ilib_build", 3));
69     end
70
71
72     if rhs <= 5 then ldflags = ""; end
73     if rhs <= 6 then cflags  = ""; end
74     if rhs <= 7 then fflags  = ""; end
75     if rhs <= 8 then ismex  = %f; end
76     if rhs <= 9 then cc  = ""; end
77
78     if getos() == "Windows" then
79         if ~isdef("makename") | (makename == "") | (makename == []) then
80             // Load dynamic_link Internal lib if it's not already loaded
81             if ~exists("dynamic_linkwindowslib") then
82                 load("SCI/modules/dynamic_link/macros/windows/lib");
83             end
84             makename = dlwGetDefltMakefileName();
85         end
86     else
87         makename = "Makefile";
88     end
89
90     // check if library is not already loaded
91     if or(link() == ilib_name) then
92         error(999, msprintf(_("%s: ""%s"" already loaded in scilab."),"ilib_build",ilib_name) + ..
93         ascii(10) + _("You need to unload this library before."));
94     end
95
96     // generate the gateway file
97     if ( ilib_verbose() <> 0 ) then
98         mprintf(_("   Generate a gateway file\n"));
99     end
100
101     //check supported language
102     l = ilib_language();
103     if size(table, "c") > 2 then
104         lang = table(:, 3);
105     else
106         lang(1:size(table, "r")) = "csci";
107     end
108
109     for i = 1:size(lang, "*")
110         if isempty(grep(l, lang(i))) then
111             error(999, msprintf(_("%s: ""%s"" format is not supported by your compiler."), "ilib_build", lang(i)));
112         end
113     end
114
115     file_gw_name = ilib_gen_gateway(ilib_name, table);
116
117     // generate a loader file
118     if ( ilib_verbose() <> 0 ) then
119         mprintf(_("   Generate a loader file\n"));
120     end
121     if ~ismex then
122         ilib_gen_loader(ilib_name,table,libs);
123     else
124         ilib_gen_loader(ilib_name,table);
125     end
126
127     // generate a Makefile
128     if ( ilib_verbose() <> 0 ) then
129         mprintf(_("   Generate a Makefile\n"));
130     end
131
132     files = files(:)';
133     files = unique([files, file_gw_name]);
134
135     makename = ilib_gen_Make(ilib_name, table, files, libs, makename, %t, ldflags, cflags, fflags, cc);
136
137     // we call make
138     if ( ilib_verbose() <> 0 ) then
139         mprintf(_("   Running the makefile\n"));
140     end
141
142     libn = ilib_compile(ilib_name, makename, files);
143
144     if ( ilib_verbose() <> 0 ) then
145         mprintf(_("   Generate a cleaner file\n"));
146     end
147     ilib_gen_cleaner(makename, "loader.sce", [libn; file_gw_name']);
148
149 endfunction
150 //=============================================================================
151