[CMake] include_extenal_msproject() dependency behavior change between 3.13.4 and 3.14.0-rc2 (possible bug in rc2)

nick at appletonaudio.com nick at appletonaudio.com
Mon Feb 25 21:56:35 EST 2019


Hello,

We have a fairly large CMake project which uses 
include_extenal_msproject() when we are producing Visual Studio 
solutions to bring in projects produced using another build metadata 
generator. We've noticed most of our Visual Studio builds have started 
failing after switching to CMake 3.14.0-rc2 (not sure where betweenn 
3.13.4 and 3.14.0-rc2 this issue was introduced).

An example of how the behavior differs can be realised with the 
following example:

dependencies/CMakeLists.txt:

# several duplications of the following block exist replacing fooN with 
foo1, foo2, foo3, etc.
add_library(fooN_cmake STATIC IMPORTED GLOBAL)
if(MSVC)
   include_external_msproject(fooN_cmake_extern "fooN.vcproj")
else()
   # other external things happen here using ExternalProject_add to end 
up creating fooN_cmake_extern for non-VS/non-Windows builds.
endif()
add_dependencies(fooN_cmake fooN_cmake_extern)
set_property(TARGET fooN_cmake PROPERTY INTERFACE_INCLUDE_DIRECTORIES 
"path to foo include files")
set_property(TARGET fooN_cmake PROPERTY IMPORTED_LOCATION_DEBUG "path to 
foo static library")
# ... more properties possibly set

frontend1/CMakeLists.txt:

add_subdirectory(../dependencies "${CMAKE_CURRENT_BINARY_DIR}/ext_deps" 
EXCLUDE_FROM_ALL)
add_executable(frontend1 main.c)
target_link_libraries(frontend1 foo1_cmake foo2_cmake)

frontend2/CMakeLists.txt:

add_subdirectory(../dependencies "${CMAKE_CURRENT_BINARY_DIR}/ext_deps" 
EXCLUDE_FROM_ALL)
add_executable(frontend2 main.c)
target_link_libraries(frontend2 foo3_cmake foo2_cmake)

The old behavior: we could invoke CMake using a source directory of 
frontend1 or frontend2 to get Visual Studio solutions. Only the Visual 
Studio projects which are imported using include_extenal_msproject() 
that are dependencies of that particular frontend are included in the 
solution i.e. the VS solution for frontend1 will not include foo3_cmake 
as part of the build at all. I expect this due to the use of 
EXCLUDE_FROM_ALL.

The new behavior: all frontends will include every single project 
defined using include_extenal_msproject that CMake encounters. They will 
all attempt to be built regardless of if there is a dependency. I would 
only have expected this behavior if EXCLUDE_FROM_ALL was *not* set when 
using add_subdirectory().

Could someone help me to understand if the behavior change is expected 
or if this is just a bug?

Thanks!

Nick Appleton


More information about the CMake mailing list