cmake: How to set visual studio intermediate directory?

I googled this question, these’s no easy way. Cmake does not provide any variable or property to modify visual studio intermediate dierectory. So I modified cmake source code to implement the feature.I’m using VS2005, and I test the modification under VS2005. It just work.

NOTE: New property VS_INTERMEDIATE_DIRECTORY_(CONFIG) can be used to change VS intermediate directory. VS_INTERMEDIATE_DIRECTORY global variable is not supported.

  • Download source code

    Download the source code cmake-3.2.1, unzip to a folder.

  • Modify source code
    • file:: cmLocalVisualStudio7Generator.cxx
    • function:: void cmLocalVisualStudio7Generator::WriteConfiguration
    • modification::

      // The intermediate directory name consists of a directory for the
      // target and a subdirectory for the configuration name.
      std::string intermediateDir = this->GetTargetDirectory(target);
      
      #if 1 //modify for change intermediate directory
      std::string vsIntDirProp = std::string("VS_INTERMEDIATE_DIRECTORY_") + cmSystemTools::UpperCase(configName);
      const char* vsIntermediateDir = target.GetProperty(vsIntDirProp.c_str());
      if (vsIntermediateDir)
        {
          intermediateDir = vsIntermediateDir;
          std::string tgtDir = target.GetName();
          if(!tgtDir.empty())
            {
              intermediateDir += "/";
              intermediateDir += tgtDir;
            }
        }
       else
         {
           intermediateDir += "/";
           intermediateDir += configName;
         }
      #else
      intermediateDir += "/";
      intermediateDir += configName;
      #endif
      
  • Build source code

    Follow the cmake build guidline. Use your favorate compiler to build cmake binary. Of course, there must be a installed cmake version on your PC.

    cd E:\code\cmake-3.2.1
    mkdir vs8
    cd vs8
    cmake -G "Visual Studio 8 2005" ..
    

    Open Cmake.sln with vs2005 and build cmake project. Download my build work: cmake.exe (vc8-win32) Replace the installed version.

  • Use new property: VS_INTERMEDIATE_DIRECTORY_(CONFIG)

    foreach (config ${CMAKE_CONFIGURATION_TYPES})
        string (TOUPPER ${config} config)
        set_target_properties(${_project} PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY_${config} ${bin_path}
            ARCHIVE_OUTPUT_DIRECTORY_${config} ${lib_path}
            LIBRARY_OUTPUT_DIRECTORY_${config} ${lib_path}
            PDB_OUTPUT_DIRECTORY_${config} ${sym_path}
            VS_INTERMEDIATE_DIRECTORY_${config} ${tmp_path}
        )
    endforeach ()
    
  • References