Cross-platform paths in CMake

2019-06-27 18:57发布

问题:

I have a project I can build on both Linux and Windows using CMake. The only issue is that Unix-style paths, in CMakeLists.txt, can't work on Windows (which uses backslashes instead of slashes, also requiring the drive letter).

Is there any way I can write a cross-platform CMakeLists.txt?

回答1:

You question affects different details:

  1. Just don't use backslashes. Windows will also process slashes.
  2. Don't use drive letters. Use relative paths everywhere.
  3. GET_FILENAME_COMPONENT(X "${CMAKE_CURRENT_SOURCE_DIR}" REALPATH) can solve the whole path without writing any absolute paths.
  4. Add the tool binary paths into your PATH environment variable. So you do not need to search them by yourself (with absolute paths) or
  5. Use FIND_PROGRAM() to get the tools absolute path without guessing around. You could add hints in which registry entries and paths cmake will search for the tool or
  6. Consider to write your own module for every tool. You can copy the skeleton from any module of the modules folder (have a lock at FindJava.cmake; a very good and portable example on how to search a program).
  7. If all those does not help, you can detect the platform by IF(WIN32) or IF(UNIX).

Hope, this helps...