Hi!

I'm using CMake to cross-compile C/C++ code for VxWorks targets. I have a 
platform file for VxWorks and toolchain files for the target boards.
The setup works fine with CMake 3.5 and older but it didn't work with 3.6 or 
newer. I was getting errors like

CMake Error at C:/Program 
Files/CMake/share/cmake-3.10/Modules/CMakeDetermineCompilerId.cmake:569 
(string):
  string begin index: 1 is out of range 0 - 0
Call Stack (most recent call first):
  C:/Program 
Files/CMake/share/cmake-3.10/Modules/CMakeDetermineCompilerId.cmake:37 
(CMAKE_DETERMINE_COMPILER_ID_CHECK)
  C:/Program 
Files/CMake/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake:112 
(CMAKE_DETERMINE_COMPILER_ID)
  CMakeLists.txt:33 (project)

Now I wanted to upgrade to a newer version so I spent some time debugging the 
problem ...

My toolchain file defines:
 
set( CMAKE_SYSTEM_NAME VxWorks )
set( CMAKE_SYSTEM_VERSION 6.9 )
set( CMAKE_SYSTEM_PROCESSOR arm )

which should be sufficient to tell CMake that the target platform is not 
Windows (where the CMake is run).
But the place in CMakeDetermineCompilerId.cmake where the error occurs looks 
like:

    # Detect the exact architecture from the PE header.
    if(WIN32)
      # The offset to the PE signature is stored at 0x3c.
      file(READ ${file} peoffsethex LIMIT 1 OFFSET 60 HEX)
      string(SUBSTRING "${peoffsethex}" 0 1 peoffsethex1)
      string(SUBSTRING "${peoffsethex}" 1 1 peoffsethex2)   <- this is where 
the error above occurs
     
      ...
    endif()

If I add a debug print of WIN32 before the project() command and run the CMake 
command line for my build with the --debug-output argument, I can see that:
1. the WIN32 is set to true before the project() command
2. the WIN32 is still set to true when it is tested in the 
CMakeDetermineCompilerId.cmake causing the error
3. and later finally unset in CMakeSystemSpecificInformation.cmake (line 17) 
but it is too late.

The reason why it worked in 3.5 and earlier is not in the 
CMakeDetermineCompilerId.cmake but in (more tolerant) checking of  
string(SUBSTRING ...) range arguments.

I was able to work around that problem explicitly resetting the WIN32 variable 
in my toolchain file.

But I think it is a bug in CMake and the WIN32 variable should be unset when 
the CMAKE_SYSTEM_NAME is redefined for cross compilation.

Regards.

Mira

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake

Reply via email to