Set solution folder property in CMake for third party library

My project depends on a large third party library (OpenMVG). It is currently not installed. Official building instructions recommend using it with add_subdirectory


Therefore my CMakeLists.txt

contains the following lines

add_subdirectory(${OpenMVG_DIR}/src "${CMAKE_BINARY_DIR}/openMVG")
add_executable(f_matching f_matching.cpp)
target_link_libraries(f_matching ${OpenMVG_LIBS})


My platform is Visual Studio and the generated solution contains 72 projects at the top level. I would like to use the FOLDER

CMake property to organize it in hierarchical levels. For example, I would like to move all OpenMVG projects to a separate VS solutions folder.

However, as the CMake documentation says, this property can only be assigned to targets, not directories. Mine CMakeLists.txt




but this line does nothing, solution folders are not shown. I tried to change a couple of OpenMVG CMakeLists by setting a property FOLDER

on the target, it worked.

Is there a workaround for this situation without changing the CMakeLists from OpenMVG? For the time being, I would like to spend my time on other tasks and postpone this simple edit for the future.


source to share

1 answer

There is one "hack" to achieve your goal. The original version of 'add_library' is prefixed with an underscore, so you can re-implement the top-level function 'add_library' like this:


# you need it to properly set variable from function() call
set(target_list "" CACHE INTERNAL "target_list")
function(add_library name)
    message("Adding library ${name}")
    set(target_list ${target_list} ${name} CACHE INTERNAL "target_list")
    _add_library(${name} ${ARGN})

# Your add_subdirectory() goes here

set_target_properties(${target_list} PROPERTIES FOLDER "OpenMVG")


Of course, it is not documented and not official as I know, but it works, at least now with CMake



All Articles