[CMake] Path problem using custom compiler and MinGW generator

Dmitri Kourennyi dmitri.kourennyi at qualedyn.com
Wed Nov 23 15:19:03 EST 2011


Hi,

 

I'm working on an embedded project using a Microchip microcontroller. I want to use Cmake to do the configuration so that I can
store the project and build settings under change control, as well as have the configuration compatible with development windows
machines, and an automated build system on a linux server.

 

Microchip provides a modified gcc suite for their compiler, so I figured I could use a cross-platform toolchain file. The compiler
directory is put in the PATH on install, so I just use "pic30-gcc" in said toolchain file. Long story short, using the MinGW MSYS
environment, I can get cmake to configure the project and use the MSYS make utility to build it, which works beautifully.

 

I wanted to then try some other generators so I can for example, make Code::Blocks projects. However, when I went to use the MinGW
generator, I ran into a problem:

 

C:\Users\dmitri.kourennyi\Documents\Development\testing\mingw>cmake -G "MinGW Makefiles" ..

-- The C compiler identification is unknown

-- The CXX compiler identification is GNU

-- Check for working C compiler: C:/Program Files (x86)/Microchip/mplabc30/v3.30c/bin/pic30-gcc.exe

-- Check for working C compiler: C:/Program Files (x86)/Microchip/mplabc30/v3.30c/bin/pic30-gcc.exe -- broken

CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):

  The C compiler "C:/Program Files

  (x86)/Microchip/mplabc30/v3.30c/bin/pic30-gcc.exe" is not able to compile a

  simple test program.

 

  It fails with the following output:

 

   Change Dir: C:/Users/dmitri.kourennyi/Documents/Development/testing/mingw/CMakeFiles/CMakeTmp

 

  Run Build Command:C:/MinGW/bin/mingw32-make.exe "cmTryCompileExec/fast"

 

  C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\cmTryCompileExec.dir\build.make

  CMakeFiles/cmTryCompileExec.dir/build

 

  mingw32-make.exe[1]: Entering directory

  `C:/Users/dmitri.kourennyi/Documents/Development/testing/mingw/CMakeFiles/CMakeTmp'

 

 

  "C:\Program Files (x86)\CMake 2.8\bin\cmake.exe" -E cmake_progress_report

  C:\Users\dmitri.kourennyi\Documents\Development\testing\mingw\CMakeFiles\CMakeTmp\CMakeFiles

  1

 

  Building C object CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.obj

 

  C:\PROGRA~2\MICROC~1\mplabc30\v3.30c\bin\PIC30-~4.EXE -o

  CMakeFiles\cmTryCompileExec.dir\testCCompiler.c.obj -c

  C:\Users\dmitri.kourennyi\Documents\Development\testing\mingw\CMakeFiles\CMakeTmp\testCCompiler.c

 

  mingw32-make.exe[1]: ***

  [CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.obj] Error 255

 

  mingw32-make.exe[1]: Leaving directory

  `C:/Users/dmitri.kourennyi/Documents/Development/testing/mingw/CMakeFiles/CMakeTmp'

 

  mingw32-make.exe: *** [cmTryCompileExec/fast] Error 2

 

  CMake will not be able to correctly generate this project.

Call Stack (most recent call first):

  CMakeLists.txt:5 (PROJECT)

 

-- Configuring incomplete, errors occurred!

 

After troubleshooting it for a while, including using the --debug-trycompile option, I was able to determine that the following
command is the problem:

C:\PROGRA~2\MICROC~1\mplabc30\v3.30c\bin\PIC30-~4.EXE

Pasting this line into the command prompt does nothing, even though it should say that no input file was specified.

In order to confirm this, I edited the CMakeCache.txt file and set CMAKE_C_COMPILER_WORKS:INTERNAL to TRUE, then replaced all
instances of C:\PROGRA~2\MICROC~1\mplabc30\v3.30c\bin\PIC30-~4.EXE with "C:/Program Files
(x86)/Microchip/mplabc30/v3.30c/bin/pic30-gcc.exe" (quotes included). With this configuration the make procedure works fine.

 

I tried using CMAKE_FORCE_C_COMPILER, which does bypass the compiler check, but the make still fails because the 8.3 path is still
used in the Makefiles.

 

To summarize, for whatever reason the compiler refuses to run when invoked using the 8.3 naming conventions. I can work around it by
bypassing the compiler check and reconverting the 8.3 path to the fully qualified path manually. Is there any way I can avoid this
problem so the cmake generation procedure stays automatic and easy? Or is this a bug in the compiler/MinGW, or other issue
altogether?

 

Thanks,

-Dmitri

 

Toolchain file (C30.cmake):

# this one is important

SET(CMAKE_SYSTEM_NAME Generic)

#this one not so much

SET(CMAKE_SYSTEM_VERSION 1)

 

# specify the cross compiler

SET(CMAKE_C_COMPILER   pic30-gcc)

 

# where is the target environment 

SET(CMAKE_FIND_ROOT_PATH  "C:/Program Files (x86)/Microchip/mplabc30/v3.30c")

 

# search for programs in the build host directories

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# for libraries and headers in the target directories

SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

 

Project file (CMakeLists.txt):

SET(CMAKE_TOOLCHAIN_FILE C30.cmake)

 

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

 

PROJECT(MicrochipCMakeTest)

 

SET(CMAKE_C_FLAGS "-Wall -Os")

SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--report-mem")

 

##### Create cof binary

ADD_EXECUTABLE(hikari01.cof main.c)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20111123/0f28d0e5/attachment-0001.htm>


More information about the CMake mailing list