Pregunta

Estoy usando CMake para generar proyectos de Visual Studio. Todo funciona bien excepto una cosa.

El proyecto de inicio en la solución es siempre ALL_BUILD. ¿Cómo cambio el proyecto de inicio al proyecto real que quiero a través de CMake?

¿Fue útil?

Solución

No puedes. El proyecto de inicio se almacena en un archivo binario, que CMake no genera. Sin ese archivo binario, Visual Studio valdrá el primer proyecto en el archivo de solución y el proyecto All_Build siempre es el primero ...

Actualizar: Esta respuesta está "desactualizada" ya que ahora es factible con CMake 3.6. Ver La respuesta de Comicsansm.

Otros consejos

CMake ahora admite esto con las versiones 3.6 y más a través del VS_STARTUP_PROJECT Propiedad de directorio:

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)

Esto se establecerá bar como el proyecto de inicio para el foo.sln solución.

Desde Visual 2005, la configuración se almacena en un nombre de archivo ProjectName.vc (X) Proj.user, que es XML simple.

No sé sobre una forma de cambiar el proyecto de inicio, pero ciertamente puede configurar All_Build para ejecutar el ejecutable deseado en lugar de mostrar la estúpida ventana emergente:

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
)

Este módulo está disponible en Github de Rpavlik. Simplemente necesita agregar esto en su máximo 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)

Ejemplos disponibles aquí.

Si no puede permitir una dependencia de Perl como yo, acabo de escribir una pequeña utilidad de línea de comando para Windows llamado slnstartupproject Para resolver esto. Establece el proyecto de inicio automáticamente así:

slnStartupProject slnFilename projectName

Personalmente lo uso para establecer el proyecto después de generar la solución con CMake Eso siempre establece un muñeco All_build Proyecto como el primer proyecto en la solución.

La fuente está en GitHub:

https://github.com/michakfromparis/slnstartuproject

Las horquillas y los comentarios son bienvenidos.

¡Espero que esto ayude!

Es correcto que la elección explícita que el usuario realiza al presionar "establecido como proyecto de inicio" en IDE se almacena en un archivo binario. Pero encontré en otro lugar que Visual Studio toma el primer proyecto en la solución como un proyecto de inicio implícito cuando abriendo una solución por primera vez, por lo que CMake influye en esto.

Nuestro problema ahora: All_Build es siempre el primer proyecto. Para cambiar esto, estoy ejecutando un breve script de Perl después de CMake que elimina la definición del proyecto deseada del archivo y la pasea en el frente. Ruta al archivo de solución En primer parámetro, nombre del proyecto en segundo:

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";

Una vez que se ha abierto la solución, el proyecto de inicio implícito se guarda en el archivo binario y, por lo tanto, se vuelve explícito, por lo que esto incluso sobrevive a una repetición de CMake (por ejemplo, desencadenada por cero comprobación, lo que no permite después de la ejecución). De la misma manera, la elección de usuario explícita de ANM también se conserva.

(Escrito y probado en Win7 Machine con Activestate Perl)

Con CMake 3.5, el proyecto de inicio (para VS 2010) se puede cambiar con

SET(CMAKE_DEFAULT_STARTUP_PROJECT myFavoriteProject)

En las principales cmakelists.txt del proyecto. Por defecto, está configurado en all_build.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top