Installation error after make: strcmp instead of strdup?

GROMACS version: 2020.4
GROMACS modification: No

Hi,

I am trying to install GROMACS on Windows 10 via Cygwin. I used the default cmake configuration (cmake … -DGMX_BUILD_OWN_FFTW=ON -DREGRESSIONTEST_DOWNLOAD=ON), and it went fine. After “make”, this happened:
(Some really long codes involving “checking” and “making install.” I can provide the codes before the error if needed.)
Scanning dependencies of target lmfit_objlib
[ 2%] Building CXX object src/gromacs/CMakeFiles/lmfit_objlib.dir//external/l
mfit/lmmin.cpp.o
[ 2%] Built target lmfit_objlib
Scanning dependencies of target thread_mpi
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/errhandler.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/tmpi_malloc.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/atomic.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/lock.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/pthreads.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/system_error.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/alltoall.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/p2p_protocol.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/barrier.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/p2p_send_recv.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/bcast.cpp.o
[ 2%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/p2p_wait.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/collective.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/profile.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/comm.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/reduce.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/event.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/reduce_fast.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/gather.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/scatter.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thr
ead_mpi/src/group.cpp.o
[ 4%] Building CXX object src/gromacs/CMakeFiles/thread_mpi.dir//external/thr
ead_mpi/src/tmpi_init.cpp.o
/cygdrive/c/Users/Jinyi/Downloads/gromacs-2020.4/src/external/thread_mpi/src/tmpi_init.cpp: In function ‘int tMPI_Start_threads(tmpi_bool, int, tMPI_Affinity_strategy, int*, char***, void ()(const void), const void*, int (*)(int, char**))’:
/cygdrive/c/Users/Jinyi/Downloads/gromacs-2020.4/src/external/thread_mpi/src/tmpi_init.cpp:476:42: error: ‘strdup’ was not declared in this scope; did you mean ‘strcmp’?
476 | threads[i].argv[j] = strdup( (*argv)[j] );
| ^~~~~~
| strcmp
make[2]: *** [src/gromacs/CMakeFiles/thread_mpi.dir/build.make:356: src/gromacs/CMakeFiles/thread_mpi.dir/
/external/thread_mpi/src/tmpi_init.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:4331: src/gromacs/CMakeFiles/thread_mpi.dir/all] Error 2
make: *** [Makefile:183: all] Error 2

I am very new to this. Googling this error hasn’t revealed much. Any suggestion would be immensely helpful.

Thank you very much in advance for your time.

Hi jyang,

That is a specific cygwin issue that you are experiencing - for security reasons, cygwin dumped the strdup function from <string.h>.

I reported this as a bug to be fixed in a later gromacs version here

Until then you can either:

  • use WSL (Windows subsystem for Linux) instead of cygwin
  • in tmpi_init.cpp you can try replacing in lines 476 and 478 with
    threads[i].argv[j] = strndup( (*argv)[j] , 1000);
    (note the extra n in there) This I did not try, because I don’t have cygwin installed, but this will likely fix the bug.

Let me know how it went!
Christian

Hi Christian,

Thank you so much for the reply. I tried changing to strndup, but the same error occurred, suggesting “strncmp” instead.

I will try using WSL.

Thank you!

Jinyi

Thanks for trying! Guess I’ll have to look a bit deeper into what’s happening there.

Hello,

I think those are general warnings for the unsafe copy actions that are
not limited to a number of characters.
We would need to consider updating the code in the external thread-mpi
to be a bit safer by using a modern coding standard.

Cheers

Paul