[Cmake] compiling and testing CMake with gcc -mno-cygwin for MinGW

Wheeler, Frederick W (Research) wheeler at crd.ge.com
Tue, 20 Jan 2004 14:08:16 -0500


CMake List:

I've been trying to get CMake to build and pass it's tests in Cygwin
using gcc with the -mno-cygwin option to use the MinGW libraries
instead of Cygwin.  The build works fine now (thanks to recent
CMakeDetermineCCompiler.cmake change), but some of the tests fail.
Part of the problem (perhaps all of the problem?) is that the
-mno-cygwin option is not used everywhere it needs to be during the
CMake tests.

Here is how I configure and build CMake.  Works fine.

# use precompiled installed CMake to configure cmake
# configure cannot be used for a MinGW build, only Unix
"/cygdrive/c/Program Files/CMake/bin/cmake" \
  -G"Unix Makefiles" \
  -DCMAKE_INSTALL_PREFIX:PATH="`cygpath -m $TOP/cmake_usr_min`" \
  -DCMAKE_C_COMPILER:FILEPATH="`cygpath -m /usr/bin/gcc`" \
  -DCMAKE_CXX_COMPILER:FILEPATH="`cygpath -m /usr/bin/g++`" \
  -DCMAKE_C_FLAGS:STRING="-mno-cygwin -Wall -O2 -g" \
  -DCMAKE_CXX_FLAGS:STRING="-mno-cygwin -Wall -O2 -g" \
  "`cygpath -m $TOP/cmake_src`"
make

If I just do "make test" next I get a lot of console windows
explaining some illegal instruction error.  (Details available.)  This
problem is mostly fixed by these environment settings.

export CC="`cygpath -m /usr/bin/gcc`"
export CXX="`cygpath -m /usr/bin/g++`"
export CFLAGS="-mno-cygwin"
export CXXFLAGS="-mno-cygwin"

With these settings, the tests are using the -mno-cygwin option enough
to at least avoid the illegal instruction errors.  All tests except
these pass:

The following tests FAILED:
        LoadedCommand
        LoadedCommandOneConfig
        complex
        complexOneConfig
        kwsys

What do these tests have in common?

I dug down into the LoadedCommand test a bit.  This snippet should
show how there is an attempt to link a shared lib without the
-mno-cygwin option.  Note how the lib builds when I manually add the
-mno-cygwin option.

0% pwd
/home/200006507/dev/cmake_bld_min/Tests/LoadCommand/CMakeCommands
0% make
Building shared module cmCMAKE_TEST_COMMAND.dll...
cmTestCommand.o(.text+0xb16):cmTestCommand.c: undefined reference to
`__imp___iob'
collect2: ld returned 1 exit status
make[1]: *** [cmCMAKE_TEST_COMMAND.dll] Error 1
make: *** [default_target] Error 2
2% make -n cmCMAKE_TEST_COMMAND.dll
echo "Building shared module cmCMAKE_TEST_COMMAND.dll..."
C:/cygwin/home/200006507/dev/cmake_bld_min/bin/cmake.exe -E remove -f
"`pwd`"/cmCMAKE_TEST_COMMAND.dll
C:/cygwin/bin/gcc.exe    -shared  -o "`pwd`"/cmCMAKE_TEST_COMMAND.dll
cmTestCommand.o   
0% C:/cygwin/bin/gcc.exe -mno-cygwin   -shared  -o
"`pwd`"/cmCMAKE_TEST_COMMAND.dll cmTestCommand.o
0% ls cmCMAKE_TEST_COMMAND.dll
cmCMAKE_TEST_COMMAND.dll
0%

I don't yet know how to fix this and I don't know whether it is worth
fixing.  If anyone has any suggestions I will try them.  I want to at
least post what I have found.

It seems to me that the basic problem is that -mno-cygwin is a special
kind of critical option that essentially specifies which compiler you
are using.  I need a way to tell the tests that they must always use
this option in addition to whatever other options they ordinarily wish
to use for gcc.  Besides the environment variables CC, CXX, CFLAGS and
CXXFLAGS I do not see any other way to pass compiler arguments down to
the CMake tests.  CMAKE_C_COMPILER and CMAKE_CXX_COMPILER cannot have
this option tacked on.  (I forget exactly what happens, but recall
this not working.)  The CMAKE_*_FLAGS options used for building CMake
are not necessarily used by the tests, for good reason - so that is
not an avenue.

Comments or suggestions welcome.

Fred Wheeler