スポンサーリンク

CMakeLists.txtで作成した.slnの出力先ディレクトリを変える

例えば以下のような CMakeLists.txtを用意し、

 

cmake_minimum_required(VERSION 3.16)

# プロジェクト名と使用言語
project(MyApp LANGUAGES CXX)

# C++標準(必要に応じて変更)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 実行ファイルを作成(出力名=MyApp、ソース=main.cpp)
add_executable(MyApp main.cpp)

# /MD
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Debug>:Debug>")

以下でVC++のソリューションとプロジェクトを作成する。

cmake -S . -B build

と、プロジェクトの出力先が絶対パスになる。これの何が問題かというとディレクトリごとコピーしてプロジェクト複製したときに出力先が変わらない。

別に手で直せばいい。量もたいしたことは無いので、

$(SolutionDir)$(Platform)\$(Configuration)\

とすれば良い。もし自動でやるなら、vcxprojファイルに書かれているので、xmlを編集する要領で書ける。

#include <iostream>
#include <fstream>

#include "pugixml.hpp"

void fix_outdir(const char* path)
{
    pugi::xml_document doc;
    if (!doc.load_file(path))
        return;

    // 全 OutDir を対象に書き換え
    for (auto outdir : doc.select_nodes("//OutDir"))//  //OutDir とすると、出現する全てのOutDirという意味になる
    {
        pugi::xml_node n = outdir.node();
        n.text() = "$(SolutionDir)$(Platform)\\$(Configuration)\\";
    }

    doc.save_file(path);
}


int main()
{
    std::string vcxproj_path = R"(C:\myusertemp\test\build\MyApp.vcxproj)";
    fix_outdir(vcxproj_path.c_str());

}

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: