如何在CMake项目中添加一个全局文件扩展名(* .pde)到GCC,它被视为C ++代码

时间:2015-05-31 10:36:07

标签: gcc cmake

我有一个非常简单的CMake脚本。不幸的是,该项目使用* .pde文件,它是普通的C ++或C代码。

CMake正在处理任何文件结束,但是我收到编译错误,因为GCC不知道如何处理它。如何向GCC添加全局文件扩展名,以便将* .pde文件编译为通常的* .cpp文件?

如果我想使用控制台,-x c++ foo.pde命令很好,但对于CMake,它(我认为)不适用。

cmake_minimum_required(VERSION 2.8)
project(RPiCopter)

SET( RPiCopter
  absdevice
  containers
  device
  exceptions
  navigation
  frame
  vehicle
  receiver
  scheduler
  tinycopter.pde
)

message( STATUS "Include ArduPilot library directories" )
foreach( DIR ${AP_List} ${AP_List_Linux} ${AP_Headers} )
  include_directories( "../libraries/${DIR}" )
endforeach()
include_directories( zserge-jsmn )

# ***************************************
# Build the firmware
# ***************************************
add_subdirectory ( zserge-jsmn )

#set(CMAKE_CXX_FLAGS "-x c++ *.pde")
ADD_EXECUTABLE ( RPiCopter ${RPiCopter} )
target_link_libraries ( RPiCopter -Wl,--start-group ${AP_List} ${AP_List_Linux} jsmn -Wl,--end-group )

4 个答案:

答案 0 :(得分:3)

您应该能够使用set_source_files_propertiesLANGUAGE属性将文件标记为C ++源:

set_source_files_properties(${TheFiles} PROPERTIES LANGUAGE CXX)

正如@steveire在他自己的回答中指出的那样,this bug将需要类似以下的解决方法:

set_source_files_properties(${TheFiles} PROPERTIES LANGUAGE CXX)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  add_definitions("-x c++")
endif()

答案 1 :(得分:2)

我决定使用这种方法。我只是删除临时构建目录中以cmake结尾的文件。 因此,由于奇怪的Arduino * .pde文件扩展名,GCC不再混淆了。

# Exchange the file ending of the Arduino project file
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tinycopter.pde ${CMAKE_CURRENT_BINARY_DIR}/tinycopter.cpp)

答案 2 :(得分:1)

通常你应该能够扩展CMAKE_CXX_SOURCE_FILE_EXTENSIONS。如果您有大量具有未知文件扩展名的文件,这将有所帮助。

但是这个变量没有被缓存 - 例如CMAKE_CXX_FLAGS是 - 所以CMakeCXXCompiler.cmake.in中的以下代码将始终覆盖/隐藏您要设置的内容:

set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP)

我认为这个非缓存是a bug in CMake,但在此之前我会搜索一个解决方案,考虑以下因素:

  • 您通常不想更改CMake安装中的文件
  • 如果您在CMAKE_CXX_SOURCE_FILE_EXTENSIONS / project()之后更改enable_language()(如here所述),则无效。

我已使用CMakeCXXCompiler.cmake.in中的一个“hooks”/配置变量成功测试了以下内容:

cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_SYSROOT_FLAG_CODE "list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS pde)")

project(RPiCopter CXX)

message("CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${CMAKE_CXX_SOURCE_FILE_EXTENSIONS}")

add_executable(RPiCopter tinycopter.pde)

答案 3 :(得分:-1)

CMake不会为你做这件事:

http://public.kitware.com/Bug/view.php?id=14516