编辑:原来我实际上不需要做任何这些,我认为在构建src / myapp之前需要安装的文件(即src / common和src / libs)事实上,我可以访问,大概来自构建目录。我不知道任何提议的解决方案是否有效,我很抱歉。
我正在努力迁移一个C ++项目,其配置目前是cmake(CMakeLists.txt)和Make(GNUmakefile)的组合,只使用cmake。它目前的设置方式是:
myproject
| CMakeLists.txt (add_subdirectory(src))
| src/
| apps/
| myapp/
| [myapp source files]
| GNUmakefile
| ...
| libs/
| mylib/
| [mylib source files]
| GNUmakefile
| ...
| common/
| CMakeLists.txt (add_subdirectory(dir1, dir2, dir3...))
| ...
| include/
在myapp和mylib之外 更多的应用程序和库,但它们都以类似的方式构建和链接,所以如果我有一个,我可以得到所有。
项目现在的构建方式,有一个基本上有4行的脚本:
cmake path/to/myproject // with the necessary flags and variables passed
make all DESTDIR=$INSTALL_DIR install
cd src/libs ; make all
cd src/apps ; make all
这可行,因为common
没有依赖关系,首先构建和安装(include
也在这里安装),然后是libs
- 这取决于common
- 构建,然后apps
- 这取决于libs
和common
- 构建。
我的问题是,如果我替换GNUmakefile
和libs
中的apps
,我就不知道如何更改我在构建脚本中运行的命令,以便cmake和make交织在一起:
common
common
安装所有 cmake 目标(让我们说这些是libcommon.so和libcommonutils.so)libs
libs
安装所有 cmake 目标(使用common
中的库生成mylib.a
)apps
apps
安装所有 cmake 目标(使用mylib.a
和common
共享库)安装include
也必须在某个时间点发生,因为common
依赖于其中的头文件。
当然,另一种解决方案也可能有效,但是这个(交织cmake和make calls)是我唯一能想到的。
答案 0 :(得分:2)
您可以common
使用libs
,apps
和ExternalProject_add(common
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/common
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/common
# Forward CMAKE_INSTALL_PREFIX to external project.
CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
)
ExternalProject_add(libs
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/libs
# Disable *install* step
INSTALL_COMMAND ""
)
ExternalProject_add(apps
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apps
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/apps
# Disable *install* step
INSTALL_COMMAND ""
)
# Adjust dependencies between components
add_dependecies(libs common)
add_dependecies(apps libs common)
。
<强>的src /的CMakeLists.txt 强>:
cmake -DCMAKE_INSTALL_PREFIX=<install-dir> <source-dir>
make
此脚本的使用(源外构建;也支持源内构建)
mkdir src/common && cd src/common \
&& cmake -DCMAKE_INSTALL_PREFIX=<install-dir> <source-dir>/src/common && make install
mkdir src/libs && cd src/libs && cmake <source-dir>/src/libs && make all
mkdir src/apps && cd src/apps && cmake <source-dir>/src/apps && make all
与以下命令序列相同:
include
std::stable_partition
的处理尚未实施,但您可以采用类似的方式执行此操作。
答案 1 :(得分:0)
上述解决方案。
但我需要添加
include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
激活&#34; ExternalProject_Add
&#34;
add_depende n cies
中存在输入错误