Merge remote-tracking branch 'origin/6.1'
[scilab.git] / scilab / modules / dynamic_link / macros / ilib_for_link.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA/ENPC
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 // Generate a shared library which can be used by link command.
15 function libn = ilib_for_link(names, ..
16     files, ..
17     libs, ..
18     flag, ..
19     makename, ..
20     loadername, ..
21     libname, ..
22     ldflags, ..
23     cflags, ..
24     fflags, ..
25     cc)
26
27     [lhs, rhs] = argn(0);
28     if rhs < 4 then
29         error(msprintf(gettext("%s: Wrong number of input argument(s).\n"),"ilib_for_link"));
30         return
31     end
32
33     if rhs > 4 then
34         if (makename <> [] & makename <> "") then
35             warning(msprintf(_("%s: Wrong value for input argument #%d: """" or ""[]"" expected.\n"), "ilib_for_link", 5));
36         end
37     end
38     if rhs <= 5 then loadername = "loader.sce";end
39     if rhs <= 6 then libname = ""; end
40     if rhs <= 7 then ldflags = ""; end
41     if rhs <= 8 then cflags  = ""; end
42     if rhs <= 9 then fflags  = ""; end
43     if rhs <= 10 then cc  = ""; end
44
45     if isempty(files) | ~and(isfile(files)) then
46         error(msprintf(_("%s: Wrong value for input argument #%d: existing file(s) expected.\n"), "ilib_for_link", 2));
47     end
48
49     if ~isempty(files) & (or(fileext(files)==".o") | or(fileext(files)==".obj")) then
50         error(msprintf(_("%s: A managed file extension for input argument #%d expected.\n"), "ilib_for_link", 2));
51     end
52
53     if getos() == "Windows" then
54         if ~ exists("dynamic_linkwindowslib") then
55             load("SCI/modules/dynamic_link/macros/windows/lib");
56         end
57         makename = dlwGetDefltMakefileName() + dlwGetMakefileExt();
58     else
59         makename = "Makefile";
60     end
61
62     // generate a loader file
63     if ( ilib_verbose() <> 0 ) then
64         mprintf(gettext("   Generate a loader file\n"));
65     end
66
67     tables = [];
68
69     // we manage .f90 as .f on windows
70     if getos() == "Windows" then
71         if findmsifortcompiler() <> "unknown" then
72             if flag == "f90" then
73                 flag = "f";
74             end
75         else
76             if flag == "f90" then
77                 error(_("F2C cannot build fortran 90"));
78             end
79         end
80     end
81
82     ilib_gen_loader(names, tables, libs, libname, flag, loadername);
83
84     // bug 4515 - unlink previous function with same name
85     n = size(names,"*");
86     for i = 1:n
87         execstr("[bOK, ilib] = c_link(""" + names(i) + """);if bOK then ulink(ilib), end");
88     end
89
90     // generate a Makefile
91     if ( ilib_verbose() <> 0 ) then
92         mprintf(gettext("   Generate a Makefile\n"));
93     end
94
95     modifiedmakename = generateMakefile(names, ..
96     files, ..
97     libs, ..
98     libname, ..
99     ldflags, ..
100     cflags, ..
101     fflags, ..
102     cc, ..
103     flag);
104
105     if modifiedmakename <> makename then
106         makename = modifiedmakename;
107     end
108
109     // we call make
110     if ( ilib_verbose() <> 0 ) then
111         mprintf(gettext("   Running the Makefile\n"));
112     end
113
114     if (libname == "") then
115         libname = names(1);
116     end
117
118     libn = ilib_compile("lib" + libname, makename, files);
119
120     if ( ilib_verbose() <> 0 ) then
121         mprintf(_("   Generate a cleaner file\n"));
122     end
123
124     ilib_gen_cleaner(makename, loadername, libn);
125
126 endfunction
127 //=============================================================================
128 function makename = generateMakefile(names, ..
129     files, ..
130     libs, ..
131     libname, ..
132     ldflags, ..
133     cflags, ..
134     fflags, ..
135     cc, ..
136     flag)
137
138     makename = [];
139     if getos() <> "Windows" then
140         Makename = makename;
141         ilib_gen_Make_unix(names, ..
142         files, ..
143         libs, ..
144         libname, ..
145         ldflags, ..
146         cflags, ..
147         fflags, ..
148         cc);
149     else
150         if ~ exists("dynamic_linkwindowslib") then
151             load("SCI/modules/dynamic_link/macros/windows/lib");
152         end
153
154         if strncpy(names,3) <> "lib" then
155             names = "lib" + names;
156         end
157
158         names = names(1);
159
160         makename = dlwGenerateMakefile(names, ..
161         [], ..
162         files, ..
163         libs, ..
164         libname, ..
165         %f, ..
166         ldflags, ..
167         cflags, ..
168         fflags, ..
169         cc);
170     end
171
172 endfunction
173 //=============================================================================
174