~logan/ubuntu/trusty/suitesparse/4.2.1-3ubuntu1

« back to all changes in this revision

Viewing changes to KLU/MATLAB/klu_make.m

  • Committer: Bazaar Package Importer
  • Author(s): Christophe Prud'homme
  • Date: 2007-05-29 09:36:29 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20070529093629-zowquo0b7slkk6nc
Tags: 3.0.0-2
* suitesparse builds properly twice in a row
* Bug fix: "suitesparse - FTBFS: Broken build depens: libgfortran1-dev",
  thanks to Bastian Blank (Closes: #426349).
* Bug fix: "suitesparse_3.0.0-1: FTBFS: build-depends on
  libgfortran1-dev", thanks to Steve Langasek (Closes: #426354).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
function klu_make (with_cholmod)
 
2
%KLU_MAKE compiles the KLU mexFunctions
 
3
%
 
4
% Example:
 
5
%   klu_make            % compiles KLU without CHOLMOD
 
6
%   klu_make (1)        % with CHOLMOD, CCAMD, CCOLAMD, and METIS
 
7
%
 
8
% KLU relies on AMD, COLAMD, and BTF for its ordering options, and can
 
9
% optionally use CHOLMOD, CCOLAMD, CAMD, and METIS as well.  By default,
 
10
% CHOLMOD, CCOLAMD, CAMD, and METIS are not used.
 
11
%
 
12
% See http://www-users.cs.umn.edu/~karypis/metis for a copy of METIS 4.0.1.
 
13
%
 
14
% You must type the klu_make command while in the KLU/MATLAB directory.
 
15
%
 
16
% See also klu
 
17
 
 
18
% Copyright 2004-2007 Timothy A. Davis, Univ. of Florida
 
19
% http://www.cise.ufl.edu/research/sparse
 
20
 
 
21
if (nargin < 1)
 
22
    with_cholmod = 0 ;
 
23
end
 
24
 
 
25
details = 0 ;       % if 1, print details of each command
 
26
 
 
27
% modify this if your copy of METIS is not in SuiteSparse/metis-4.0:
 
28
metis_path = '../../metis-4.0' ;
 
29
 
 
30
d = '' ;
 
31
if (~isempty (strfind (computer, '64')))
 
32
    % 64-bit MATLAB
 
33
    d = '-largeArrayDims' ;
 
34
end
 
35
 
 
36
fprintf ('Compiling KLU ') ;
 
37
kk = 0 ; 
 
38
 
 
39
include = '-I. -I../../AMD/Include -I../../COLAMD/Include -I../Include -I../../UFconfig -I../../BTF/Include' ;
 
40
 
 
41
if (with_cholmod)
 
42
    include = [include ' -I../../CCOLAMD/Include -I../../CAMD/Include -I../../CHOLMOD/Include -I../../UFconfig -I' metis_path '/Lib -I../User'] ;
 
43
end
 
44
 
 
45
% do not attempt to compile CHOLMOD with large file support (not needed)
 
46
include = [include ' -DNLARGEFILE'] ;
 
47
 
 
48
% fix the METIS 4.0.1 rename.h file
 
49
if (with_cholmod)
 
50
    fprintf ('with CHOLMOD, CCAMD, CCOLAMD, and METIS\n') ;
 
51
    f = fopen ('rename.h', 'w') ;
 
52
    if (f == -1)
 
53
        error ('unable to create rename.h in current directory') ;
 
54
    end
 
55
    fprintf (f, '/* do not edit this file; generated by klu_make */\n') ;
 
56
    fprintf (f, '#undef log2\n') ;
 
57
    fprintf (f, '#include "%s/Lib/rename.h"\n', metis_path) ;
 
58
    fprintf (f, '#undef log2\n') ;
 
59
    fprintf (f, '#define log2 METIS__log2\n') ;
 
60
    fprintf (f, '#include "mex.h"\n') ;
 
61
    fprintf (f, '#define malloc mxMalloc\n') ;
 
62
    fprintf (f, '#define free mxFree\n') ;
 
63
    fprintf (f, '#define calloc mxCalloc\n') ;
 
64
    fprintf (f, '#define realloc mxRealloc\n') ;
 
65
    fclose (f) ;
 
66
    include = ['-DNSUPERNODAL -DNMODIFY -DNMATRIXOPS -DNCHECK ' include] ;
 
67
else
 
68
    fprintf ('without CHOLMOD, CCAMD, CCOLAMD, and METIS\n') ;
 
69
    include = ['-DNCHOLMOD ' include] ;
 
70
end
 
71
 
 
72
include = strrep (include, '/', filesep) ;
 
73
 
 
74
amd_src = { ...
 
75
    '../../AMD/Source/amd_1', ...
 
76
    '../../AMD/Source/amd_2', ...
 
77
    '../../AMD/Source/amd_aat', ...
 
78
    '../../AMD/Source/amd_control', ...
 
79
    '../../AMD/Source/amd_defaults', ...
 
80
    '../../AMD/Source/amd_dump', ...
 
81
    '../../AMD/Source/amd_global', ...
 
82
    '../../AMD/Source/amd_info', ...
 
83
    '../../AMD/Source/amd_order', ...
 
84
    '../../AMD/Source/amd_postorder', ...
 
85
    '../../AMD/Source/amd_post_tree', ...
 
86
    '../../AMD/Source/amd_preprocess', ...
 
87
    '../../AMD/Source/amd_valid' } ;
 
88
 
 
89
camd_src = { ...
 
90
    '../../CAMD/Source/camd_1', ...
 
91
    '../../CAMD/Source/camd_2', ...
 
92
    '../../CAMD/Source/camd_aat', ...
 
93
    '../../CAMD/Source/camd_control', ...
 
94
    '../../CAMD/Source/camd_defaults', ...
 
95
    '../../CAMD/Source/camd_dump', ...
 
96
    '../../CAMD/Source/camd_global', ...
 
97
    '../../CAMD/Source/camd_info', ...
 
98
    '../../CAMD/Source/camd_order', ...
 
99
    '../../CAMD/Source/camd_postorder', ...
 
100
    '../../CAMD/Source/camd_preprocess', ...
 
101
    '../../CAMD/Source/camd_valid' } ;
 
102
 
 
103
colamd_src = {
 
104
    '../../COLAMD/Source/colamd', ...
 
105
    '../../COLAMD/Source/colamd_global' } ;
 
106
 
 
107
ccolamd_src = {
 
108
    '../../CCOLAMD/Source/ccolamd', ...
 
109
    '../../CCOLAMD/Source/ccolamd_global' } ;
 
110
 
 
111
metis_src = {
 
112
    'Lib/balance', ...
 
113
    'Lib/bucketsort', ...
 
114
    'Lib/ccgraph', ...
 
115
    'Lib/coarsen', ...
 
116
    'Lib/compress', ...
 
117
    'Lib/debug', ...
 
118
    'Lib/estmem', ...
 
119
    'Lib/fm', ...
 
120
    'Lib/fortran', ...
 
121
    'Lib/frename', ...
 
122
    'Lib/graph', ...
 
123
    'Lib/initpart', ...
 
124
    'Lib/kmetis', ...
 
125
    'Lib/kvmetis', ...
 
126
    'Lib/kwayfm', ...
 
127
    'Lib/kwayrefine', ...
 
128
    'Lib/kwayvolfm', ...
 
129
    'Lib/kwayvolrefine', ...
 
130
    'Lib/match', ...
 
131
    'Lib/mbalance2', ...
 
132
    'Lib/mbalance', ...
 
133
    'Lib/mcoarsen', ...
 
134
    'Lib/memory', ...
 
135
    'Lib/mesh', ...
 
136
    'Lib/meshpart', ...
 
137
    'Lib/mfm2', ...
 
138
    'Lib/mfm', ...
 
139
    'Lib/mincover', ...
 
140
    'Lib/minitpart2', ...
 
141
    'Lib/minitpart', ...
 
142
    'Lib/mkmetis', ...
 
143
    'Lib/mkwayfmh', ...
 
144
    'Lib/mkwayrefine', ...
 
145
    'Lib/mmatch', ...
 
146
    'Lib/mmd', ...
 
147
    'Lib/mpmetis', ...
 
148
    'Lib/mrefine2', ...
 
149
    'Lib/mrefine', ...
 
150
    'Lib/mutil', ...
 
151
    'Lib/myqsort', ...
 
152
    'Lib/ometis', ...
 
153
    'Lib/parmetis', ...
 
154
    'Lib/pmetis', ...
 
155
    'Lib/pqueue', ...
 
156
    'Lib/refine', ...
 
157
    'Lib/separator', ...
 
158
    'Lib/sfm', ...
 
159
    'Lib/srefine', ...
 
160
    'Lib/stat', ...
 
161
    'Lib/subdomains', ...
 
162
    'Lib/timing', ...
 
163
    'Lib/util' } ;
 
164
 
 
165
for i = 1:length (metis_src)
 
166
    metis_src {i} = [metis_path '/' metis_src{i}] ;
 
167
end
 
168
 
 
169
cholmod_src = {
 
170
    '../../CHOLMOD/Core/cholmod_aat', ...
 
171
    '../../CHOLMOD/Core/cholmod_add', ...
 
172
    '../../CHOLMOD/Core/cholmod_band', ...
 
173
    '../../CHOLMOD/Core/cholmod_change_factor', ...
 
174
    '../../CHOLMOD/Core/cholmod_common', ...
 
175
    '../../CHOLMOD/Core/cholmod_complex', ...
 
176
    '../../CHOLMOD/Core/cholmod_copy', ...
 
177
    '../../CHOLMOD/Core/cholmod_dense', ...
 
178
    '../../CHOLMOD/Core/cholmod_error', ...
 
179
    '../../CHOLMOD/Core/cholmod_factor', ...
 
180
    '../../CHOLMOD/Core/cholmod_memory', ...
 
181
    '../../CHOLMOD/Core/cholmod_sparse', ...
 
182
    '../../CHOLMOD/Core/cholmod_transpose', ...
 
183
    '../../CHOLMOD/Core/cholmod_triplet', ...
 
184
    '../../CHOLMOD/Cholesky/cholmod_amd', ...
 
185
    '../../CHOLMOD/Cholesky/cholmod_analyze', ...
 
186
    '../../CHOLMOD/Cholesky/cholmod_colamd', ...
 
187
    '../../CHOLMOD/Cholesky/cholmod_etree', ...
 
188
    '../../CHOLMOD/Cholesky/cholmod_postorder', ...
 
189
    '../../CHOLMOD/Cholesky/cholmod_rowcolcounts', ...
 
190
    '../../CHOLMOD/Partition/cholmod_ccolamd', ...
 
191
    '../../CHOLMOD/Partition/cholmod_csymamd', ...
 
192
    '../../CHOLMOD/Partition/cholmod_camd', ...
 
193
    '../../CHOLMOD/Partition/cholmod_metis', ...
 
194
    '../../CHOLMOD/Partition/cholmod_nesdis' } ;
 
195
 
 
196
btf_src = {
 
197
    '../../BTF/Source/btf_maxtrans', ...
 
198
    '../../BTF/Source/btf_order', ...
 
199
    '../../BTF/Source/btf_strongcomp' } ;
 
200
 
 
201
klu_src = {
 
202
    '../Source/klu_free_symbolic', ...
 
203
    '../Source/klu_defaults', ...
 
204
    '../Source/klu_analyze_given', ...
 
205
    '../Source/klu_analyze', ...
 
206
    '../Source/klu_memory' } ;
 
207
 
 
208
if (with_cholmod)
 
209
    klu_src = [klu_src { '../User/klu_l_cholmod' }] ;                       %#ok
 
210
end
 
211
 
 
212
klu_zlsrc = {
 
213
    '../Source/klu', ...
 
214
    '../Source/klu_kernel', ...
 
215
    '../Source/klu_dump', ...
 
216
    '../Source/klu_factor', ...
 
217
    '../Source/klu_free_numeric', ...
 
218
    '../Source/klu_solve', ...
 
219
    '../Source/klu_scale', ...
 
220
    '../Source/klu_refactor', ...
 
221
    '../Source/klu_tsolve', ...
 
222
    '../Source/klu_diagnostics', ...
 
223
    '../Source/klu_sort', ...
 
224
    '../Source/klu_extract', ...
 
225
    } ;
 
226
 
 
227
klu_lobj = {
 
228
    'klu_l', ...
 
229
    'klu_l_kernel', ...
 
230
    'klu_l_dump', ...
 
231
    'klu_l_factor', ...
 
232
    'klu_l_free_numeric', ...
 
233
    'klu_l_solve', ...
 
234
    'klu_l_scale', ...
 
235
    'klu_l_refactor', ...
 
236
    'klu_l_tsolve', ...
 
237
    'klu_l_diagnostics', ...
 
238
    'klu_l_sort', ...
 
239
    'klu_l_extract', ...
 
240
    } ;
 
241
 
 
242
klu_zlobj = {
 
243
    'klu_zl', ...
 
244
    'klu_zl_kernel', ...
 
245
    'klu_zl_dump', ...
 
246
    'klu_zl_factor', ...
 
247
    'klu_zl_free_numeric', ...
 
248
    'klu_zl_solve', ...
 
249
    'klu_zl_scale', ...
 
250
    'klu_zl_refactor', ...
 
251
    'klu_zl_tsolve', ...
 
252
    'klu_zl_diagnostics', ...
 
253
    'klu_zl_sort', ...
 
254
    'klu_zl_extract', ...
 
255
    } ;
 
256
 
 
257
try
 
258
    % ispc does not appear in MATLAB 5.3
 
259
    pc = ispc ;
 
260
catch
 
261
    % if ispc fails, assume we are on a Windows PC if it's not unix
 
262
    pc = ~isunix ;
 
263
end
 
264
 
 
265
if (pc)
 
266
    % Windows does not have drand48 and srand48, required by METIS.  Use
 
267
    % drand48 and srand48 in CHOLMOD/MATLAB/Windows/rand48.c instead.
 
268
    obj_extension = '.obj' ;
 
269
    cholmod_src = [cholmod_src {'../../CHOLMOD/MATLAB/Windows/rand48'}] ;
 
270
    include = [include ' -I../../CHOLMOD/MATLAB/Windows'] ;
 
271
else
 
272
    obj_extension = '.o' ;
 
273
end
 
274
 
 
275
% compile each library source file
 
276
obj = ' ' ;
 
277
 
 
278
source = [amd_src btf_src klu_src colamd_src] ;
 
279
if (with_cholmod)
 
280
    source = [metis_src ccolamd_src camd_src cholmod_src source] ;
 
281
end
 
282
 
 
283
for f = source
 
284
    fs = strrep (f {1}, '/', filesep) ;
 
285
    slash = strfind (fs, filesep) ;
 
286
    if (isempty (slash))
 
287
        slash = 1 ;
 
288
    else
 
289
        slash = slash (end) + 1 ;
 
290
    end
 
291
    o = fs (slash:end) ;
 
292
    obj = [obj  ' ' o obj_extension] ;                                      %#ok
 
293
    s = sprintf ('mex %s -DDLONG -O %s -c %s.c', d, include, fs) ;
 
294
    kk = do_cmd (s, kk, details) ;
 
295
end
 
296
 
 
297
for k = 1:length(klu_zlsrc)
 
298
    ff = strrep (klu_zlsrc {k}, '/', filesep) ;
 
299
    slash = strfind (ff, filesep) ;
 
300
    if (isempty (slash))
 
301
        slash = 1 ;
 
302
    else
 
303
        slash = slash (end) + 1 ;
 
304
    end
 
305
    o = ff (slash:end) ;
 
306
    s = sprintf ('mex %s -DDLONG -O %s -c %s.c', d, include, ff) ;
 
307
    kk = do_cmd (s, kk, details) ;
 
308
    lobj = klu_lobj {k} ;
 
309
    obj = [obj  ' ' lobj obj_extension] ;                                   %#ok
 
310
    mvfile ([o obj_extension], [lobj obj_extension]) ;
 
311
    s = sprintf ('mex %s -DDLONG -DCOMPLEX -O %s -c %s.c', d, include, ff) ;
 
312
    kk = do_cmd (s, kk, details) ;
 
313
    zlobj = klu_zlobj {k} ;
 
314
    obj = [obj  ' ' zlobj obj_extension] ;                                  %#ok
 
315
    mvfile ([o obj_extension], [zlobj obj_extension]) ;
 
316
end
 
317
 
 
318
% compile the KLU mexFunction
 
319
s = sprintf ('mex %s -DDLONG -O %s -output klu klu_mex.c', d, include) ;
 
320
s = [s obj] ;                                                               %#ok
 
321
kk = do_cmd (s, kk, details) ;
 
322
 
 
323
% clean up
 
324
s = ['delete ' obj] ;
 
325
do_cmd (s, kk, details) ;
 
326
 
 
327
fprintf ('\nKLU successfully compiled\n') ;
 
328
 
 
329
%-------------------------------------------------------------------------------
 
330
 
 
331
function rmfile (file)
 
332
% rmfile:  delete a file, but only if it exists
 
333
if (length (dir (file)) > 0)                                                %#ok
 
334
    delete (file) ;
 
335
end
 
336
 
 
337
%-------------------------------------------------------------------------------
 
338
 
 
339
function cpfile (src, dst)
 
340
% cpfile:  copy the src file to the filename dst, overwriting dst if it exists
 
341
rmfile (dst)
 
342
if (length (dir (src)) == 0)    %#ok
 
343
    fprintf ('File does not exist: %s\n', src) ;
 
344
    error ('File does not exist') ;
 
345
end
 
346
copyfile (src, dst) ;
 
347
 
 
348
%-------------------------------------------------------------------------------
 
349
 
 
350
function mvfile (src, dst)
 
351
% mvfile:  move the src file to the filename dst, overwriting dst if it exists
 
352
cpfile (src, dst) ;
 
353
rmfile (src) ;
 
354
 
 
355
%-------------------------------------------------------------------------------
 
356
function kk = do_cmd (s, kk, details)
 
357
%DO_CMD: evaluate a command, and either print it or print a "."
 
358
if (details)
 
359
    fprintf ('%s\n', s) ;
 
360
else
 
361
    if (mod (kk, 60) == 0)
 
362
        fprintf ('\n') ;
 
363
    end
 
364
    kk = kk + 1 ;
 
365
    fprintf ('.') ;
 
366
end
 
367
eval (s) ;
 
368