告诉CMake使用来自CMake的C文件的C ++编译器?

时间:2016-06-20 20:14:06

标签: cmake

这与Force CMake to use C++ compiler for C files with Visual Studio类似,但不完全相同。它不一样,因为它的CMake文件导致失败;而我几乎在所有现代平台上工作,从BSD和OS X到Solaris和Unix。

我试图避免CMake执行无用的检查:

project(cryptopp, CXX)

这是我尝试生成makefile时会发生什么:

$ cmake .
-- Check if the system is big endian
-- Searching 16 bit integer
-- Check size of unsigned short
CMake Error at /usr/share/cmake-2.8/Modules/CheckTypeSize.cmake:82 (try_compile):
  Unknown extension ".c" for file

    /home/jeffrey/cryptopp/CMakeFiles/CheckTypeSize/CMAKE_SIZEOF_UNSIGNED_SHORT.c

  try_compile() works only for enabled languages.  Currently these are:

    CXX

  See project() command to enable other languages.
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/CheckTypeSize.cmake:167 (__check_type_size_impl)
  /usr/share/cmake-2.8/Modules/TestBigEndian.cmake:27 (CHECK_TYPE_SIZE)
  CMakeLists.txt:49 (TEST_BIG_ENDIAN)

我们的项目中没有任何C文件,因此我们应该project(cryptopp, CXX)安全(如果我正确地阅读cmake --help-command project)。

引用的问题涉及项目文件,但不涉及CMake文件。

如何告诉CMake对所有文件使用C ++编译器,包括它自己的CMake文件?

我在Ubuntu 12 LTS上,它提供:

$ cmake --version
cmake version 2.8.7

1 个答案:

答案 0 :(得分:3)

有一些方法可以将.c添加为CXX编译器的有效文件扩展名。即使这是非常先进的CMake东西,你可能需要 - 如果你一定要支持旧版本的CMake - 无论如何都要“制作规则覆盖脚本”。

所以我成功测试了以下内容:

<强> CryptoppMakeRulesOverwrite.cmake

list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS c)

<强>的CMakeLists.txt

cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR)

set(CMAKE_USER_MAKE_RULES_OVERRIDE "CryptoppMakeRulesOverwrite.cmake")

project(cryptopp CXX)

include(CheckTypeSize)
CHECK_TYPE_SIZE("unsigned short" CMAKE_SIZEOF_UNSIGNED_SHORT)

由于@Tsyvarev已评论check_type_size()支持LANGUAGE参数,但遗憾的是不适用于CMake版本2.8.7。但是这个旧版本已经支持CMAKE_USER_MAKE_RULES_OVERRIDE

所以我仍然想知道是不是最好的解决方案是转到更新版本的CMake(迫使一些较旧的CMake版本用户升级)。或者编写自己的try_compile()摘要。

<强>参考