在makeall之前在子目录上调用makeinstall 我正在研究一个C++项目的迁移,它的配置目前是CMASE(CMAKELIST.TXT)和MnGuMaMeX的组合,只使用CGUE。当前的设置方式是: 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之外还有更多的应用程序和lib,但它们都以类似的方式构建和链接,所以如果我有一个,我可以得到所有 按照项目目前的构建方式,有一个脚本基本上有4行:在makeall之前在子目录上调用makeinstall 我正在研究一个C++项目的迁移,它的配置目前是CMASE(CMAKELIST.TXT)和MnGuMaMeX的组合,只使用CGUE。当前的设置方式是: 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/,cmake,makefile,Cmake,Makefile,myapp和mylib之外还有更多的应用程序和lib,但它们都以类似的方式构建和链接,所以如果我有一个,我可以得到所有 按照项目目前的构建方式,有一个脚本基本上有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 这是因为
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
——构建
我的问题是,如果我替换libs
和apps
中的GNUmakefile
s,我不知道如何更改我在构建脚本中运行的命令,使cmake和make像这样交织在一起:
common
common
中的所有cmake目标(假设它们是libcommon.so和libcommonutils.so)libs
libs
中的所有cmake目标(它使用common
中的库生成mylib.a
)apps
apps
编译并安装所有cmake目标(使用mylib.a
和common
共享库)include
也必须在早期的某个时候进行,因为common
取决于其中的头文件
当然,另一种解决方案也可能有效,但这是我唯一能想到的解决方案。您可以将其用于常见的、libs
和应用程序
src/CMakeLists.txt:
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_dependencies(libs common)
add_dependencies(apps libs common)
使用此脚本(源代码外版本;也支持源代码内版本)
cmake-DCMAKE\u安装\u前缀=
制作
与以下命令序列相等:
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
mkdir src/common&&cd src/common\
&&cmake-DCMAKE\u INSTALL\u PREFIX=/src/common&&make INSTALL
mkdir src/libs&&cd src/libs&&cmake/src/libs&&make all
mkdir src/apps&&cd src/apps&&cmake/src/apps&&make all
未执行包含的处理,但您可以用类似的方式执行。这与相关标记无关,或者,除非您能证明它们是相关标记,否则请删除它们,您将更快地获得更好的帮助。我不会删除它们,因为我可能丢失了一些东西。GNUMakefiles
是否太广泛了?您是否尝试将它们的功能转换为CMakeLists.txt
?是否可以发布1。使用apps
目录下的GNUMakefile
生成了多少个“apps”。2.他们的代码是如何组织的。3.libs的情况也一样。为什么有人会否决这个问题?没有充分的理由。libs
的配置实际上是否取决于正在配置/构建/安装的common
?如果没有,只需使用common
,并使libs
中的所有目标依赖于该外部目标。这有效地保证了common
将在构建libs
之前安装。
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