UPDATE: diana_coman has pointed out that this is a known issue related to default C version used by later gcc versions. phf had exactly the same problem with vdiff. So the patches in the end of the article should be ignored. Use the following instead (or better, install gcc 4.9):
curl 'http://bvt-trace.net/vpatches/smg_comms_mpi_c_version.vpatch' > smg_comms_mpi_c_version.vpatch curl 'http://bvt-trace.net/vpatches/smg_comms_mpi_c_version.vpatch.bvt.sig' > smg_comms_mpi_c_version.vpatch.bvt.sig
--
I use nonstandard GNAT compiler as a leftover from the pre-WoT days1. I expect that I will stop using it some time in the future, and I sure as hell don't expect that people will change anything in their software (well-established at this point) to make it work with this nonstandard item. However, sometimes it exposes subtle breakage, so I believe that using this compiler has paid off so far.
Having tested compiling FFA Chapter 8 code to check if GNAT will specialize a package in presence of numerous restrictions, I wanted to do the same test with SMG_Comms. I discovered no problems related to specialization, however I did find issue with multiple definitions of inline functions in C code:
$ gprbuild tests/test_comms.gpr Compile [Ada] testall.adb [Ada] test_packing.adb test_packing.adb:74:80: (style) this line is too long test_packing.adb:75:80: (style) this line is too long test_packing.adb:76:80: (style) this line is too long test_packing.adb:77:80: (style) this line is too long test_packing.adb:78:80: (style) this line is too long test_packing.adb:79:80: (style) this line is too long [Ada] test_rsa_oaep.adb [Ada] test_serializing.adb [Ada] test_serpent.adb Bind [gprbind] testall.bexch [Ada] testall.ali Link [link] testall.adb ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-mul.o): In function `mpihelp_add_1': mpi-mul.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-mul.o): In function `mpihelp_add': mpi-mul.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-mul.o): In function `mpihelp_sub_1': mpi-mul.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-mul.o): In function `mpihelp_sub': mpi-mul.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-div.o): In function `mpihelp_add_1': mpih-div.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-div.o): In function `mpihelp_add': mpih-div.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-div.o): In function `mpihelp_sub_1': mpih-div.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-div.o): In function `mpihelp_sub': mpih-div.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-pow.o): In function `mpihelp_add_1': mpi-pow.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-pow.o): In function `mpihelp_add': mpi-pow.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-pow.o): In function `mpihelp_sub_1': mpi-pow.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-pow.o): In function `mpihelp_sub': mpi-pow.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-inv.o): In function `mpihelp_add_1': mpi-inv.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-inv.o): In function `mpihelp_add': mpi-inv.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-inv.o): In function `mpihelp_sub_1': mpi-inv.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-inv.o): In function `mpihelp_sub': mpi-inv.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-add.o): In function `mpihelp_add_1': mpi-add.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-add.o): In function `mpihelp_add': mpi-add.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-add.o): In function `mpihelp_sub_1': mpi-add.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-add.o): In function `mpihelp_sub': mpi-add.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpiutil.o): In function `mpihelp_add_1': mpiutil.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpiutil.o): In function `mpihelp_add': mpiutil.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpiutil.o): In function `mpihelp_sub_1': mpiutil.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpiutil.o): In function `mpihelp_sub': mpiutil.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-rshift.o): In function `mpihelp_add_1': mpih-rshift.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-rshift.o): In function `mpihelp_add': mpih-rshift.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-rshift.o): In function `mpihelp_sub_1': mpih-rshift.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-rshift.o): In function `mpihelp_sub': mpih-rshift.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-scan.o): In function `mpihelp_add_1': mpi-scan.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-scan.o): In function `mpihelp_add': mpi-scan.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-scan.o): In function `mpihelp_sub_1': mpi-scan.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-scan.o): In function `mpihelp_sub': mpi-scan.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-cmp.o): In function `mpihelp_add_1': mpi-cmp.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-cmp.o): In function `mpihelp_add': mpi-cmp.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-cmp.o): In function `mpihelp_sub_1': mpi-cmp.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-cmp.o): In function `mpihelp_sub': mpi-cmp.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-lshift.o): In function `mpihelp_add_1': mpih-lshift.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-lshift.o): In function `mpihelp_add': mpih-lshift.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-lshift.o): In function `mpihelp_sub_1': mpih-lshift.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-lshift.o): In function `mpihelp_sub': mpih-lshift.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul.o): In function `mpihelp_add_1': mpih-mul.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul.o): In function `mpihelp_add': mpih-mul.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul.o): In function `mpihelp_sub_1': mpih-mul.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul.o): In function `mpihelp_sub': mpih-mul.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul1.o): In function `mpihelp_add_1': mpih-mul1.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul1.o): In function `mpihelp_add': mpih-mul1.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul1.o): In function `mpihelp_sub_1': mpih-mul1.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul1.o): In function `mpihelp_sub': mpih-mul1.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-bit.o): In function `mpihelp_add_1': mpi-bit.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-bit.o): In function `mpihelp_add': mpi-bit.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-bit.o): In function `mpihelp_sub_1': mpi-bit.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-bit.o): In function `mpihelp_sub': mpi-bit.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-add1.o): In function `mpihelp_add_1': mpih-add1.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-add1.o): In function `mpihelp_add': mpih-add1.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-add1.o): In function `mpihelp_sub_1': mpih-add1.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-add1.o): In function `mpihelp_sub': mpih-add1.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-sub1.o): In function `mpihelp_add_1': mpih-sub1.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-sub1.o): In function `mpihelp_add': mpih-sub1.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-sub1.o): In function `mpihelp_sub_1': mpih-sub1.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-sub1.o): In function `mpihelp_sub': mpih-sub1.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpicoder.o): In function `mpihelp_add_1': mpicoder.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpicoder.o): In function `mpihelp_add': mpicoder.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpicoder.o): In function `mpihelp_sub_1': mpicoder.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpicoder.o): In function `mpihelp_sub': mpicoder.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-cmp.o): In function `mpihelp_add_1': mpih-cmp.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-cmp.o): In function `mpihelp_add': mpih-cmp.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-cmp.o): In function `mpihelp_sub_1': mpih-cmp.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-cmp.o): In function `mpihelp_sub': mpih-cmp.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul3.o): In function `mpihelp_add_1': mpih-mul3.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul3.o): In function `mpihelp_add': mpih-mul3.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul3.o): In function `mpihelp_sub_1': mpih-mul3.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul3.o): In function `mpihelp_sub': mpih-mul3.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul2.o): In function `mpihelp_add_1': mpih-mul2.c:(.text+0x0): multiple definition of `mpihelp_add_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x0): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul2.o): In function `mpihelp_add': mpih-mul2.c:(.text+0xd7): multiple definition of `mpihelp_add' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0xd7): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul2.o): In function `mpihelp_sub_1': mpih-mul2.c:(.text+0x168): multiple definition of `mpihelp_sub_1' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x168): first defined here ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpih-mul2.o): In function `mpihelp_sub': mpih-mul2.c:(.text+0x242): multiple definition of `mpihelp_sub' ~/src/smg-comms/a/smg_comms/mpi/bin/libMPI.a(mpi-div.o):mpi-div.c:(.text+0x242): first defined here collect2: error: ld returned 1 exit status gprbuild: link of testall.adb failed
The functions in question (mpihelp_add, mpihelp_add_1, mpihelp_sub, mpihelp_sub_1) are declared in 'mpi/include/mpi-internal.h' and defined in 'mpi/include/mpi-inline.h'. All files where double definitions are present (mpi-add.c, mpi-bit.c, mpi-cmp.c, mpicoder.c, mpi-div.c, mpih-add1.c, mpih-cmp.c, mpih-div.c, mpih-lshift.c, mpih-mul1.c, mpih-mul2.c, mpih-mul3.c, mpih-mul.c, mpih-rshift.c, mpih-sub1.c, mpi-inv.c, mpi-mul.c, mpi-pow.c, mpi-scan.c, mpiutil.c) directly or indirectly include these headers. After studying the C standard for some time, I fixed the problem removing 'extern' from function definitions, and adding 'inline' to function declarations. Given that the compiler inside GNAT2017 is gcc-6.3.1, which is explicitly tagged as broken, I really don't expect inclusion of this vpatch into the tree. But in any case, here it is:
curl 'http://bvt-trace.net/vpatches/smg_comms_fix_mpi_inline.vpatch' > smg_comms_fix_mpi_inline.vpatch curl 'http://bvt-trace.net/vpatches/smg_comms_fix_mpi_inline.vpatch.bvt.sig' > smg_comms_fix_mpi_inline.vpatch.bvt.sig curl 'http://wot.deedbot.org/6CF3EFF892A7F23E7E798E5EBA6B8C054B962B68.asc' > bvt.asc
The issue is basically an incompatibility between the inline/extern interpretation in the two different standards used by gcc 4.9 (gnu89 is the default, meaning c89 + extensions) and the gcc you are using there (c99 standard from what I gather). Have you tried perhaps compiling with -std=gnu89?
Anyway, your .vpatch is useful for people who insist on compiling with gcc 6 or whatever version > 4.9 they want. However, note that it does *not* really fix the code - what it does is it upgrades the code to gcc 6 and in the process it makes it fail on gcc 4.9 (try it). So you are welcome to maintain this as a branch on the smg_comms tree but it won't become part of the main trunk (i.e. you'll have to then port future patches to your branch too to keep it up to date).