Build 使用cmake,您将如何禁用源代码构建?

Build 使用cmake,您将如何禁用源代码构建?,build,cmake,Build,Cmake,我想禁止人们用生成的CMake文件扰乱我们的源代码树。。。而且,更重要的是,禁止他们使用现有的makefile,这些文件不属于我们使用CMake进行的构建过程的一部分。(最好不要问) 我想出的方法是在我的CMakeLists.txt顶部有几行,如下所示: if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}") message(SEND_ERROR "In-source builds are not allowed.") en

我想禁止人们用生成的CMake文件扰乱我们的源代码树。。。而且,更重要的是,禁止他们使用现有的
makefile
,这些文件不属于我们使用CMake进行的构建过程的一部分。(最好不要问)

我想出的方法是在我的
CMakeLists.txt
顶部有几行,如下所示:

if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
   message(SEND_ERROR "In-source builds are not allowed.")
endif("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
然而,这样做似乎太冗长了。此外,如果我尝试在源代码内部构建,它仍然会在抛出错误之前在源代码树中创建
CMakeFiles/
目录和
cmakcache.txt
文件


我错过了更好的方法吗?

我想我喜欢你的方法。cmake邮件列表在回答这类问题方面做得很好

作为旁注:您可以在失败的目录中创建一个“cmake”可执行文件。取决于“.”是否在其路径中(在linux上)。您甚至可以使用符号链接/bin/false


在windows中,我不确定是否首先在当前目录中找到文件。

只需让执行生成的人员/进程将目录设置为只读即可。有一个单独的进程从源代码管理签出到目录(您正在使用源代码管理,对吗?),然后使其只读

您可以像这样配置.bashrc文件


看看cmakkde和kdebuild函数。设置BUILD和SRC env。变量,并根据需要编辑这些函数。这将只在buildDir中生成,而不是在srcDir中生成。CMake有两个未记录的选项:
CMAKE\u DISABLE\u SOURCE\u CHANGES
CMAKE\u DISABLE\u IN\u SOURCE\u BUILD

cmake_minimum_required (VERSION 2.8)

# add this options before PROJECT keyword
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)

project (HELLO)

add_executable (hello hello.cxx)
-

/home/selivanov/cmake-2.8.8/Source/cmMakefile.cxx

bool cmMakefile::CanIWriteThisFile(const char* fileName)
{
  if ( !this->IsOn("CMAKE_DISABLE_SOURCE_CHANGES") )
    {
    return true;
    }
  // If we are doing an in-source build, than the test will always fail
  if ( cmSystemTools::SameFile(this->GetHomeDirectory(),
                               this->GetHomeOutputDirectory()) )
    {
    if ( this->IsOn("CMAKE_DISABLE_IN_SOURCE_BUILD") )
      {
      return false;
      }
    return true;
    }

  // Check if this is subdirectory of the source tree but not a
  // subdirectory of a build tree
  if ( cmSystemTools::IsSubDirectory(fileName,
      this->GetHomeDirectory()) &&
    !cmSystemTools::IsSubDirectory(fileName,
      this->GetHomeOutputDirectory()) )
    {
    return false;
    }
  return true;
}
我的
.bashrc
/
.zshrc
中有一个
cmake()

function cmake() {
  # Don't invoke cmake from the top-of-tree
  if [ -e "CMakeLists.txt" ]
  then
    echo "CMakeLists.txt file present, cowardly refusing to invoke cmake..."
  else
    /usr/bin/cmake $*
  fi
}
我更喜欢这种低调的解决方案。当我们切换到CMake时,它消除了我同事们最大的抱怨,但它并不能阻止那些真正想进行源代码内/树顶构建的人这样做,他们可以直接调用
/usr/bin/CMake
(或者根本不使用包装器函数)。它非常简单。

包含一个函数,如。这与您处理这些差异的方法类似:

  • 它封装在一个函数中,当包含
    PreventInSourceBuilds.cmake
    模块时,会调用该函数。您的主CMakeLists.txt必须包含以下内容:

    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMake)
    include(PreventInSourceBuilds)
    
  • 它使用with REALPATH参数,在比较路径之前解析符号链接

  • 如果github链接发生更改,下面是模块源代码(在上面的示例中,应将其放置在名为
    cmake
    的目录中的
    preventinsucebuilds.cmake
    ):

    对于Linux上的用户:

    添加到顶级CMakeLists.txt:

    set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
    
    在顶层创建文件“dotme”,或将其添加到.bashrc(全局):

    现在运行:

    . ./dotme
    
    尝试在顶级源代码树中运行cmake时:

    $ cmake .
    CMAKE_DISABLE_IN_SOURCE_BUILD ON
    
    未生成CMakeFiles/或CMAKECHACHE.txt

    在进行源代码外构建时,您需要第一次运行cmake,只需调用实际的可执行文件:

    $ cd build
    $ /usr/bin/cmake ..
    

    就我而言,这仍然是最好的答案:

    project(myproject)
    
    if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
      message(FATAL_ERROR "In-source builds are not allowed")
    endif()
    
    或允许生成,但显示警告消息:

    if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
      message(WARNING "In-source builds are not recommended")
    endif()
    

    但是,似乎没有简单的方法可以避免在源目录中创建
    CMakeFiles/
    cmakcache.txt

    好主意;我将把它解释为在$PATH上放置一些东西来拦截对cmake的调用,或者简单地说是一个单独的脚本来包装它。或者是一个标准的别名。除非在cmake中有一种“本地”的方式来实现这一点,否则我认为这是一种方式。是的,我相信在Windows上,“.”隐含在$PATH上;在UNIX上不是这样,但我们总是可以在$PATH中的其他地方放置一个cmake包装器。在他们的路径上?假“cmake”的想法在默认情况下不会起作用,因为通常情况下“.”不会在他们的路径上。我认为CMakeLists.txt解决方案更好一些,尽管它很冗长,因为它不依赖于具有特定路径的用户。此外,我将把它放在我未来的所有cmake设置中。谢谢你的回答。不幸的是,由于我们的源代码管理和系统的工作方式,这样做是不切实际的。我一直在寻找一个更通用的解决方案。不幸的是,这并不能阻止CMake创建CMakeCache.txt和CMakeFiles/,因此这并不比发出错误信号更好(更糟糕的是,它会给出一条神秘的消息)。只需创建一个名为“CMakeCache.txt”的目录即可避免创建缓存文件。如果它们没有文档记录,您应该小心使用这些选项。在将来的版本中,它们可能会在没有警告的情况下更改。不幸的是,我使用模糊的CXX编译器组合时会出现回归错误。出于充分的理由,最好不要使用未记录的选项。这是迄今为止我找到的最好的解决方案。但是,您可以使消息更具信息性:消息(源生成中不允许出现致命错误。请为生成创建一个单独的文件夹:\nmkdir build;cd build;cmake..\n在此之前,请删除已创建的文件:\nrm-rf CMakeCache.txt CMakeFiles”)问题是它不可移植,在源代码中也不明确。谢谢。我编辑了这个答案以包含源代码。我喜欢这种方法。
    $ cd build
    $ /usr/bin/cmake ..
    
    project(myproject)
    
    if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
      message(FATAL_ERROR "In-source builds are not allowed")
    endif()
    
    if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
      message(WARNING "In-source builds are not recommended")
    endif()