move windows part in macros/windows (prepares to add vs project generation)
[scilab.git] / scilab / modules / dynamic_link / macros / windows / dlwGenerateMakefile.sci
1 // Copyright (C) DIGITEO - 2010-2011 - 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   // change table if necessary
39   if tables <> [] then
40     if typeof(tables)<>'list' then
41       tables = list(tables)
42     end
43     L = length(tables);
44
45     for it = 1:L
46       table = tables(it);
47       [mt, nt] = size(table);
48
49       if nt == 2 then
50         col= "csci";
51         table = [table, col(ones(mt,1))];
52         nt=3;
53       end
54
55       if nt<>3 then
56         error(msprintf(gettext("%s: Wrong size for input argument #%d.\n") ,"dlwGenerateMakefile", 2));
57       end
58       tables(it) = table;
59     end
60   end
61
62   if isempty(makename) then
63     Makename = dlwGetDefltMakefileName() + dlwGetMakefileExt();
64   else
65     Makename = makename + dlwGetMakefileExt();
66   end
67
68   if length(libname) > 0  & strncpy(libname, 3) <> 'lib' then
69     libname = 'lib' + libname;
70   end
71
72   ilib_gen_Make_win32(name, tables, files, libs, libname, Makename, with_gateway, ldflags, cflags, fflags)
73
74 endfunction
75 //=============================================================================
76 function ilib_gen_Make_win32(name, ..
77                              table, ..
78                              files, ..
79                              libs, ..
80                              libname, ..
81                              Makename, ..
82                              with_gateway, ..
83                              ldflags, ..
84                              cflags, ..
85                              fflags)
86
87   managed_ext = ['.cxx', '.cpp', '.c', '.f90', '.f'];
88
89   SCIDIR = SCI;
90   LIBRARY = name;
91   FILES_SRC = '';
92   OBJS = '';
93   OBJS_WITH_PATH = '';
94   FORTRAN_RUNTIME = '';
95   OTHERLIBS = '';
96   CC = '';
97   CFLAGS = cflags;
98   MEXCFLAGS = '';
99   FFLAGS = fflags;
100   MEXFFLAGS = '';
101   LDFLAGS = ldflags;
102   
103   SCILAB_INCLUDES = dlwGetScilabIncludes();
104   SCILAB_INCLUDES = "-I""" + SCILAB_INCLUDES + """";
105   SCILAB_INCLUDES = [SCILAB_INCLUDES(1:$-1) + " \"; SCILAB_INCLUDES($)];
106   SCILAB_INCLUDES = strcat(SCILAB_INCLUDES, ascii(10));
107   
108   SCILAB_LIBS = dlwGetScilabLibraries();
109   SCILAB_LIBS = """$(SCIDIR)/bin/" + SCILAB_LIBS + """";
110   SCILAB_LIBS = [SCILAB_LIBS(1:$-1) + " \"; SCILAB_LIBS($)];
111   SCILAB_LIBS = strcat(SCILAB_LIBS, ascii(10));
112
113   if isempty(libname) then
114     LIBRARY = name;
115   else
116     LIBRARY = libname;
117   end
118
119   FILES_SRC_MATRIX = [];
120
121   [path_Make, file_Make, ext_Make] = fileparts(Makename);
122
123   for i=1:size(files,'*')
124     [path_f, file_f, ext_f] = fileparts(files(i));
125     FILENAME = [];
126     FILE_FOUNDED = %f;
127     for y = managed_ext(:)'
128       if (FILE_FOUNDED == %f) then
129         if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
130           FILENAME = path_f + file_f + y;
131           FILE_FOUNDED = %t;
132         end
133       end
134     end
135     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
136   end
137
138   if typeof(tables) <> 'list' then
139     tables = list(tables);
140   end
141   L = length(tables);
142
143   if with_gateway then
144     if L == 1 then
145       FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + '.c'];
146     else
147        for i=1:L
148         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + '.c'];
149        end
150     end
151   end
152
153   for it=1:L
154     table = tables(it);
155     [mt,nt] = size(table);
156
157     for i=1:mt
158       if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' then
159         MEXCFLAGS = "-Dmexfunction_=mex" + table(i,2) + "_ -DmexFunction=mex_" + table(i,2);
160         MEXFFLAGS = "-Dmexfunction=mex" + table(i,2);
161         if table(i,3)=='cmex' then
162           filenameMex = table(i,2) + '.c';
163         else
164           filenameMex = table(i,2) + '.f';
165         end
166         if grep(FILES_SRC_MATRIX,filenameMex) == [] then
167           FILES_SRC_MATRIX = [FILES_SRC_MATRIX , filenameMex];
168         end
169       end
170     end
171   end
172
173   if isempty(FILES_SRC_MATRIX) | ~and(isfile(FILES_SRC_MATRIX)) then
174     error(999, msprintf(_("%s: Wrong value for input argument #%d: existing file(s) expected.\n"), "ilib_gen_Make", 3));
175   end
176
177   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
178
179   OBJ_DEST_PATH = '';
180   if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
181     OBJ_DEST_PATH = "Release/";
182   else
183     OBJ_DEST_PATH = "Debug/";
184   end
185
186   OBJS_MATRIX = [];
187   OBJS_WITH_PATH_MATRIX = [];
188
189   for y = 1:size(FILES_SRC_MATRIX,'*')
190     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
191     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
192     OBJS_WITH_PATH_MATRIX = [OBJS_WITH_PATH_MATRIX, OBJ_DEST_PATH + path_f + file_f + '.obj'];
193   end
194
195   OBJS = strcat(OBJS_MATRIX, ' ');
196   OBJS_WITH_PATH =  strcat(OBJS_WITH_PATH_MATRIX, ' ');
197
198   if ( or(fileext(FILES_SRC_MATRIX) == '.f90') | or(fileext(FILES_SRC_MATRIX) == '.f') ) then
199     if findmsifortcompiler() <> 'unknown' then
200       if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
201         FORTRAN_RUNTIME = 'libifcoremd.lib libmmd.lib';
202       else
203         FORTRAN_RUNTIME = 'libifcoremdd.lib libmmdd.lib';
204       end
205     end
206   end
207
208   for x=libs(:)'
209      if (x <> [] & x <> '') then
210        if OTHERLIBS <> '' then
211          OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
212        else
213          OTHERLIBS = x + '.lib';
214        end
215      end
216   end
217
218   if isfile(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC') then
219     MAKEFILE_VC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC');
220   else
221     MAKEFILE_VC = '';
222   end
223
224   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCI__", SCIDIR);
225   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCILAB_INCLUDES__", SCILAB_INCLUDES);
226   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCILAB_LIBS__",SCILAB_LIBS);
227   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LIBNAME__", LIBRARY);
228   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FILES_SRC__", FILES_SRC);
229   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS__", OBJS);
230   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS_WITH_PATH__", OBJS_WITH_PATH);
231   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FORTRAN_RUNTIME__", FORTRAN_RUNTIME);
232   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OTHERSLIBS__", OTHERLIBS);
233
234   if CC <> '' then
235     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CC__",CC);
236   else
237     MAKEFILE_VC = strsubst(MAKEFILE_VC, "CC = __CC__","#CC = ");
238   end
239
240   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CFLAGS__", CFLAGS);
241   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXCFLAGS__", MEXCFLAGS);
242   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FFLAGS__", FFLAGS);
243   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXFFLAGS__", MEXFFLAGS);
244   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LDFLAGS__", LDFLAGS);
245
246   if ( MAKEFILE_VC <> '') then
247     mputl(MAKEFILE_VC, Makename);
248
249     if ilib_verbose() > 1 then
250       disp(MAKEFILE_VC);
251     end
252
253   else
254     // TEMPLATE_MAKEFILE.VC not found
255     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC'+ _('not found.') );
256   end
257 endfunction
258 //=============================================================================