Как добавить в проект CMake глобальное расширение файла (*.pde) для GCC, которое рассматривается как код C++

У меня очень простой скрипт 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 ответа

Вы должны быть в состоянии использовать set_source_files_properties вместе с LANGUAGE свойство помечать файл (ы) как источники C++:

set_source_files_properties(${TheFiles} PROPERTIES LANGUAGE CXX)

Как указал @steveire в своем ответе, эта ошибка потребует чего-то вроде следующего обходного пути:

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

Обычно вы должны иметь возможность просто расширить CMAKE_CXX_SOURCE_FILE_EXTENSIONS, Это поможет, если у вас много файлов с неизвестными расширениями.

Но эта переменная не кэшируется - как, например, CMAKE_CXX_FLAGS is - поэтому следующий код в 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)

Я считаю, что это не кэширование является ошибкой в ​​CMake, но пока это не изменится, я искал обходной путь, учитывая следующее:

  • Обычно вы не хотите изменять файлы в вашей установке CMake
  • Это не будет иметь никакого эффекта, если вы измените CMAKE_CXX_SOURCE_FILE_EXTENSIONS после project()/enable_language() (как обсуждено здесь).

Я успешно проверил следующее, используя одну из "перехватчиков" / переменных конфигурации внутри CMakeCXXCompiler.cmake.in:

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)

Я решил использовать этот подход. Я просто удаляю файл, оканчивающийся cmake, во временный каталог сборки. Так что GCC больше не смущает из-за странного расширения файла Arduino *.pde.

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

CMake не делает это для вас:

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

Другие вопросы по тегам