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