I'm trying to use Visual Studio as an editor for browsing a large open source project on GitHub. The directory structure looks like
/module1/include/
/module1/src/
/module2/include/
/module2/src/
...
and build is maintained by CMakeLists.txt.
If I insist to use Visual Studio as an editor for some reason (for example, good IntelliSense support), what would be the best practice?
I tried "New - Project from Existing Code". It produces ugly project structure where all *.cpp files are under Source Files filter while I still need to manually specify a bunch of /*/include/ directories.
I tried to actually use CMake to produce a visual studio solution. It immediately failed with many critical errors because of a lot of Linux dependencies.
Is there any way to create a visual studio solution with a proper directory structure and include paths?
I see four possible approaches:
Using a commercial product like Visual GDB or WinGDB you could e.g. import remote Linux projects to Visual Studio.
You create a new empty C++ project at the root of your sources and use the trick described in Importing an existing source file in Visual Studio 2012 (but this seems to require a newer version of Visual Studio > 2012).
With "Show All Files" and "Include in Project" I was able to get all sources/headers with their directory structure (tested with Visual Studio 2013/2015).
You could mock all functions beside the most basic ones (like add_library()
or message()
) and try to get the original CMake
project to generate a Visual Studio solution. E.g. you make your own VSToolchain.cmake
or PreLoad.cmake
with empty implementations:
macro(add_custom_command)
endmacro()
macro(add_custom_target)
endmacro()
macro(set_property)
endmacro()
...
I admit this approach has it's limits.
You're writing a special main CMakeLists.txt
to collect all sources/headers into a new solution like:
cmake_minimum_required(VERSION 2.8)
project(MyProject C CXX)
set(_src_root_path "${CMAKE_CURRENT_SOURCE_DIR}")
file(
GLOB_RECURSE _source_list
LIST_DIRECTORIES false
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${_src_root_path}/*.c*"
"${_src_root_path}/*.h*"
)
add_library(MySources ${_source_list})
foreach(_source IN ITEMS ${_source_list})
get_filename_component(_source_path "${_source}" PATH)
string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
source_group("${_source_path_msvc}" FILES "${_source}")
endforeach()
Just put it somewhere (in my example the root of the sources; but you could just change _src_root_path
) and generate a Visual Studio project containing your sources/headers structured by directories (see How to set Visual Studio Filters for nested sub directory using cmake).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With