上下文
在Visual中,对于C++解决方案,您可以使用所谓的“过滤器”来模拟源文件树/目录,同时通常在每个项目的根中保留每个项目的所有源代码。主要优点是能够直接进行#include "foo.h"
我一直试图“切换”一些解决方案到CLion,因为它的多平台焦点,并试图将对CMake+GCC的支持已经存在的VS解决方案,因为没有跨平台的IDE对.sln/.vcxproj文件的本机支持。
现在-我知道一些较大的CMake项目(如在解决方案/子项目组中)经常使用普通的文件系统子目录来进一步拆分每个子项目中的代码,但是由于我试图向其中添加CMake支持的一些“解决方案”,考虑到几百个源文件,我不能真正着手重构所有内容,并在每个子项目中手动将#include "service_foo.h"转换为#include service/service_foo.h。
另外要考虑的另一件事是,我不会迁移解决方案来使用CMake --我在CMake工具链/VS IDE支持的同时增加了对MSBuild构建/MSBuild IDE支持的支持,所以我不想引入任何破坏性的更改。
我仍然是JetBrains IDE生态系统的新手,所以我想知道是否有什么可以提供这种功能的现成的,或者也许有一个插件。
问题
有没有任何方法可以在不更改文件系统的情况下将源文件排序成组,即在CLion IDE中的项目视图工具箱中?
到目前为止,在文档中找不到任何东西,但是它与代码层次结构有一些相似之处,但是对于.h/.cpp文件则是一样的。
示例
文件系统级结构(在磁盘上可见)
$REPO_ROOT是*.vcxproj, .idea/等提供的存储库。
Main CMakeList.txt: $REPO_ROOT/CmakeList.txt
Example subprojects: $REPO_ROOT/foo_slib/ $REPO_ROOT/program/
Example Source files: $REPO_ROOT/program/main.cpp $REPO_ROOT/program/gui_init.h $REPO_ROOT/program/VulkanDelegate.h 项目/解决方案的根级结构(如IDE中的项目工具箱视图所示)
$VIEW_ROOT是为CLion打开的主要项目,或者是为MSVS打开的.sln,如每个IDE中的项目视图所示
Main CmakeList.txt: $VIEW_ROOT/CMAKE/CmakeList.txt
Example subprojects: $VIEW_ROOT/foo_slib/ $VIEW_ROOT/program/
Example Source files: $VIEW_ROOT/program/main.cpp $VIEW_ROOT/program/GUI/gui_init.h $VIEW_ROOT/program/Delegates/VulkanDelegate.h发布于 2020-07-16 06:11:17
发布于 2020-07-18 21:07:39
如果其他人需要这个功能,下面是我最后所做的事情
解决方案
假设您的MSVS项目(目标)都存储在./src/ (./ in repo root)的根目录下(基于每个项目的目录)。
./src_cmake/./src/中的./src_cmake/中,假设我们已经生成了与./src/libproj/相对应的./src_cmake/libproj/libproj为例,使./src_cmake/libproj/中的子目录与Visual中该项目的过滤器树结构相对应Solution>libproj>Debugonly>包含debmeta.h debmeta.cpp debutil.h,这将需要在./src_cmake/libproj/Debugonly/上创建3个新的符号链接文件,让我们以denmet.h为例ln -s ORIGINALFILE LINKTARGET创建符号链接,所以在./src_cmake/libproj/Debugonly/打开的shell中使用命令// This will navigate 3 directories down to repo root and from there to debmeta relative path
ln -s ../../../src/libproj/debmeta.h debmeta.h// Shell open at ./src_cmake/libproj/ instead
ln -s ../../src/libproj .link
cd Debugonly
// Now use the .link folder so all links will be routed through it instead
ln -s ../.link/debmeta.h debmeta.h
// From now on use .link folder instead to navigate to original project directory, in case of breaking changes like new name of this subproject (at ./src_cmake/libproj/)
rm .link
ln -s ../../renamedsrc/renamedproj .link
// This way you shouldn't have to worry about cmake tree breakage./src_cmake/树应该看起来像您的Visual项目视图树./CMakeList.txt添加子项目中,您应该对每个项目分别调用add_subdirectory(),这样Clion就可以正确地获取目标,例如add_subdirectory(src_cmake/libproj)
add_subdirectory(src_cmake/exeproj)./src_cmake/中的每个子项目,您应该在某种程度上添加与./src/中的.vcxproj相对应的新CMakeList,例如- ./src_cmake/libproj/CMakeList.txt。target_include_directories()并包含该项目的所有过滤器子目录,如下所示target_include_directories(libproj
PRIVATE Debugonly
)./src_cmake/生成筛选结构和符号链接,而不是按原样传送文件夹,这意味着您不希望跟踪./src_cmake/的任何不对称的CMakeList.txt,并且希望忽略来自污染您的版本控制(VSC)的符号链接,因为这些都会导致代码更改中的重复。
为了防止这在./src_cmake/上创建额外的./src_cmake/,如下所示# Choose which one better fits your needs, but first one should be prefered
# Ignore everything other than CMakeList.txt
*
!*/
!CMakeList.txt
# Or only ignore source code (in case of C/++
*.c
*.cpp
*.h.slnf相同)Edit scopes>Add(+)>Shared>中,只递归地包含这些路径,./src_cmake/ ./CMakeList.txt (当然,您可以包括/排除其他喜欢的.gitignore )XX。想一想回购根目录中的CMakeList ( .sln文件)和项目文件夹中的CmakeList (项目文件夹中的每个.vcxproj ),即不要用项目本地配置来污染根CMakeList
这样使MSVS和CMake保持同步,应该更容易一些。
但是,没有人应该手动完成所有这些操作,这样您就可以制作一个类似这样的简单脚本:
$SRCROOT (MSVS项目目录) so ./src和$OUTROOT (CMake项目目录) so ./src_cmake$SRCROOT的每个子目录,在$OUTROOT处创建目录,名称取自.vcxproj,并在每个主题中创建符号链接,如此$OUTROOT/$VCXPROJNAME/.link->$CD (如果可以计算,最好是相对路径)。.vcxproj使用xml解析器,获取每个<ClInclude>属性并对应它-- <Filter>值--如果在$OUTROOT/$VCXPROJNAME/$FilterVal中不存在,则创建该属性的相对路径<ClInclude>属性,根据提供的值创建符号链接文件,并作为链接目标使用.link的相对路径(如$OUTROOT/$FilterVal/$ClIncludeVal->$(.link)/$ClIncludeVal )$OUTROOT上模拟过滤器结构,从那里您可以递归地迭代它,只使用target_include_directories()和源文件路径为每个子项目/目标生成基本的CMakeList.txt。https://stackoverflow.com/questions/62924011
复制相似问题