bug 7907 - check 'files' input argument
[scilab.git] / scilab / modules / dynamic_link / macros / windows / dlwGenerateMakefile.sci
1 // Copyright (C) DIGITEO - 2010 - Allan CORNET
2 //
3 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at
7 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
8 //=============================================================================
9 function Makename = dlwGenerateMakefile(name, ..
10                                  tables, ..
11                                  files, ..
12                                  libs, ..
13                                  libname, ..
14                                  makename, ..
15                                  with_gateway, ..
16                                  ldflags, ..
17                                  cflags, ..
18                                  fflags, ..
19                                  cc)
20
21   [lhs,rhs] = argn(0);
22   if rhs < 4 then
23     error(msprintf(gettext("%s: Wrong number of input argument(s): at least %d expected.\n"), "dlwGenerateMakefile", 4));
24   end
25
26   if argn(2) < 6 then
27     with_gateway = %t;
28     ldflags = '';
29     cflags = '';
30     fflags = '';
31     cc = '';
32   end
33
34   if ~isdef('makename') then
35     makename = '';
36   end
37
38   for i=1:size(files,'*') // compatibility scilab 4.x
39     [path_f, file_f, ext_f] = fileparts(files(i));
40     if or(ext_f == ['.o','.obj']) then
41       files(i) = path_f + file_f;
42     else
43       files(i) = path_f + file_f + ext_f;
44     end
45   end
46
47   // change table if necessary
48   if tables <> [] then
49     if typeof(tables)<>'list' then
50       tables = list(tables)
51     end
52     L = length(tables);
53
54     for it = 1:L
55       table = tables(it);
56       [mt, nt] = size(table);
57
58       if nt == 2 then
59         col= "csci";
60         table = [table, col(ones(mt,1))];
61         nt=3;
62       end
63
64       if nt<>3 then
65         error(msprintf(gettext("%s: Wrong size for input argument #%d.\n") ,"dlwGenerateMakefile", 2));
66       end
67       tables(it) = table;
68     end
69   end
70
71   if isempty(makename) then
72     Makename = dlwGetDefltMakefileName() + dlwGetMakefileExt();
73   else
74     Makename = makename + dlwGetMakefileExt();
75   end
76
77   if length(libname) > 0  & strncpy(libname, 3) <> 'lib' then
78     libname = 'lib' + libname;
79   end
80
81   ilib_gen_Make_win32(name, tables, files, libs, libname, Makename, with_gateway, ldflags, cflags, fflags)
82
83 endfunction
84 //=============================================================================
85 function ilib_gen_Make_win32(name, ..
86                              table, ..
87                              files, ..
88                              libs, ..
89                              libname, ..
90                              Makename, ..
91                              with_gateway, ..
92                              ldflags, ..
93                              cflags, ..
94                              fflags)
95
96   managed_ext = ['.cxx', '.cpp', '.c', '.f90', '.f'];
97   obj_ext = ['.o', '.obj', ''];
98
99   SCIDIR = SCI;
100   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
101   LIBRARY = name;
102   FILES_SRC = '';
103   OBJS = '';
104   OBJS_WITH_PATH = '';
105   FORTRAN_RUNTIME = '';
106   OTHERLIBS = '';
107   CC = '';
108   CFLAGS = cflags;
109   MEXCFLAGS = '';
110   FFLAGS = fflags;
111   MEXFFLAGS = '';
112   LDFLAGS = ldflags;
113
114   if isempty(libname) then
115     LIBRARY = name;
116   else
117     LIBRARY = libname;
118   end
119
120   FILES_SRC_MATRIX = [];
121
122   [path_Make, file_Make, ext_Make] = fileparts(Makename);
123
124   for i=1:size(files,'*')
125     [path_f, file_f, ext_f] = fileparts(files(i));
126
127     if or(obj_ext == ext_f) then
128       FILENAME = [];
129       FILE_FOUNDED = %f;
130       for y = managed_ext(:)'
131         if (FILE_FOUNDED == %f) then
132           if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
133             FILENAME = path_f + file_f + y;
134             FILE_FOUNDED = %t;
135           end
136         end
137       end
138     else
139       FILENAME = files(i);
140     end
141     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
142   end
143
144   if typeof(tables) <> 'list' then
145     tables = list(tables);
146   end
147   L = length(tables);
148
149   if with_gateway then
150     if L == 1 then
151       FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + '.c'];
152     else
153        for i=1:L
154         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + '.c'];
155        end
156     end
157   end
158
159   for it=1:L
160     table = tables(it);
161     [mt,nt] = size(table);
162
163     for i=1:mt
164       if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' then
165         MEXCFLAGS = "-Dmexfunction_=mex" + table(i,2) + "_ -DmexFunction=mex_" + table(i,2);
166         MEXFFLAGS = "-Dmexfunction=mex" + table(i,2);
167         if table(i,3)=='cmex' then
168           filenameMex = table(i,2) + '.c';
169         else
170           filenameMex = table(i,2) + '.f';
171         end
172         if grep(FILES_SRC_MATRIX,filenameMex) == [] then
173           FILES_SRC_MATRIX = [FILES_SRC_MATRIX , filenameMex];
174         end
175       end
176     end
177   end
178
179   if ~and(isfile(FILES_SRC_MATRIX)) then
180      error(999, msprintf(_("%s: Wrong value for input argument #%d: existing file(s) expected.\n"), "ilib_gen_Make", 3));
181   end  
182
183   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
184
185
186   OBJ_DEST_PATH = '';
187   if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
188     OBJ_DEST_PATH = "Release/";
189   else
190     OBJ_DEST_PATH = "Debug/";
191   end
192
193   OBJS_MATRIX = [];
194   OBJS_WITH_PATH_MATRIX = [];
195
196   for y = 1:size(FILES_SRC_MATRIX,'*')
197     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
198     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
199     OBJS_WITH_PATH_MATRIX = [OBJS_WITH_PATH_MATRIX, OBJ_DEST_PATH + path_f + file_f + '.obj'];
200   end
201
202   OBJS = strcat(OBJS_MATRIX, ' ');
203   OBJS_WITH_PATH =  strcat(OBJS_WITH_PATH_MATRIX, ' ');
204
205   if ( or(fileext(FILES_SRC_MATRIX) == '.f90') | or(fileext(FILES_SRC_MATRIX) == '.f') ) then
206     if findmsifortcompiler() <> 'unknown' then
207       if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
208         FORTRAN_RUNTIME = 'libifcoremd.lib libmmd.lib';
209       else
210         FORTRAN_RUNTIME = 'libifcoremdd.lib libmmdd.lib';
211       end
212     end
213   end
214
215   for x=libs(:)'
216      if (x <> [] & x <> '') then
217        if OTHERLIBS <> '' then
218          OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
219        else
220          OTHERLIBS = x + '.lib';
221        end
222      end
223   end
224
225   if isfile(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC') then
226     MAKEFILE_VC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC');
227   else
228     MAKEFILE_VC = '';
229   end
230
231   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCI__", SCIDIR);
232   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCIDIR1__", SCIDIR1);
233   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LIBNAME__", LIBRARY);
234   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FILES_SRC__", FILES_SRC);
235   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS__", OBJS);
236   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS_WITH_PATH__", OBJS_WITH_PATH);
237   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FORTRAN_RUNTIME__", FORTRAN_RUNTIME);
238   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OTHERSLIBS__", OTHERLIBS);
239
240   if CC <> '' then
241     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CC__",CC);
242   else
243     MAKEFILE_VC = strsubst(MAKEFILE_VC, "CC = __CC__","#CC = ");
244   end
245
246   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CFLAGS__", CFLAGS);
247   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXCFLAGS__", MEXCFLAGS);
248   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FFLAGS__", FFLAGS);
249   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXFFLAGS__", MEXFFLAGS);
250   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LDFLAGS__", LDFLAGS);
251
252   if ( MAKEFILE_VC <> '') then
253     mputl(MAKEFILE_VC, Makename);
254
255     if ilib_verbose() > 1 then
256       disp(MAKEFILE_VC);
257     end
258
259   else
260     // TEMPLATE_MAKEFILE.VC not found
261     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC'+ _('not found.') );
262   end
263 endfunction
264 //=============================================================================