設定
CMake で正常にビルドおよび実行されるプロジェクトがあります。私のプロジェクト設定は次のようなものです:
├── CMakeLists.txt
|
├── include/
│ └── standalone/
│ └── x.hpp
|
├── src/
└── standalone/
└── main.cpp
私のヘッダーの内容は次のようなものです:
// ------x.hpp--------
#pragma once
#include <iostream>
class X
{
public:
void hello()
{
std::cout << "Hello World!\n"; // needs <iostream>
}
};
// -------main.cpp-------
#include <standalone/x.hpp>
int main()
{
X x;
x.hello();
}
私は以下を使用しますCMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(standalone)
###############################################################
# Compiler settings
###############################################################
# use C++11 features
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# set warning level
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -pedantic -pedantic-errors -Wall -Wextra")
###############################################################
# header dependencies
###############################################################
# compile against project headers
include_directories(${PROJECT_SOURCE_DIR}/include)
# the header files
file(GLOB_RECURSE header_files FOLLOW_SYMLINKS "include/*.hpp")
# the source files
file(GLOB_RECURSE source_files FOLLOW_SYMLINKS "src/*.cpp")
###############################################################
# build target
###############################################################
# the program depends on the header files and the source files
add_executable(main ${header_files} ${source_files})
mkdir build
コマンド、cd build
、 cmake ..
、make
、およびのシーケンスは、 ./main
「Hello World!」を正しく出力します。警告なし。
問題
上記の設定は正しいです。しかし、含まれていたので<iostream>
はなく、含まれてx.hpp
いたとしmain.cpp
ます。その後、プログラムは正しくビルドされx.hpp
ますが、スタンドアロン ヘッダーにはなりません。したがって、ヘッダーの自給自足をテストしたいと思います。つまり、ヘッダーごとに小さなテストプログラムをコンパイルしたいと思います
#include "some_header.hpp"
int main() {}
ただし、次のセクションをCMakeList.txt
###############################################################
# header self-sufficiency
###############################################################
set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS})
message("REQUIRED_FLAGS=${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_SOURCE_DIR}/include)
message("REQUIRED_INCLUDES=${CMAKE_REQUIRED_INCLUDES}")
include(CheckIncludeFiles)
check_include_files("${header_files}" IS_STANDALONE)
マクロ${header_files}
はヘッダーに正しく展開されますx.hpp
が、check_include_files()
コマンドはヘッダーを正しくコンパイルしません
REQUIRED_FLAGS= -std=c++11 -Werror -pedantic -pedantic-errors -Wall -Wextra
REQUIRED_INCLUDES=/home/rein/projects/standalone/include
-- Looking for include file /home/rein/projects/standalone/include/standalone/x.hpp
-- Looking for include file /home/rein/projects/standalone/include/standalone/x.hpp - not found.
質問
どうやら、CMake が適切な場所で検索できるようにする構成変数がいくつかありません。正しいヘッダーであってもcheck_include_files()
機能しません。これを機能させるにはどうすればよいですか? 正しいヘッダーが正しいと見なされた場合にのみ、正しくないヘッダーをテストできます。
注絶対に必要な場合を除き、シェル スクリプトや、直接呼び出しを行う複雑な CMake for ループなどには興味がありませんTRY_COMPILE
。AFAICS、それがCheckIncludeFiles
モジュールの目的です。可能であれば、それを正しく構成する方法を知りたいです。