Drogonセットアップ

仕訳帳ソフトを作ろうと思って、sqlite3にrestapiで保存するためdrogonの設定をしていました。

久々だったので、下記の記事を見て思い出しながら設定しました。

https://note.com/random_grid/n/n755bdd07e46d

再ハマり防止の備忘録をメモしておきます。

要点は次の通りです。

  • トップディレクトリDrogonフォルダを作成
  • an-tao-drogon-v1.9.10.tar.gzをDrogon/drogon@repositoryに 解凍
  • Drogon/drogon@repository/vcpkg.json を作成
  • Drogon/drogon@repository/lib/src/DbClientManager.h を修正
  • postgresを使う場合はFindpg.cmakeを修正
  • drogon@repositoryをビルド&インストール
  • Drogon/cmake/deps/Drogon.cmakeを作成
  • drogon_ctl create project で Drogon/drogon@”project”を作成
  • Drogon/drogon@”project”/CMakeLists.txtを修正
  • Drogon/share/config/”project”にconfig.jsonを移動
  • main.ccに../share/config/”project”/config.jsonをロード


トップディレクトリDrogonフォルダを作成

Drogonフォルダで作業します。CMakeLists.txtを作成してdrogon@”project”をサブモジュールとしてビルドする準備をします。複数のdrogonプロジェクトを作成する場合に、トップディレクトリに共通モジュールを作成して使います。

an-tao-drogon-v1.9.10.tar.gzをdrogon@repository 解凍

v1.9.10は中文.txtがあってcmakeで解凍ができなかったため、vcpkgで解凍前のファイルを直接解凍してビルドしました。

drogon@repositoryという名前で解凍します。

※現在(2025-12-27)vcpkgでそのままdrogonが使用できます。


drogon@repository/vcpkg.json を作成

パッケージのインストールをします。vcpkg.jsonを作成し、以下のパッケージをインストールします。

vcpkg.json

{
  "dependencies": [
    "brotli",
    "c-ares",
    "jsoncpp",
    "openssl",
    "trantor",
    "zlib",
    "libpq",
    "sqlite3"
  ]
}


Drogon/drogon@repository/lib/src/DbClientManager.h を修正

コントローラーでapp().getLoop()->queueInLoop(…)を実行してコールバックを登録する場合、main.ccでコンフィグファイルがロードされる前にDbClientManager.hの設定確認が行われます。これを防止する修正を入れます。

ただのmain.ccでコンフィグロードし忘れでした。

DbClientManager.h

    DbClientPtr getDbClient(const std::string &name)
    {
      // ここから
      if (dbClientsMap_.find(name) == dbClientsMap_.end())
      {
        LOG_INFO << "name not found";
        for (auto [key, client] : dbClientsMap_)
          LOG_INFO << key;
        throw std::runtime_error("wait a moment until app().run() end processing");
      }
      // ここまで

      // ⇩で止まります。
        assert(dbClientsMap_.find(name) != dbClientsMap_.end());
        return dbClientsMap_[name];
    }



postgresを使う場合はFindpg.cmakeを修正

vcpkgでインストールしたpostgresを使用するように修正します。

Findpg.cmake

find_package(PostgreSQL)
if(PostgreSQL_FOUND)
  set(PG_LIBRARIES ${PostgreSQL_LIBRARIES})
  set(PG_INCLUDE_DIRS ${PostgreSQL_INCLUDE_DIRS})
  message(STATUS "pg inc: " ${PostgreSQL_INCLUDE_DIRS})
  // 追加
  add_library(pg_lib ALIAS PostgreSQL::PostgreSQL)
  // コメントアウト
  #[[add_library(pg_lib INTERFACE IMPORTED)
  set_target_properties(pg_lib
                        PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
                                   "${PostgreSQL_INCLUDE_DIRS}"
                                   INTERFACE_LINK_LIBRARIES
                                   "${PostgreSQL_LIBRARIES}") ]]
  
  mark_as_advanced(PG_INCLUDE_DIRS PG_LIBRARIES)



drogon@repositoryをビルド&インストール

ビルドしてビルドフォルダにてninja installを実行します。out/install/binにdrogon_ctlが作成されます。out/install/cmake/DrogonフォルダにDrogonConfig.cmakeが作成されます。



Drogon/cmake/deps/Drogon.cmakeを作成

Drogon.cmakeを作成します。

Drogon.cmake

set(DROGON_REPOSITORY_DIR "${DROGON_PROJECT_DIR}/drogon@repository/out/install/[arch]")
include_directories(${DROGON_REPOSITORY_DIR}/include)

set(Trantor_DIR ${DROGON_REPOSITORY_DIR}/lib/cmake/Trantor)
find_package(Trantor CONFIG REQUIRED)

set(Drogon_DIR ${DROGON_REPOSITORY_DIR}/lib/cmake/Drogon)
find_package(Drogon CONFIG REQUIRED)



drogon_ctl create project で Drogon/drogon@”project”を作成

今回は仕訳帳Liteというソフトを作りたいのでproject名をjournaliteとして作成します。

drogon_ctl create project drogon@journalite



Drogon/drogon@”project”/CMakeLists.txtを修正

CMakeLists.txtを修正します。

src/CMakeLists.txt

// 先ほどのDrogon.cmake置き場
list(APPEND CMAKE_MODULE_PATH ${DROGON_PROJECT_DIR}/cmake/deps)
// dorogon@~フォルダで使用するDrogonパッケージをインクルード
include(Drogon)

drogon@”project”/CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
// プロジェクト名を変更
project(journalite CXX)

// コメントアウト
# find_package(Drogon CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon)


Drogon/share/config/”project”にconfig.jsonを移動

Drogon/shasre/config/”project”にconfig.jsonを移動します。

DrogonフォルダでビルドするためDrogon/out/build/[arch]/shareにconfig.jsonが配備されるようにCMakeList.txtに設定します。

share/CmakeLists .txt

add_custom_target(_share
	COMMAND ${CMAKE_COMMAND} -E copy_directory ${DROGON_PROJECT_DIR}/share/ ${CMAKE_BINARY_DIR}/share
)


ninja _shareコマンドで配備されるようになります。


main.ccに../share/config/”project”/config.jsonをロード

最後、一番忘れてハマるポイントがおそらくこれです。コンフィグロードし忘れてるから永遠に動かない😂

main.cc

drogon::app().loadConfigFile("../share/config/journalite/config.json");

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です