什么是cmake的outofsource错误

时间:2016-05-07 14:56:26

标签: cmake mingw tpm

我正在尝试用cmake编译一些东西,并且它提出了一个关于要求缺少源代码的错误。如何找到有关此错误的更多信息? 这是输出

C:\Users\sansari\Downloads\tpm_emulator-0.7.4\tpm_emulator-0.7.4\build>cmake ../
CMake Error at CMakeLists.txt:17 (message):
  TPM_Emulator requires an out of source build.


-- Configuring incomplete, errors occurred!
See also "C:/Users/sansari/Downloads/tpm_emulator-0.7.4/tpm_emulator-0.7.4/CMakeFiles/CMakeOutput.log".

以下是CMakeLists.txt的内容

# Software-based Trusted Platform Module (TPM) Emulator
# Copyright (C) 2004-2010 Mario Strasser <mast@gmx.net>
#
# $Id: CMakeLists.txt 475 2011-12-20 18:21:19Z mast $

project(TPM_Emulator C)

cmake_minimum_required(VERSION 2.4)
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif()

# enforce out of source build
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" IS_INSOURCE)
if(IS_INSOURCE)
    message(FATAL_ERROR "${PROJECT_NAME} requires an out of source build.")
endif()

# set project and build version
set(${PROJECT_NAME}_VERSION_MAJOR 0)
set(${PROJECT_NAME}_VERSION_MINOR 7)
string(REGEX REPLACE ".*Revision: ([0-9]+).*" "\\1" ${PROJECT_NAME}_VERSION_BUILD "$Revision: 475 $")

# create project configuration
if(WIN32)
STRING(REGEX REPLACE "\\\\" "/" PROGRAMFILES "$ENV{PROGRAMFILES}/${PROJECT_NAME}")
set(TPM_LOG_FILE "${PROGRAMFILES}/tpmd.log")
set(TPM_STORAGE_NAME "${PROGRAMFILES}/tpm_emulator-1_2_${${PROJECT_NAME}_VERSION_MAJOR}_${${PROJECT_NAME}_VERSION_MINOR}
")
set(TPM_DEVICE_NAME "//./pipe/tpmd:0")
elseif(APPLE)
set(TPM_LOG_FILE "/private/var/log/tpmd.log")
set(TPM_SOCKET_NAME "/private/var/run/tpm/tpmd_socket:0")
set(TPM_STORAGE_NAME "/private/var/lib/tpm/tpm_emulator-1_2_${${PROJECT_NAME}_VERSION_MAJOR}_${${PROJECT_NAME}_VERSION_MINOR}")
set(TPM_DEVICE_NAME "/dev/tpm")
else()
set(TPM_LOG_FILE "/var/log/tpmd.log")
set(TPM_SOCKET_NAME "/var/run/tpm/tpmd_socket:0")
set(TPM_STORAGE_NAME "/var/lib/tpm/tpm_emulator-1_2_${${PROJECT_NAME}_VERSION_MAJOR}_${${PROJECT_NAME}_VERSION_MINOR}")
set(TPM_DEVICE_NAME "/dev/tpm")
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
add_definitions(-Wall -Werror -Wno-unused-parameter -Wpointer-arith -Wcast-align -Wwrite-strings)
if("${CMAKE_SYSTEM}" MATCHES "Linux")
    add_definitions(-Wextra)
endif()
if(USE_OPENSSL)
    add_definitions(-DUSE_OPENSSL)
endif()
include_directories("/opt/local/include")
link_directories("/opt/local/lib")

# configure CPack
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
set(CPACK_SOURCE_PACKAGE_FILE_NAME "tpm_emulator-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.4")
set(CPACK_SOURCE_GENERATOR "TGZ")
set(CPACK_SOURCE_IGNORE_FILES ".svn/" "/build/" "/.project" "/.cproject")
set(CPACK_GENERATOR "ZIP")
set(CPACK_SET_DESTDIR ON)
include(CPack)

# include root directories
include_directories(${CMAKE_SOURCE_DIR})
include_directories(${CMAKE_BINARY_DIR})

# add internal libraries
add_subdirectory(tpm)
add_subdirectory(mtm)
add_subdirectory(crypto)

# add TDDL
add_subdirectory(tddl)

# add kernel modules
add_subdirectory(tpmd_dev)

# add executables
add_subdirectory(tpmd)

@ Dan Shepler - 谢谢。我删除了源并再次解压缩。现在我收到如下不同的消息:

$ cmake ../
-- The C compiler identification is unknown
CMake Error at CMakeLists.txt:6 (project):
  The CMAKE_C_COMPILER:

    cl

  is not a full path and was not found in the PATH.

  To use the NMake generator with Visual C++, cmake must be run from a shell
  that can use the compiler cl from the command line.  This environment is
  unable to invoke the cl compiler.  To fix this problem, run cmake from the
  Visual Studio Command Prompt (vcvarsall.bat).

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.


-- Configuring incomplete, errors occurred!
See also "C:/Users/sansari/Downloads/tpm_emulator-0.7.4/tpm_emulator-0.7.4/build/CMakeFiles/CMakeOutput.log".
See also "C:/Users/sansari/Downloads/tpm_emulator-0.7.4/tpm_emulator-0.7.4/build/CMakeFiles/CMakeError.log".
Given that I have installed MinGw. I believe I have to set my compiler as gcc. And I believe this would be my path

C:\MinGW\bin

我刚刚做了这两个命令来将环境变量设置为我知道的编译器的路径,但我仍然得到错误。我在C:\ MinGw \ bin中看到了gcc.exe。我将尝试将gcc.exe的名称添加到环境变量路径。

set CC=C:\MinGW\bin



set CMAKE_C_COMPILER=C:\MinGW\bin

我在构建目录中找到了需要更改的变量并对其进行了更改。现在它说

$ cmake ../
-- The C compiler identification is GNU 4.9.3
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
CMake Error: Generator: execution of make failed. Make command was: "nmake" "/NOLOGO" "cmTC_5e307\fast"
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- broken
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.5/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler "C:/MinGW/bin/gcc.exe" is not able to compile a simple test
  program.

  It fails with the following output:

   Change Dir: C:/Users/sansari/Downloads/tpm_emulator-0.7.4/tpm_emulator-0.7.4/build/CMakeFiles/CMakeTmp



  Run Build Command:"nmake" "/NOLOGO" "cmTC_5e307\fast"



  Generator: execution of make failed.  Make command was: "nmake" "/NOLOGO"
  "cmTC_5e307\fast"





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:6 (project)


-- Configuring incomplete, errors occurred!
See also "C:/Users/sansari/Downloads/tpm_emulator-0.7.4/tpm_emulator-0.7.4/build/CMakeFiles/CMakeOutput.log".
See also "C:/Users/sansari/Downloads/tpm_emulator-0.7.4/tpm_emulator-0.7.4/build/CMakeFiles/CMakeError.log".

我在Windows 10上找到this链接并检查了我的路径变量。实际上我必须添加一个用户路径;我只是有系统路径。我把MInGw \ bin,msys \ bin和msys \ local \ bin和cmake放在我的路径中。

我认为这次是有效的。我做了什么我使用在管理模式下运行的cmd而不是MinGw shell。这是输出......

C:\Users\sansari\Downloads\tpm_emulator-0.7.4\tpm_emulator-0.7.4\build>cmake ../
-- The C compiler identification is GNU 4.9.3
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/sansari/Downloads/tpm_emulator-0.7.4/tpm_emulator-0.7.4/build

1 个答案:

答案 0 :(得分:0)

此行明确输出消息:

    message(FATAL_ERROR "${PROJECT_NAME} requires an out of source build.")

通常情况下,我不希望根据您提供的cmake命令触发if条件。我首先检查以前的配置尝试是否在源目录C:\Users\sansari\Downloads\tpm_emulator-0.7.4\tpm_emulator-0.7.4中遗留了一些CMake工件,这可能导致CMake拒绝使用您的构建目录。如果是这样,那么从源目录中删除CMakeCache.txt,CMakeFiles /等(或者只删除整个源目录并再次解压缩)。否则,为了调试发生的事情,我会暂时在if(IS_INSOURCE)语句上面插入这样的内容:

message(STATUS "CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message(STATUS "CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")
message(STATUS "IS_INSOURCE = ${IS_INSOURCE}")