LoginSignup
10
5

More than 3 years have passed since last update.

CLionで競プロ用に複数のmainを扱いたい

Posted at

前置き

競プロ(AtCoder)をやっていると、
「いま触っているmainを動かしたいんじゃー!」
と思うようになりました。

先駆者様のCMakeFileList.txtを参考にして、それっぽいことが出来るようになったので置いておきます。

CMakeFileList

以下のものから必要な部分をCMakeFileList.txtに追加します。
「Reload CMake Project」して反映します。

・注意点
cppファイル名とその上のディレクトリ名でビルド構成の名前にしているので、
AtCoder/ABC/001/a.cpp
AtCoder/AGC/001/a.cpp
という配置だと名前が重複(001_a)して動きません。

AtCoder/ABC/abc001/a.cpp
AtCoder/AGC/agc001/a.cpp
のようにcppを入れているディレクトリ名がユニークになるようにしてください。

CMakeFileList.txt
cmake_minimum_required(VERSION 3.14)
project(AtCoder)

set(CMAKE_CXX_STANDARD 14)

# 指定したとこ含めて、cppファイルがあったらビルド構成作る
MACRO(CREATE_BINARY target_dir)
    # 指定したディレクトリの中身一覧(孫までは取れない)
    FILE(GLOB children RELATIVE ${target_dir} ${target_dir}/*)
    FOREACH(child ${children})
        SET(path ${target_dir}/${child})
        # ディレクトリなら更に潜る、生成されるディレクトリは除外
        IF(IS_DIRECTORY ${path} AND NOT ${path} MATCHES "cmake-build-debug")
            CREATE_BINARY(${path})
        # cppファイルならバイナリー作成
        ELSEIF(${path} MATCHES \.cpp$)
            # バイナリー名を用意
            SET(binary_name "")
            STRING(REGEX MATCH [^\/]+\/[^\/]+\.cpp$ binary_name ${path})
            STRING(REGEX REPLACE "\/" "_" binary_name ${binary_name})
            STRING(REGEX REPLACE "\.cpp" "" binary_name ${binary_name})
            # 実行可能ファイルを追加
            ADD_EXECUTABLE(${binary_name} ${path})
        ENDIF()
    ENDFOREACH()
ENDMACRO()

CREATE_BINARY(${CMAKE_CURRENT_SOURCE_DIR})

運用

【その1】
コンテスト追加するなどして、フォルダ構成を変えたら
「Reload CMake Project」する

【その2】「おお、勝手に切り替わる!素敵!!」
編集中のmain()内で右クリックして、RunとかDebugする
※ main()内にカーソル無いとRunとDebug出ない(solve()とかで書いてる場合)
※ CLionの右上からでもビルド構成を選択できる(多くて間違いそう)

あとがき

main()内で右クリックでそのビルド構成が勝手に選択されて動くことに気づいたので、その勢いで書きました。
何番煎じか分かりませんが、何かの役に立ったらいいなー。

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5