[CMake] Problem when using variable_watch with Visual Studio generator in 3.4.1

Yves Frederix yves.frederix+cmake at gmail.com
Thu Dec 10 06:37:10 EST 2015


Hi all,

I am experiencing problems during the CMake configure step when using
the function variable_watch. Consider the following minimal CMakeLists
file:

  cmake_minimum_required(VERSION 3.4)
  project(test CXX)

  function(myhook _variable _access _value _current_list_file _stack)
    if("${_value}" STREQUAL "")
      # Do nothing
    endif()
  endfunction()

  variable_watch(CMAKE_CURRENT_LIST_DIR myhook)
  find_package(PythonInterp REQUIRED)


When configuring on Windows using CMake 3.4.1 with the Visual Studio
generator (I tried both VS2012 and VS2015), the process fails with an
error message (notice the strange symbols at the beginning of the line
mentioning FindPackageMessage.cmake):

  -- Detecting CXX compile features - done
CMake Error at C:/Tools/CMake_3.4.1/share/cmake-3.4/Modules/FindPackageHandleStandardArgs.cmake:142
(include):
  include could not find load file:

    L☺/Tools/CMake_3.4.1/share/cmake-3.4/Modules/FindPackageMessage.cmake
Call Stack (most recent call first):
  C:/Tools/CMake_3.4.1/share/cmake-3.4/Modules/FindPythonInterp.cmake:161
(include)
  CMakeLists.txt:12 (find_package)


  CMake Error at
C:/Tools/CMake_3.4.1/share/cmake-3.4/Modules/FindPackageHandleStandardArgs.cmake:379
(FIND_PACKAGE_MESSAGE):
  Unknown CMake command "FIND_PACKAGE_MESSAGE".
  Call Stack (most recent call first):
    C:/Tools/CMake_3.4.1/share/cmake-3.4/Modules/FindPythonInterp.cmake:162
(FIND_PACKAGE_HANDLE_STANDARD_ARGS)
    CMakeLists.txt:12 (find_package)


I did some more testing, and the configuration step is successful when:
- using CMake 2.8.12 or 3.4.0
- using 3.4.1 (or older versions) on osx (I did not try linux)
- removing the 'CXX' in the project call or removing the project call entirely
- removing the check for _value inside the function

It seems that for some reason adding the watch (which actually only
does read-only access), the contents of the CMAKE_CURRENT_LIST_DIR
variable is messed up somehow. Could I have run into some corner case
behavior here?

Maybe it is also useful to mention how I ended up in this situation.
My requirement was to run some custom code as the very last step of
the configure process. The solution I found was based on using
variable_watch (see
http://stackoverflow.com/questions/15760580/execute-command-or-macro-in-cmake-as-last-step-before-configure-step-finishes#15824843),
but apparently this is not a very robust solution. Are there possibly
better ways of accomplishing the same thing?

Thanks!

Regards,
Yves


More information about the CMake mailing list