Cmakeを介してVisual Studioソリューションのスタートアッププロジェクトを変更するにはどうすればよいですか?
-
25-10-2019 - |
質問
私はCmakeを使用してVisual Studioプロジェクトを生成しています。 1つのことを除いて、すべてが正常に機能します。
ソリューションのスタートアッププロジェクトは常にです ALL_BUILD
. 。 StartupプロジェクトをCmakeを介して必要なリアルプロジェクトに変更するにはどうすればよいですか?
解決
できません。スタートアッププロジェクトは、cmakeで生成されないバイナリファイルに保存されます。そのバイナリファイルがなければ、Visual Studioはソリューションファイルの最初のプロジェクトにデフォルトであり、All_Buildプロジェクトは常に最初です...
アップデート: この答えは、CMake 3.6で実行可能であるため、「時代遅れ」です。見る comicsansmsによる答え.
他のヒント
Cmakeはこれをバージョン3.6以降でサポートしています。 VS_STARTUP_PROJECT
ディレクトリプロパティ:
cmake_minimum_required(VERSION 3.6)
project(foo)
# ...
add_executable(bar ${BAR_SOURCES})
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT bar)
これは設定されます bar
のスタートアッププロジェクトとして foo.sln
解決。
Visual 2005以来、構成はファイル名ProjectName.vc(x)proj.userに保存されています。これはプレーンXMLです。
スタートアッププロジェクトを変更する方法については知りませんが、愚かなポップアップを表示する代わりに、All_Buildを設定するように設定するように設定することができます。
create_default_target_launcher(
your_desired_target_name
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/desired_path/"
# or ${CMAKE_CURRENT_BINARY_DIR}, depending on your setup
)
このモジュールはで使用できます rpavlikのgithub. 。これを最上位cmakelists.txtに追加する必要があります。
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external/rpavlik-cmake-modules-1c73e35") # or whichever path you put the module in.
include(CreateLaunchers)
利用可能な例 ここ.
あなたが私のようなperl依存関係を許可できない場合、私は電話と呼ばれるWindowsの小さなコマンドラインユーティリティを書きました slnstartupproject これを解決するために。スタートアッププロジェクトをこのように自動的に設定します。
slnStartupProject slnFilename projectName
私は個人的にそれを使用して、ソリューションを生成した後にプロジェクトを設定します cmake それは常にダミーを設定します all_build ソリューションの最初のプロジェクトとしてプロジェクト。
ソースはgithubにあります:
https://github.com/michakfromparis/slnstartupproject
フォークとフィードバックは大歓迎です。
お役に立てれば!
IDEの「スタートアッププロジェクトとしてセット」を押すときにユーザーが行う明示的な選択がバイナリファイルに保存されることは正しいことです。しかし、私はどこかで、Visual Studioがソリューションを最初に開くときに暗黙のスタートアッププロジェクトとしてソリューションの最初のプロジェクトを取っていることを発見したので、Cmakeはこれに影響を与えます。
今の問題:All_Buildは常に最初のプロジェクトです。これを変更するために、cmakeの後に短いPerlスクリプトを実行しています。これにより、ファイルから目的のプロジェクト定義をカットして前面に貼り付けます。最初のパラメーターでのソリューションファイルへのパス、2番目のプロジェクト名:
use strict;
use File::Spec;
# variables
my $slnPath = File::Spec->rel2abs($ARGV[0]);
my $projectName = $ARGV[1];
my $contents;
my $header;
my $project;
my $GUID = "[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}";
my $fh;
# read file content (error if not found)
print "Setting \"$projectName\" as Startup Project in \"$slnPath\"...\n";
die "Error: path \"$slnPath\" not found!\n" if not -f $slnPath;
open($fh, "<", $slnPath) or die "Error: cannot read $slnPath: $!";
$contents = do { local $/; <$fh> };
close($fh) or warn "close failed: $!";
# extract part before Projects definition section (the first mention of "Project([GUID])")
$header = $1 if $contents =~ s{(.*?(?=Project\("\{${GUID}\}"\)))}{}si;
# extract definition of the project specified (error if not found)
$project = $1 if $contents =~ s{(Project\("\{${GUID}\}"\) = \"${projectName}\".*?EndProject\s)}{}si;
die "Error: Project not found!\n" if not defined $project or not length $project;
# write header, project definition and remaining content back into the file
`attrib -R "$slnPath"`;
open($fh, ">", $slnPath) or die "Error: cannot write to $slnPath: $!";
print $fh $header, $project, $contents;
close($fh) or warn "close failed: $!";
print "Successfully done.\n";
ソリューションが開かれると、暗黙的な起動プロジェクトがバイナリファイルに保存され、したがって明示的になります。そのため、これはCMake Rerun(例えば、ゼロチェックでトリガーされたため、解釈後にトリガーされます)も生き残ります。同様に、ANM明示的なユーザーの選択も保持されます。
(ActiveState Perlを使用してWin7マシンで書かれてテストされています)
Cmake 3.5を使用すると、スタートアッププロジェクト(2010年のため)を変更できます
SET(CMAKE_DEFAULT_STARTUP_PROJECT myFavoriteProject)
プロジェクトの主なcmakelists.txt。デフォルトでは、all_buildに設定されています。