40c82b76153281f86b8fb4dc2eb12c302625acc0
[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   SCIDIR1 = pathconvert(SCI,%f,%f,'w');
91   LIBRARY = name;
92   FILES_SRC = '';
93   OBJS = '';
94   OBJS_WITH_PATH = '';
95   FORTRAN_RUNTIME = '';
96   OTHERLIBS = '';
97   CC = '';
98   CFLAGS = cflags;
99   MEXCFLAGS = '';
100   FFLAGS = fflags;
101   MEXFFLAGS = '';
102   LDFLAGS = ldflags;
103
104   if isempty(libname) then
105     LIBRARY = name;
106   else
107     LIBRARY = libname;
108   end
109
110   FILES_SRC_MATRIX = [];
111
112   [path_Make, file_Make, ext_Make] = fileparts(Makename);
113
114   for i=1:size(files,'*')
115     [path_f, file_f, ext_f] = fileparts(files(i));
116     FILENAME = [];
117     FILE_FOUNDED = %f;
118     for y = managed_ext(:)'
119       if (FILE_FOUNDED == %f) then
120         if (fileinfo(path_f + file_f + y) <> []) | (fileinfo(path_Make + file_f + y) <> []) then
121           FILENAME = path_f + file_f + y;
122           FILE_FOUNDED = %t;
123         end
124       end
125     end
126     FILES_SRC_MATRIX = [FILES_SRC_MATRIX , FILENAME];
127   end
128
129   if typeof(tables) <> 'list' then
130     tables = list(tables);
131   end
132   L = length(tables);
133
134   if with_gateway then
135     if L == 1 then
136       FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + '.c'];
137     else
138        for i=1:L
139         FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + '.c'];
140        end
141     end
142   end
143
144   for it=1:L
145     table = tables(it);
146     [mt,nt] = size(table);
147
148     for i=1:mt
149       if table(i,3)=='cmex' | table(i,3)=='fmex' | table(i,3)=='Fmex' then
150         MEXCFLAGS = "-Dmexfunction_=mex" + table(i,2) + "_ -DmexFunction=mex_" + table(i,2);
151         MEXFFLAGS = "-Dmexfunction=mex" + table(i,2);
152         if table(i,3)=='cmex' then
153           filenameMex = table(i,2) + '.c';
154         else
155           filenameMex = table(i,2) + '.f';
156         end
157         if grep(FILES_SRC_MATRIX,filenameMex) == [] then
158           FILES_SRC_MATRIX = [FILES_SRC_MATRIX , filenameMex];
159         end
160       end
161     end
162   end
163
164   if isempty(FILES_SRC_MATRIX) | ~and(isfile(FILES_SRC_MATRIX)) then
165     error(999, msprintf(_("%s: Wrong value for input argument #%d: existing file(s) expected.\n"), "ilib_gen_Make", 3));
166   end
167
168   FILES_SRC = strcat(FILES_SRC_MATRIX,' ');
169
170   OBJ_DEST_PATH = '';
171   if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
172     OBJ_DEST_PATH = "Release/";
173   else
174     OBJ_DEST_PATH = "Debug/";
175   end
176
177   OBJS_MATRIX = [];
178   OBJS_WITH_PATH_MATRIX = [];
179
180   for y = 1:size(FILES_SRC_MATRIX,'*')
181     [path_f, file_f, ext_f] = fileparts(FILES_SRC_MATRIX(y));
182     OBJS_MATRIX = [OBJS_MATRIX, path_f + file_f + '.obj'];
183     OBJS_WITH_PATH_MATRIX = [OBJS_WITH_PATH_MATRIX, OBJ_DEST_PATH + path_f + file_f + '.obj'];
184   end
185
186   OBJS = strcat(OBJS_MATRIX, ' ');
187   OBJS_WITH_PATH =  strcat(OBJS_WITH_PATH_MATRIX, ' ');
188
189   if ( or(fileext(FILES_SRC_MATRIX) == '.f90') | or(fileext(FILES_SRC_MATRIX) == '.f') ) then
190     if findmsifortcompiler() <> 'unknown' then
191       if (getenv("DEBUG_SCILAB_DYNAMIC_LINK","NO") == "NO") then
192         FORTRAN_RUNTIME = 'libifcoremd.lib libmmd.lib';
193       else
194         FORTRAN_RUNTIME = 'libifcoremdd.lib libmmdd.lib';
195       end
196     end
197   end
198
199   for x=libs(:)'
200      if (x <> [] & x <> '') then
201        if OTHERLIBS <> '' then
202          OTHERLIBS = OTHERLIBS + ' ' + x + '.lib';
203        else
204          OTHERLIBS = x + '.lib';
205        end
206      end
207   end
208
209   if isfile(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC') then
210     MAKEFILE_VC = mgetl(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC');
211   else
212     MAKEFILE_VC = '';
213   end
214
215   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCI__", SCIDIR);
216   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__SCIDIR1__", SCIDIR1);
217   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LIBNAME__", LIBRARY);
218   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FILES_SRC__", FILES_SRC);
219   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS__", OBJS);
220   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OBJS_WITH_PATH__", OBJS_WITH_PATH);
221   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FORTRAN_RUNTIME__", FORTRAN_RUNTIME);
222   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__OTHERSLIBS__", OTHERLIBS);
223
224   if CC <> '' then
225     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CC__",CC);
226   else
227     MAKEFILE_VC = strsubst(MAKEFILE_VC, "CC = __CC__","#CC = ");
228   end
229
230   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CFLAGS__", CFLAGS);
231   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXCFLAGS__", MEXCFLAGS);
232   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FFLAGS__", FFLAGS);
233   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXFFLAGS__", MEXFFLAGS);
234   MAKEFILE_VC = strsubst(MAKEFILE_VC, "__LDFLAGS__", LDFLAGS);
235
236   if ( MAKEFILE_VC <> '') then
237     mputl(MAKEFILE_VC, Makename);
238
239     if ilib_verbose() > 1 then
240       disp(MAKEFILE_VC);
241     end
242
243   else
244     // TEMPLATE_MAKEFILE.VC not found
245     warning(SCI+'/modules/dynamic_link/src/scripts/TEMPLATE_MAKEFILE.VC'+ _('not found.') );
246   end
247 endfunction
248 //=============================================================================