1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
function grbcover (what)
%GBCOVER compile ../Test/* for statement coverage testing
%
% This function compiles just the mexFunctions in ../Test.
% It does not compile the GraphBLAS library itself.
%
% See also: grbcover_edit, grbmake
% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
% SPDX-License-Identifier: Apache-2.0
if (ispc)
error ('The tests in Tcov are not ported to Windows') ;
end
% compile the mexFunctions
if (nargin < 1)
what = '' ;
end
make_all = (isequal (what, 'all')) ;
% get a list of the GraphBLAS mexFunctions
mexfunctions = dir ('../Test/GB_mex_*.c') ;
% remove GB_mex_tricount and GB_mex_bfs from the list of mexFunctions
nmex = length (mexfunctions) ;
for k = nmex:-1:1
if (isequal (mexfunctions (k).name, 'GB_mex_tricount.c')) || ...
(isequal (mexfunctions (k).name, 'GB_mex_bfs.c'))
mexfunctions (k) = [ ] ;
end
end
% list of C files to compile
cfiles = [ dir('../Test/GB_mx_*.c') ; dir('GB_cover_util.c') ; ...
dir('../Demo/Source/usercomplex.c') ] ;
% list of *.h and template file dependencies
hfiles = [ dir('../Test/*.h') ; dir('../Test/Template/*.c') ] ;
% list of include directories
inc = '-Itmp_include -I../Test -I../Test/Template -I../lz4 -I../rmm_wrap' ;
inc = [inc ' -I../zstd -I../zstd/zstd_subset -I.'] ;
have_octave = (exist ('OCTAVE_VERSION', 'builtin') == 5) ;
if (have_octave)
need_rename = false ;
else
need_rename = ~verLessThan ('matlab', '9.10') ;
end
addpath ../Test
addpath ../Test/spok
flags = '-g -DGBCOVER -R2018a -DGBNCPUFEAT' ;
if (need_rename)
flags = [flags ' -DGBRENAME=1 '] ;
end
fprintf ('\nCompiling GraphBLAS tests\nplease wait [') ;
try
if (strncmp (computer, 'GLNX', 4))
% remove -ansi from CFLAGS and replace it with -std=c11
cc = mex.getCompilerConfigurations ('C', 'Selected') ;
env = cc.Details.SetEnv ;
c1 = strfind (env, 'CFLAGS=') ;
q = strfind (env, '"') ;
q = q (q > c1) ;
if (~isempty (c1) && length (q) > 1)
c2 = q (2) ;
cflags = env (c1:c2) ; % the CFLAGS="..." string
ansi = strfind (cflags, '-ansi') ;
if (~isempty (ansi))
cflags = [cflags(1:ansi-1) '-std=c11' cflags(ansi+5:end)] ;
flags = [flags ' ' cflags] ;
fprintf ('compiling with -std=c11 instead of default -ansi\n') ;
end
end
end
end
libraries = sprintf ('-L%s -lgraphblas_tcov', pwd) ;
if (ismac)
% Mac (do 'make install' for GraphBLAS first)
% flags = [ flags ' CFLAGS="$CXXFLAGS -Xpreprocessor -fopenmp" ' ] ;
% flags = [ flags ' CXXFLAGS="$CXXFLAGS -Xpreprocessor -fopenmp" ' ] ;
% flags = [ flags ' LDFLAGS="$LDFLAGS -fopenmp"' ] ;
else
% Linux
flags = [ flags ' CFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ;
flags = [ flags ' CXXFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ;
flags = [ flags ' LDFLAGS="$LDFLAGS -fopenmp -fPIC" '] ;
end
dryrun = false ;
% Find the last modification time of any hfile.
% These are #include'd into source files.
htime = 0 ;
for k = 1:length (hfiles)
t = datenum (hfiles (k).date) ;
htime = max (htime, t) ;
end
% compile any source files that need compiling
any_c_compiled = false ;
objlist = '' ;
for k = 1:length (cfiles)
% get the full cfile filename and modification time
cfile = [(cfiles (k).folder) filesep (cfiles (k).name)] ;
tc = datenum (cfiles(k).date) ;
% get the object file name
ofile = cfiles(k).name ;
objfile = [ ofile(1:end-2) '.o' ] ;
% get the object file modification time
ofiles {k} = objfile ;
objlist = [ objlist ' ' objfile ] ;
dobj = dir (objfile) ;
if (isempty (dobj))
% there is no object file; the cfile must be compiled
tobj = 0 ;
else
tobj = datenum (dobj.date) ;
end
% compile the cfile if it is newer than its object file, or any hfile
if (make_all || tc > tobj || htime > tobj)
% compile the cfile
fprintf ('.') ;
% fprintf ('%s\n', cfile) ;
mexcmd = sprintf ('mex -c %s -silent %s %s', flags, inc, cfile) ;
if (dryrun)
fprintf ('%s\n', mexcmd) ;
else
eval (mexcmd) ;
end
any_c_compiled = true ;
end
end
if (ismac)
objlist = [objlist ' libgraphblas_tcov.dylib '] ;
end
% objlist = [objlist ' ../cpu_features/build/libcpu_features.a'] ;
% compile the mexFunctions
for k = 1:length (mexfunctions)
% get the mexFunction filename and modification time
mexfunc = mexfunctions (k).name ;
mexfunction = [(mexfunctions (k).folder) filesep mexfunc] ;
tc = datenum (mexfunctions(k).date) ;
% get the compiled mexFunction modification time
mexfunction_compiled = [ mexfunc(1:end-2) '.' mexext ] ;
dobj = dir (mexfunction_compiled) ;
if (isempty (dobj))
% there is no compiled mexFunction; it must be compiled
tobj = 0 ;
else
tobj = datenum (dobj.date) ;
end
% compile if it is newer than its object file, or if any cfile was compiled
if (make_all || tc > tobj || any_c_compiled)
% compile the mexFunction
mexcmd = sprintf ('mex -silent %s %s %s %s %s', ...
flags, inc, mexfunction, objlist, libraries) ;
fprintf ('.', mexfunction) ;
% fprintf ('%s\n', mexfunction) ;
if (dryrun)
fprintf ('%s\n', mexcmd) ;
else
eval (mexcmd) ;
end
end
end
fprintf (']\n') ;
|