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")
include_directories(${OpenMVG_INCLUDES})
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

contains

set_property(DIRECTORY ${OpenMVG_DIR}/src PROPERTY FOLDER OpenMVG)

      

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.

+3


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:

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

# 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})
endfunction()

# 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 2.8.12.2.

0


source







All Articles