在make all

时间:2015-12-10 00:28:41

标签: cmake makefile

编辑:原来我实际上不需要做任何这些,我认为在构建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 - 这取决于libscommon - 构建。

我的问题是,如果我替换GNUmakefilelibs中的apps,我就不知道如何更改我在构建脚本中运行的命令,以便cmake和make交织在一起:

  1. cmake 配置common
  2. make 编译&从common安装所有 cmake 目标(让我们说这些是libcommon.so和libcommonutils.so)
  3. cmake 配置libs
  4. make 编译&从libs安装所有 cmake 目标(使用common中的库生成mylib.a
  5. cmake 配置apps
  6. make 编译&从apps安装所有 cmake 目标(使用mylib.acommon共享库)
  7. 安装include也必须在某个时间点发生,因为common依赖于其中的头文件。

    当然,另一种解决方案也可能有效,但是这个(交织cmake和make calls)是我唯一能想到的。

2 个答案:

答案 0 :(得分:2)

您可以common使用libsappsExternalProject_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

中存在输入错误