Как изменить стартовый проект решения Visual Studio через CMake? - PullRequest
54 голосов
/ 05 сентября 2011

Я использую CMake для генерации проектов Visual Studio.Все отлично работает, кроме одного.

Запуск проекта в решении всегда ALL_BUILDКак изменить стартовый проект на реальный проект, который я хочу через CMake?

Ответы [ 6 ]

91 голосов
/ 23 июня 2016

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.

20 голосов
/ 05 сентября 2011

Вы не можете. Проект запуска хранится в двоичном файле, который НЕ генерируется CMake. Без этого двоичного файла Visual Studio будет по умолчанию первым проектом в файле решения, а проект ALL_BUILD всегда первым ...

Обновление: этот ответ "устарел", поскольку теперь он выполним с CMake 3.6. См. ответ ComicSansMS .

15 голосов
/ 06 октября 2012

Начиная с Visual 2005, конфигурация хранится в файле с именем имя_проекта.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's 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)

Примеры доступны здесь .

6 голосов
/ 04 октября 2014

Если вы не можете разрешить зависимость perl, как я, я просто написал небольшую утилиту командной строки для окон с именем slnStartupProject , чтобы решить эту проблему.Он устанавливает Startup Project автоматически следующим образом:

slnStartupProject slnFilename projectName

Я лично использую его для настройки проекта после генерации решения с помощью cmake , который всегда устанавливает пустышку ALL_BUILD Проект как первый проект в решении.

Источник на github:

https://github.com/michaKFromParis/slnStartupProject

Форки и отзывы приветствуются.

Надеюсь, этопомогает!

1 голос
/ 18 августа 2014

Правильно, что явный выбор, который пользователь делает при нажатии «Установить как стартовый проект» в IDE, сохраняется в двоичном файле. Но в другом месте я обнаружил, что Visual Studio воспринимает первый проект в решении как неявный стартовый проект при первом открытии решения, поэтому CMake действительно влияет на это.

Наша проблема сейчас: ALL_BUILD - это всегда первый проект. Чтобы изменить это, я запускаю короткий сценарий Perl после CMake, который вырезает из файла желаемое определение проекта и вставляет его в начало. Путь к файлу решения в первом параметре, имя проекта во втором:

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 (например, запускается ZERO-CHECK, который не допускает пост-выполнения). Таким же образом, явный выбор пользователя также сохраняется.

(Написано и протестировано на машине Win7 с ActiveState Perl)

0 голосов
/ 15 сентября 2016

С помощью cmake 3.5 стартовый проект (для VS 2010) можно изменить с помощью

SET(CMAKE_DEFAULT_STARTUP_PROJECT myFavoriteProject)

в основном CMakeLists.txt проекта.По умолчанию установлено значение ALL_BUILD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...