CMake: プロジェクトをもっと効率的に!「ENABLED_LANGUAGES」と外部ビルドシステムの連携


CMake の "Properties of Global Scope" における "ENABLED_LANGUAGES" は、プロジェクトで使用可能なプログラミング言語を管理するためのプロパティです。このプロパティは、CMake の様々なコマンドや関数によって参照され、プロジェクトのビルド設定を決定する際に重要な役割を果たします。

機能

  • 言語固有のオプションや設定を制御できます。
  • デフォルトでは、C、C++、RC 言語が有効になっています。
  • 複数の言語を同時に指定できます。
  • プロジェクトで使用可能なプログラミング言語を指定できます。

使用方法

"ENABLED_LANGUAGES" プロパティは、以下の方法で設定できます。

  • project() コマンド:
project(MyProject LANGUAGES CXX)

この例では、プロジェクト MyProject で C++ 言語のみが有効になります。

  • enable_language() コマンド:
enable_language(C)
enable_language(CXX)

この例では、プロジェクトで C と C++ 言語が有効になります。

  • set() コマンド:
set(CMAKE_ENABLED_LANGUAGES C CXX)

この例では、CMAKE_ENABLED_LANGUAGES 変数を使用して、プロジェクトで C と C++ 言語が有効になります。

関連プロパティ

  • CMAKE_LANG_FLAGS: 言語固有のオプションや設定を指定します。
  • CMAKE_OPTIONAL_LANGUAGES: プロジェクトで使用できるオプションのプログラミング言語を指定します。
  • CMAKE_REQUIRED_LANGUAGES: プロジェクトで必須のプログラミング言語を指定します。

以下の例は、C++ と Fortran 言語を使用してプロジェクトをビルドする方法を示します。

cmake_minimum_required(VERSION 3.10)

project(MyProject LANGUAGES CXX Fortran)

add_executable(MyProgram myprogram.cpp mymodule.f90)

この例では、project() コマンドを使用して、C++ と Fortran 言語をプロジェクトで有効にします。その後、add_executable() コマンドを使用して、MyProgram という名前の実行可能ファイルを作成します。この実行可能ファイルは、myprogram.cppmymodule.f90 というソースファイルからビルドされます。

"ENABLED_LANGUAGES" プロパティの詳細については、CMake の公式ドキュメントを参照してください:

プログラミング言語の選択

プロジェクトで使用するプログラミング言語は、プロジェクトの要件によって異なります。一般的には、以下の要素を考慮して言語を選択します。

  • コミュニティとサポート: コミュニティとサポートは、問題が発生したときに役立つため、重要な要素です。活発なコミュニティと豊富なサポートリソースを持つ言語を選択すると、問題を解決しやすくなります。
  • 開発者のスキル: 開発者のスキルは、プロジェクトで使用する言語を選択する際に重要な要素です。開発者が既に習得している言語を使用すると、開発時間を短縮し、コードの品質を向上させることができます。
  • プロジェクトの目的: プロジェクトの目的は、何を達成しようとしているのかによって異なります。特定のタスクに適した言語は、言語によって異なります。


C++ と Fortran 言語を使用してプロジェクトをビルドする

cmake_minimum_required(VERSION 3.10)

project(MyProject LANGUAGES CXX Fortran)

add_executable(MyProgram myprogram.cpp mymodule.f90)
  • add_executable() コマンドを使用して、MyProgram という名前の実行可能ファイルを作成します。この実行可能ファイルは、myprogram.cppmymodule.f90 というソースファイルからビルドされます。
  • project() コマンドを使用して、プロジェクトの名前と使用する言語を指定します。
  • このコードは、C++ と Fortran 言語を使用して MyProject という名前のプロジェクトをビルドします。

デフォルトの言語を変更する

cmake_minimum_required(VERSION 3.10)

set(CMAKE_ENABLED_LANGUAGES Fortran C)

add_executable(MyProgram myprogram.f90)

説明

  • add_executable() コマンドを使用して、MyProgram という名前の実行可能ファイルを作成します。この実行可能ファイルは、myprogram.f90 という Fortran ソースファイルからビルドされます。
  • set() コマンドを使用して、CMAKE_ENABLED_LANGUAGES 変数に言語リストを設定します。
  • このコードは、Fortran 言語をデフォルトの言語として設定し、C 言語も有効にします。
cmake_minimum_required(VERSION 3.10)

project(MyProject LANGUAGES CXX)

set(CMAKE_CXX_FLAGS "-Wall -std=c++17")

add_executable(MyProgram myprogram.cpp)

説明

  • add_executable() コマンドを使用して、MyProgram という名前の実行可能ファイルを作成します。この実行可能ファイルは、myprogram.cpp という C++ ソースファイルからビルドされます。
  • set() コマンドを使用して、CMAKE_CXX_FLAGS 変数に C++ コンパイラフラグを設定します。
  • project() コマンドを使用して、プロジェクトの名前と使用する言語を指定します。
  • このコードは、C++ 言語をプロジェクトで使用可能にし、C++ コンパイラフラグを設定します。

これらの例は、"ENABLED_LANGUAGES" プロパティをどのように使用してプロジェクトで使用可能なプログラミング言語を管理できるかを示しています。

  • プロジェクトの要件に応じて、これらの例をカスタマイズする必要があります。
  • CMake には、"ENABLED_LANGUAGES" プロパティに関連する多くのコマンドと関数があります。詳細については、CMake の公式ドキュメントを参照してください。


個別のターゲット設定

プロジェクトで複数の言語を使用する場合、ターゲットごとに言語設定を個別に設定する方法があります。 これは、各ターゲットが異なる言語要件を持つ場合に役立ちます。

cmake_minimum_required(VERSION 3.10)

project(MyProject)

add_executable(MyCppProgram myprogram.cpp)
add_executable(MyFortranProgram mymodule.f90)

target_link_libraries(MyCppProgram MyFortranProgram)

説明

  • target_link_libraries() コマンドを使用して、ターゲット間でリンクを行います。
  • add_executable() コマンドを使用して、各ターゲットにソースファイルを指定します。
  • この例では、MyCppProgramMyFortranProgram という 2 つのターゲットを作成します。

外部ビルドシステムの統合

CMake 以外にも、プロジェクトをビルドするためのツールやフレームワークは多数存在します。 プロジェクトで既にそのようなツールを使用している場合は、それらのツールを使用して言語設定を管理することができます。

cmake_minimum_required(VERSION 3.10)

project(MyProject)

externalproject_add(MyExternalProject
  SOURCE_DIR ${PROJECT_SOURCE_DIR}/external
  BUILD_COMMAND make
  INSTALL_COMMAND make install
)

add_dependencies(MyProgram MyExternalProject)

説明

  • add_dependencies() コマンドを使用して、メインターゲットと外部プロジェクト間の依存関係を設定します。
  • externalproject_add() コマンドを使用して、外部プロジェクトのソースディレクトリ、ビルドコマンド、およびインストールコマンドを指定します。
  • この例では、MyExternalProject という名前の外部プロジェクトを追加します。

シンプルなプロジェクトの場合、手動スクリプトを使用して言語設定を管理することができます。 これは、CMake を使用するよりも軽量な方法です。

#!/bin/bash

set -e

# C++ コンパイラフラグを設定
CXXFLAGS="-Wall -std=c++17"

# C++ ソースファイルをコンパイル
g++ -o myprogram myprogram.cpp $CXXFLAGS

# Fortran ソースファイルをコンパイル
gfortran -o mymodule mymodule.f90

# 実行可能ファイルを実行
./myprogram
  • シェルスクリプトを使用して、コンパイラフラグを設定し、ソースファイルをコンパイルし、実行可能ファイルをを実行します。
  • この例では、myprogram.cppmymodule.f90 というソースファイルをコンパイルし、myprogram という名前の実行可能ファイルを作成します。