Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CMake or vcpkg support #74

Open
MarkIngramUK opened this issue Jun 13, 2020 · 16 comments
Open

CMake or vcpkg support #74

MarkIngramUK opened this issue Jun 13, 2020 · 16 comments
Assignees
Labels
area-DeveloperTools Issues related to authoring (source and IDL), debugging, HotReload, LiveVisualTree, VS integration feature proposal

Comments

@MarkIngramUK
Copy link

Will there be distribution via vcpkg too? Or at least consideration for cross platform projects that use CMake? Currently there is no easy way to consume nuget packages via CMake for C++ projects:

https://gitlab.kitware.com/cmake/cmake/-/merge_requests/3389#note_580524

https://developercommunity.visualstudio.com/idea/351636/use-packagereference-in-vcxproj.html

@ghost ghost added the needs-triage label Jun 13, 2020
@stevewri stevewri self-assigned this Jun 18, 2020
@stevewri stevewri added area-DeveloperTools Issues related to authoring (source and IDL), debugging, HotReload, LiveVisualTree, VS integration and removed needs-triage labels Jun 18, 2020
@wjk
Copy link

wjk commented Jun 29, 2020

My 2¢: I currently am shifting to CMake for my Windows-only projects, precisely because vcxproj is so old and awkward to use. Requiring NuGet and therefore vcxproj is currently a big annoyance for me vis-a-vis cppwinrt, and I will have to fork the codebase to make it work in a CMake-based build. I would greatly appreciate it if care would be taken to ensure compatibility with non-MSBuild build systems, and possibly non-Visual Studio dev setups. (Yes, VS is the market leader for a good reason, but other IDEs do exist, and I sometimes use them as well.)

Furthermore, I am currently attempting to shift my Windows-based C++ projects so I can crosscompile them from a Mac using clang-cl and mingw-w64. I used to be able to use a VM to develop for Windows natively in Windows, but Apple’s move to ARM has put the kibosh on that approach, and I don't want to have to buy another laptop. (I currently do my Windows development on a desktop PC via RDP, but using only that method means I can't work on my Windows projects on the go.) Therefore, any use of C++/CLI or MSVC-only C++ language extensions makes my day even more hard. Thanks!

@mevey
Copy link
Contributor

mevey commented Aug 17, 2020

Hey @MarkIngramUK and @wjk, we've made this a feature proposal and moved it to our backlog to review later as we will focus on NuGet first.

@mevey
Copy link
Contributor

mevey commented Oct 5, 2020

I don't think I meant to close this. Sorry about that.

@mevey mevey reopened this Oct 5, 2020
@ghost ghost added the needs-triage label Oct 5, 2020
@wjk
Copy link

wjk commented Oct 5, 2020

@mevey The updates to vcxproj and to vcpkg made in the Visual Studio 16.3 previews have actually made use of vcxproj tolerable again, and I am now using them instead of CMake, as vcxproj is far easier to integrate into a C# project than CMake-based builds are. The only thing that’s missing is PackageReference support, which has been requested for a long time. However, I understand the team in dotnet/project-system is working on enabling this. Nevertheless, thank you for taking this under consideration.

@mevey mevey removed the needs-triage label Oct 5, 2020
@Zingam
Copy link

Zingam commented Jan 16, 2021

CMake should mean CMake/Ninja.

Original feedback on closed duped thread

Please consider improving the integration of third party build system. Currently the most interesting combination is CMake/Ninja but that might change in the future, so a future proof approach should be considered.
This is more of a Visual Studio suggestion but I think it is highly relevant as a whole. Currently it is possible to build a CMake based UWP project but it is not possible to debug it.
I would like to be able to build/debug and test all sorts of CMake/Ninja C/C++ projects from Win32, UWP, WSL to Xbox right from Visual Studio without the need to generate .sln, etc.
Visual Studio has excellent CMake support but then CMake/Nuget/C++/MSBuild/vcpkg, etc. don't really work very well together as a whole yet.

As my code is cross-platform Windows/Linux/Apple/Google, etc. I really would like to have a complete, unified build/test and deploy experience based on CMake/Ninja preferably (at least until somebody comes up with a better build system).

@stevenbrix
Copy link

@wjk, what is the process of moving to CMake like? Is it fairly straightforward? I'm no fan of Nuget and .vcxproj for C++, but I'm even a worse fan of the following options:

  1. Abandon Nuget and .vcxproj and make all C++ customers move to vcpkg and CMake w/o a path forward
  2. Try to support both Nuget/.vcxproj and vcpkg/CMake environments for C++ customers.

I haven't personally spent enough time with CMake/vcpkg to really have an opinion on what it's capable of or its downfalls are, so I rely on the opinion of others. The cppwinrt team tried to adopt/support cmake a few years ago and the effort failed, but it's possible times have changed. My understanding is that CMake is just a wrapper over MSBuild, so what are the real benefits?

The updates to vcxproj and to vcpkg made in the Visual Studio 16.3 previews have actually made use of vcxproj tolerable again, and I am now using them instead of CMake, as vcxproj is far easier to integrate into a C# project than CMake-based builds are. The only thing that’s missing is PackageReference support, which has been requested for a long time. However, I understand the team in dotnet/project-system is working on enabling this. Nevertheless, thank you for taking this under consideration.

@wjk this is generally how I feel too. If .vcxproj had VS IDE support for PackageReference, then I think that would be pretty awesome.

@wjk
Copy link

wjk commented Feb 10, 2021

@stevenbrix Moving to CMake is fairly straightforward as the syntax is much cleaner — if, and it's a big if, your project is 100% C++. If your C# project depends on a CMake component, you’ll need something like this to pass files into MSBuild-land. Clunky but workable.

But if your CMake component depends on a C# project to build, abandon all hope — there is no way I know of to integrate a modern C# project into a CMake system. The CMake docs suggest that you write out a Frankenproj file with CMake @something@ placeholders for paths and whatnot, then call configure_file() on it and then add the generated result to your solution using some CMake command I cannot remember. Yuck. However, you cannot simply integrate a C# project as-is, as it would need to have output paths replaced by CMake using configure_file() or CMake would not be able to find the outputs. CMake projects cannot assume anything about what path they are being built in, except that it mirrors the source code structure directory-for-directory.

I suppose if you really wanted, you could use add_external_command() to call MSBuild.exe and pass all the relevant parameters as command-line arguments, and use the OUTPUTS argument to pass the files back into CMake-land. But for .NET apps this quickly becomes untenable, as projects often output dozens of files, each of which must be specified manually in the CMake file.

Really, all we need is for someone in the Visual Studio MSVC team to flip whatever switch is needed to enable PackageReference support in vcxproj, as all of the required components have been implemented; vcxproj just refuses to use them. And there is no sign that they will ever do this. Hope this helps!

@Zingam
Copy link

Zingam commented Feb 10, 2021

CMake just works. It is a build system generator. You want to use MSBuild you generate .sln and byild. You want ninja - it just works. You want make on Linux or Mac - it just works.
And you have everything in a plain text. So far so good.
The language that CMake uses is horrible. It is easy but very annoying to use.
If you just need to work on Windows. CMake might not make much sense to you. For all other cases it is a tool that just works.

@llothar
Copy link

llothar commented Feb 10, 2021

CMake just works.

Only use it on Linux and Android.
Don't use it on MacOS or Windows. Or always be years behind with new features. All the I18N on XCode still don't work after 8 years.

@MarkIngramUK
Copy link
Author

CMake is actually really nice and easy to use, if your project configuration is fairly straight forward. Just add your files to targets, then add dependencies between your targets. Things get complicated if you're mixing languages, or if you need to depend on third party code. And given the "Open CMake Folder" support in Visual Studio, it's really easy to work with now.

@Zingam
Copy link

Zingam commented Feb 11, 2021

Or you could use it with Visual Studio Code on Mac, Linux and Windows as I do. VSCode has a descent although lacking support compared to VS ( why did they had to name it Visual Studio Code)?
Debugging, running GTests in Visual Studio Code with CMake is actually quite good.

@Zingam
Copy link

Zingam commented Mar 3, 2021

Or this could be generalized as: Enable easy support of 3rd party build systems and package managers.
CppWinRT comes as a Nuget and it is impossible to use with Cmake in a sane way. Nuget cant be installed systemwide.
And I cannot get a simple CMake/Ninja automated workflow but I need to generate a VS solution and manually to install the Nuget.

@DrusTheAxe
Copy link
Member

Those interested in CMake (or other build systems) please check out #1891 (reply in thread)

@fredemmott
Copy link

While the MSBuild documentation says "C++ and JavaScript project types are unsupported" this appears to no longer be the case; CMake's VS_PACKAGE_REFERENCES now works fine for C++/WinRT, as long as you have a very recent visual studio and CMake version.

@fredemmott
Copy link

For those wanting older versions or without the dependency on visual studio project generators or nuget: https://github.com/fredemmott/OpenKneeboard/blob/7fd38de1d1d827c100dea460ea3eb9b8032b54b1/third-party/cppwinrt.cmake

@Patschkowski
Copy link

Hi @stevewri , hope you can share an outlook on the expected timing for the implementation of this new feature. Thanks!

@RDMacLachlan RDMacLachlan added this to the Future (backlog) milestone Feb 3, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-DeveloperTools Issues related to authoring (source and IDL), debugging, HotReload, LiveVisualTree, VS integration feature proposal
Projects
None yet
Development

No branches or pull requests