Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
寻找一个';cmake clean';清除CMake输出的命令_Cmake - Fatal编程技术网

寻找一个';cmake clean';清除CMake输出的命令

寻找一个';cmake clean';清除CMake输出的命令,cmake,Cmake,正如makeclean删除makefile生成的所有文件一样,我也希望对CMake执行同样的操作。我经常发现自己手动浏览目录删除文件,如cmake_install.cmake和CMakeCache.txt,以及CMakeFiles文件夹 是否有类似于cmake clean的命令自动删除所有这些文件?理想情况下,这应该遵循当前目录的CMakeLists.txt文件中定义的递归结构。cmake3.X CMake 3.X提供了一个“干净”的目标 cmake --build C:/foo/build/

正如
makeclean
删除makefile生成的所有文件一样,我也希望对CMake执行同样的操作。我经常发现自己手动浏览目录删除文件,如
cmake_install.cmake
CMakeCache.txt
,以及
CMakeFiles
文件夹

是否有类似于
cmake clean
的命令自动删除所有这些文件?理想情况下,这应该遵循当前目录的
CMakeLists.txt
文件中定义的递归结构。

cmake3.X CMake 3.X提供了一个“干净”的目标

cmake --build C:/foo/build/ --target clean
从3.0.2版的CMake文档:

--clean-first  = Build target 'clean' first, then build.
                 (To clean only, use --target 'clean'.)
CMake 2.X cmake 2.X版中没有
cmake clean

我通常在单个文件夹中构建项目,如“build”。因此,如果我想
makeclean
,我可以
rm-rfbuild


与根目录“CMakeLists.txt”位于同一目录中的“build”文件夹通常是一个不错的选择。要构建项目,只需将CMakeLists.txt的位置作为参数提供给cmake即可。例如:
cd/build&&cmake..
。(来自@comicsanss)

我在谷歌上搜索了大约半个小时,唯一有用的方法是调用
查找
实用程序:

# Find and then delete all files under current directory (.) that:
#  1. contains "cmake" (case-&insensitive) in its path (wholename)
#  2. name is not CMakeLists.txt
find . -iwholename '*cmake*' -not -name CMakeLists.txt -delete
另外,在调用之前,请确保调用
makeclean
(或您正在使用的任何CMake生成器)


:)

我同意源代码外构建是最好的答案。但是,在您必须进行源代码内构建的时候,我编写了一个可用的Python脚本,它:

  • 运行“使干净”
  • 删除顶级目录(如CMakeCache.txt)中特定的CMake生成的文件
  • 对于包含CMakeFiles目录的每个子目录,它将删除CMakeFiles、Makefile、cmake_install.cmake
  • 删除所有空的子目录

  • 您可以使用以下内容:

    add_custom_target(clean-cmake-files
       COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
    )
    
    // clean-all.cmake
    set(cmake_generated ${CMAKE_BINARY_DIR}/CMakeCache.txt
                        ${CMAKE_BINARY_DIR}/cmake_install.cmake
                        ${CMAKE_BINARY_DIR}/Makefile
                        ${CMAKE_BINARY_DIR}/CMakeFiles
    )
    
    foreach(file ${cmake_generated})
    
      if (EXISTS ${file})
         file(REMOVE_RECURSE ${file})
      endif()
    
    endforeach(file)
    
    我通常创建一个“makeclean all”命令,在前面的示例中添加对“makeclean”的调用:

    add_custom_target(clean-all
       COMMAND ${CMAKE_BUILD_TOOL} clean
       COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
    )
    
    不要尝试添加“干净”目标作为依赖项:

    add_custom_target(clean-all
       COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
       DEPENDS clean
    )
    
    因为“干净”在CMake中不是一个真正的目标,这是行不通的

    此外,您不应使用此“干净的cmake文件”作为任何内容的依赖:

    add_custom_target(clean-all
       COMMAND ${CMAKE_BUILD_TOOL} clean
       DEPENDS clean-cmake-files
    )
    
    因为,如果您这样做,所有CMake文件将在“全部清除”完成之前被擦除,make将在搜索“CMakeFiles/clean all.dir/build.make”时抛出一个错误。因此,在任何上下文中,都不能在“任何内容”之前使用clean all命令:

    add_custom_target(clean-all
       COMMAND ${CMAKE_BUILD_TOOL} clean
       COMMAND ${CMAKE_COMMAND} -P clean-all.cmake
    )
    
    那也不行。

    如果你跑

    cmake .
    
    它将重新生成CMake文件。例如,如果将新文件添加到由*.cc选择的源文件夹中,则这是必需的

    虽然这本身不是“清理”,但它通过重新生成缓存来“清理”CMake文件。

    我成功地解决了以下问题:

    我有在多台主机上构建的源代码(在Raspberry Pi Linux板上,在VMware Linux虚拟机上,等等)

    我有一个Bash脚本,它根据机器的主机名创建临时目录,如下所示:

    # Get hostname to use as part of directory names
    HOST_NAME=`uname -n`
    
    # Create a temporary directory for cmake files so they don't
    # end up all mixed up with the source.
    
    TMP_DIR="cmake.tmp.$HOSTNAME"
    
    if [ ! -e $TMP_DIR ] ; then
      echo "Creating directory for cmake tmp files : $TMP_DIR"
      mkdir $TMP_DIR
    else
      echo "Reusing cmake tmp dir : $TMP_DIR"
    fi
    
    # Create makefiles with CMake
    #
    # Note: switch to the temporary dir and build parent 
    #       which is a way of making cmake tmp files stay
    #       out of the way.
    #
    # Note 2: to clean up cmake files, it is OK to
    #        "rm -rf" the temporary directories
    
    echo
    echo Creating Makefiles with cmake ...
    
    cd $TMP_DIR
    
    cmake ..
    
    # Run makefile (in temporary directory)
    
    echo
    echo Starting build ...
    
    make
    

    只需发布
    rm cmakcache.txt
    对我来说也很有效。

    在Git无处不在的今天,你可能会忘记CMake,而使用
    Git clean-d-f-x
    ,这将删除所有不受源代码管理的文件。

    声明:

    一些使用GNU自动工具创建的构建树有一个“make distclean” 清除生成并删除makefile和其他文件的目标 生成的生成系统的一部分。CMake不会生成“make” distclean”目标,因为CMakeLists.txt文件可以运行脚本和 任意命令;CMake无法准确跟踪哪些文件 作为运行CMake的一部分生成。提供一个干净的目标 会给用户一种错误的印象,认为它会按预期工作。 (CMake会生成一个“清除”目标来删除生成的文件 由编译器和链接器执行。)

    “保持距离清洁”目标仅适用于 如果用户执行源代码内生成,则需要。CMake支持 在源代码构建中,但我们强烈鼓励用户采用这个概念 一个源代码外的构建。使用独立于 源目录树将阻止CMake生成目录中的任何文件 源树。因为CMake不会更改源树,所以 不需要一个干净的目标。一个人可以开始一个新的建设 删除生成树或创建单独的生成树


    创建临时生成目录,例如,
    build\u cmake
    。因此,所有生成文件都将位于该文件夹中

    然后在主CMake文件中添加以下命令

    add_custom_target(clean-all
        rm -rf *
    )
    
    因此,在编译do时

    cmake ..
    
    清洁工作:

    make clean-all
    

    我最近发现的一个解决方案是将源代码外构建概念与Makefile包装器相结合

    在我的顶级CMakeLists.txt文件中,我包含以下内容以防止源代码内生成:

    if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
        message( FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt." )
    endif()
    
    然后,我创建一个顶级Makefile,并包括以下内容:

    # -----------------------------------------------------------------------------
    # CMake project wrapper Makefile ----------------------------------------------
    # -----------------------------------------------------------------------------
    
    SHELL := /bin/bash
    RM    := rm -rf
    MKDIR := mkdir -p
    
    all: ./build/Makefile
        @ $(MAKE) -C build
    
    ./build/Makefile:
        @  ($(MKDIR) build > /dev/null)
        @  (cd build > /dev/null 2>&1 && cmake ..)
    
    distclean:
        @  ($(MKDIR) build > /dev/null)
        @  (cd build > /dev/null 2>&1 && cmake .. > /dev/null 2>&1)
        @- $(MAKE) --silent -C build clean || true
        @- $(RM) ./build/Makefile
        @- $(RM) ./build/src
        @- $(RM) ./build/test
        @- $(RM) ./build/CMake*
        @- $(RM) ./build/cmake.*
        @- $(RM) ./build/*.cmake
        @- $(RM) ./build/*.txt
    
    ifeq ($(findstring distclean,$(MAKECMDGOALS)),)
        $(MAKECMDGOALS): ./build/Makefile
        @ $(MAKE) -C build $(MAKECMDGOALS)
    endif
    
    通过键入
    make
    调用默认目标
    all
    ,并调用目标
    /build/Makefile

    目标
    /build/Makefile
    所做的第一件事是使用
    $(MKDIR)
    创建
    build
    目录,这是
    MKDIR-p
    的一个变量。目录
    build
    是我们执行源代码外构建的地方。我们提供参数
    -p
    ,以确保
    mkdir
    不会因为我们试图创建一个可能已经存在的目录而对我们大喊大叫

    目标
    /build/Makefile
    所做的第二件事是将目录更改为
    build
    目录并调用
    cmake

    回到
    all
    目标,我们调用
    $(MAKE)-C build
    ,其中
    $(MAKE)
    是为
    MAKE
    自动生成的Makefile变量<代码>生成-C
    在执行任何操作之前更改目录。因此,使用
    $(MAKE)-C
    
    mkdir build
    cd build
    cmake ..
    make 
    
    #!/bin/bash
    
    for fld in $(find -name "CMakeLists.txt" -printf '%h ')
    do
        for cmakefile in CMakeCache.txt cmake_install.cmake CTestTestfile.cmake CMakeFiles Makefile
        do
            rm -rfv $fld/$cmakefile
        done
    done
    
    t-cmake-clean() {
        local BUILD=$(basename $(pwd))
        cd ..
        rm -rf $BUILD
        mkdir $BUILD && cd $BUILD
    }
    
    rm -rf CMakeFiles/
    cmake --build .
    
    $ cat ~/bin/cmake-clean-build
    #!/bin/bash
    
    if [ -d ../build ]; then
        cd ..
        rm -rf build
        mkdir build
        cd build
    else
        echo "build directory DOES NOT exist"
    fi
    
    . cmake-clean-build
    
    sed -ne '/variable specified on the command line/{n;s/.*/-D \0 \\/;p}' CMakeCache.txt
    
    find . -name 'CMakeCache.txt' -o -name '*.cmake' -o -name 'Makefile' -o -name 'CMakeFiles' -exec rm -rf {} +
    
    rm -rf **/CMakeCache.txt **/*.cmake **/Makefile **/CMakeFiles
    
    [root@localhost hello]# ls
    CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  hello  Makefile  test
    [root@localhost hello]# vi Makefile
    clean:
            $(MAKE) -f CMakeFiles/Makefile2 clean
            rm   -rf   *.o   *~   .depend   .*.cmd   *.mod    *.ko   *.mod.c   .tmp_versions *.symvers *.d *.markers *.order   CMakeFiles  cmake_install.cmake  CMakeCache.txt  Makefile