一次生成一个具有不同配置的c/c++项目

e0bqpujr  于 2023-01-04  发布在  C/C++
关注(0)|答案(1)|浏览(194)

英语不是我的母语,抱歉语言错误:-)
我有一个用C++编写的项目,包含了很多宏来控制功能,每个选项都可以单独启用或禁用。它们共享同一个内核(内核也包含了一些宏来启用或禁用某些功能,所以ccache工作得不是很好)。
可以通过以下脚本进行编译:

cd build
cmake .. ${some options...}
make

它运行得很好,但是我必须用不同的cmake选项来运行它,设置不同的宏,而且大多数代码都要编译很多次。这是浪费资源和时间!
所以,我需要一个这样的工具:

cd build
build-make-file .. --futures="future1,future2,...,futureN"
make

在此脚本之后,所有代码都将编译为二进制文件。
为此,我认为缓存应该更复杂一点。它可以缓存AST或机器代码等。换句话说,该高速缓存管理器应该将代码分成更多的部分。
有没有什么工具可以做到这一点呢?

0wi1tuuw

0wi1tuuw1#

因为这个问题没有一个最小的可重复的样本,我将只提供给你一个非常一般的答案。
据我所知,该项目是使用CMake作为它的构建工具。此外,这些选项是实际变量,对于一个特定的构建,你需要正确设置让我们说N变量,即。
cmake -S. -Bbuild -DVar1=ON -DVar2=OFF -DVar3=ON etc....
你想要的是
cmake -S. -Bbuild -DFeature1=TRUE
如果是这样的话,就完全没有必要再引入另一个脚本了,那只会给整个项目带来更多的复杂性。
相反,您需要配置rootCMakeLists.txt,以便已经为您配置了这些变量,例如:

#This is the simplest way on how to do this
if(Feature1) 
  SET(VAR1 ON)
  SET(VAR2 OFF)
  SET(VAR3 ON)
  #etc..
endif()

我已经见过太多次了,当对CMake进行简单的调整就足够了,人们会添加不必要的.bat.ps.sh文件。
编辑:如果您希望节省编译时间,那么您必须完全重构您的项目,使其更加模块化,即将其分离到各自的库中,然后无需编译即可重用,或者您需要重写CMakeLists.txt以链接到各个.obj文件-这真的很不容易,一个简单的方法来做这件事,这更像是一个设计问题。作为一个侧记,大多数时候CMake已经为你做了这些。所以如果它s正在完全重新编译您要么有一个非常糟糕的CMakeLists.txt文件,要么那些.obj文件确实需要更改。

相关问题