<div dir="ltr"><div>Barry/Satish, you know that making requests without patches is not my style, but this one involves messing with BuildSystem, so please pardon me.</div><div><br></div><div>I have a easy and quick proposal for compile-time determination of sizeof() for the various C types. For example, in our Cray XC40, I'm passing all these flags to configure to avoid the need of running with batch:</div><div><br></div><div>$ grep known-sizeof reconfigure-arch-gnu-opt.py<br></div><div>    '--known-sizeof-MPI_Comm=4',<br>    '--known-sizeof-MPI_Fint=4',<br>    '--known-sizeof-char=1',<br>    '--known-sizeof-double=8',<br>    '--known-sizeof-float=4',<br>    '--known-sizeof-int=4',<br>    '--known-sizeof-long-long=8',<br>    '--known-sizeof-long=8',<br>    '--known-sizeof-short=2',<br>    '--known-sizeof-size_t=8',<br>    '--known-sizeof-void-p=8',<br></div><div><br></div><div><br></div>Look at the following two line C source, TYPE and SIZE have to be passed through the preprocessor in this quick example. Defining main is of course not required if we pass `-c` to the compiler.<div><br clear="all"><div>$ cat check-sizeof.c<br>typedef char assert_sizeof[(sizeof(TYPE)==SIZE)*2-1];<br>int main(int arg, char *argv[]) { return 0;}<br><br></div><div>Let's try to determine sizeof(double) by compile-time checks that do not need to run the executable.</div><div><br>$ cc -DTYPE=double -DSIZE=1 check-sizeof.c<br>check-sizeof.c:1:14: error: size of array ‘assert_sizeof’ is negative<br>    1 | typedef char assert_sizeof[(sizeof(TYPE)==SIZE)*2-1];<br>      |              ^~~~~~~~~~~~~<br><br></div><div>$ cc -DTYPE=double -DSIZE=2 check-sizeof.c<br>check-sizeof.c:1:14: error: size of array ‘assert_sizeof’ is negative<br>    1 | typedef char assert_sizeof[(sizeof(TYPE)==SIZE)*2-1];<br>      |              ^~~~~~~~~~~~~<br><br></div><div>$ cc -DTYPE=double -DSIZE=4 check-sizeof.c<br>check-sizeof.c:1:14: error: size of array ‘assert_sizeof’ is negative<br>    1 | typedef char assert_sizeof[(sizeof(TYPE)==SIZE)*2-1];<br>      |              ^~~~~~~~~~~~~<br><br></div><div>Up to here, sizeof(double) is not 1, nor 2, nor 4.</div><div><br></div><div>Let's try now if sizeof(double) is 8:</div><div><br></div><div>$ cc -DTYPE=double -DSIZE=8 check-sizeof.c<br></div><div><br></div><div>No compile error. Success! Now we know sizeof(double) is 8, we don't need to run an executable, which is ideal for cross-compiling or to avoid running the configure test with batch.</div><div><br></div><div><br></div><div>-- <br></div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Lisandro Dalcin<br>============<br>Research Scientist<br>Extreme Computing Research Center (ECRC)<br>King Abdullah University of Science and Technology (KAUST)<br><a href="http://ecrc.kaust.edu.sa/" target="_blank">http://ecrc.kaust.edu.sa/</a><br></div></div></div></div></div>