我即将开始使用C ++编写的跨平台库。接下来,我打算为其他语言实现绑定,例如Python,Java等。这些库需要在主要平台上可用:win32,Linux和Mac OSX。
虽然该应用程序实际上是一个库,但是一些基本的控制台程序将与它捆绑在一起进行演示和测试。
在开始在Subversion中存储内容之前,我想提出一个最佳的文件夹结构。
我想的是:
/project //Top level folder
/bin //Binaries ready for deployment
/linux_amd64 //Linux AMD64 platform
/debug //Debug build - duplicated in all platforms
/release //Release build - duplicated in all platforms
/linux_i386 //Linux 32-bit platform
/macosx //Mac OS X
/win32 //Windows 32-bit platform
/cygwin //Windows 32-bit platform compiled with Cygwin
/vs.net //Windows 32-bit platform compiled with Visual Studio .NET
/win64 //Windows 64-bit platform
/build //Make and build files, IDE project files
/linux_amd64 //Linux AMD64 platform
/linux_i386 //Linux 32-bit platform
/macosx //Mac OS X
/win32 //Windows 32-bit platform
/win64 //Windows 64-bit platform
/config //Configuration files that accompany the binaries
/data //Data files that accompany the binaries
/doc //Documentation
/lib //External or third-party libraries
/platforms //Platform-specific code for ...
/linux_amd64 //Linux AMD64 platform
/linux_i386 //Linux 32-bit platform
/macosx //Mac OS X
/win32 //Windows 32-bit platform
/win64 //Windows 64-bit platform
/src //Available library source code in subfolders
/src //Source code tree - this will contain main.cpp
/bindings //Bindings to other languages such as ...
/python
/java
/h //Header files
/modules //Platform-independent modules, components or subprojects
/platforms //Platform-specific code for ...
/linux_amd64 //Linux AMD64 platform-specific code
/linux_i386 //Linux 32-bit platform-specific code
/macosx
/win32 //Windows 32-bit platform-specific code
/win64 //Windows 64-bit platform
/test //Automated test scripts
如果你有建议,我很乐意听到。我想知道是否有一种工具可以帮助创建这种结构。
我打算使用CMake和Subversion。
答案 0 :(得分:10)
结构对我来说很好,但有几点:
至于创建结构的工具,只需几分钟就可以编写一个bash脚本 - 所有平台都可以使用相同的工具(如bash)。
答案 1 :(得分:7)
为什么二进制文件需要不同的平台文件夹?您将在不同的平台下使用相同的文件系统构建此源代码吗?
如果是,我认为你也需要特定于编辑器的文件夹。
为什么不使用不同的文件夹进行调试和发布构建,可能是unicode和非unicode,单线程或多线程构建?
看看bjam或Scons做替换者。也许你不需要构建目录中的不同文件夹。
我认为如果“modules”目录中的所有模块都包含测试用户的“tests”目录会更好。
最后 - 看看boost库,这个platofrm独立库有很好的结构。
还尝试从其他平台独立项目中获取想法。
提升文件夹结构:
boost - root dir
- boost - library header lib ( for users )
- libs - library source dir ( one dir per lib )
- build - library build files ( if they are needed )
- doc - documentation files
- example - sample programs
- src - library source files
- test - programs and srcipts for testing module
- bin - created by bjam build system
- libs
- <lib-name>
for all compiled folders from libs [example|test|build]
- <compiler-name>/<[static|dynamic]-link>/<[debug|release]>/<[threading mode]>
contain builded [obj|dll|lib|pdb|so|o|etc] files see detailed information in bjam build system
- doc
- tools
如果您选择bjam - 您将不会担心构建和bin文件夹结构。
此外,您的libs / src / dir可以包含所有平台文件的自己,并且可以包含平台特定文件的dirs。
我没有在你的文件夹结构中看到任何严重的问题,也许你会在开始编写项目原型时看到它们。
答案 2 :(得分:2)
我最近在一个目录中发布了question about packaging headers,决定使用少量包含目录。
你打算迎合Win64吗?这将是一个越来越重要的目标。
不将构建中间文件放在被检入svn的树下的任何位置。如果你这样做,根据你的svn客户端工具,它们会产生很多噪音,因为文件不在存储库中。这使你很难看到你添加的文件应该在存储库中。
相反,如果您的编译器允许,请将中间目录放在一边。
否则,请确保将整个中间目录添加到svn排除属性中。有些GUI比其他GUI更容易(Windows上的Tortoise,Cornerstone或OS / X上的版本)。
答案 3 :(得分:0)
我可能建议不使用该架构对构建文件进行分类吗?
我试图应用您建议的文件夹结构,但我找不到放置常见Linux Makefile定义和Visual Studio属性文件的正确位置。如下所示:
/project
/build
/linux
/macosx
/win32 (or win)
示例案例包括:
/project
/build
/linux
Make.defs
Makefile [i386, amd64]
/win32
/VC8
/<project>
<project>.vcproj
<solution>.sln [Win32, x64]
/VC11
/<project>
<project>.vcxproj
<solution>.sln [Win32, x64, ARM]
如果您不想通过配置定义体系结构构建,那么平台类型下的另一个文件夹层呢?
/project
/build
/linux
/linux_amd64
/linux_i386
/macosx
/?
/win32 (or win)
/win32
/win64
如果给定项目没有平台的任何公共构建文件,原始结构就足够了。