259d87c354
These scripts generate projects for the MSVC IDE (.vcproj files) or QMake (.pro files), based on the output of a 'make -n MSVC=1 V=1' run. This enables us to simply do the necesarry changes in the Makefile, and you can update the other buildsystems by regenerating the files. Keeping the other buildsystems up-to-date with main development. The generator system is designed to easily drop in pm's for other buildsystems as well, if someone has an itch. However, the focus has been Windows development, so the 'engine' might need patches to support any platform. Also add some .gitignore entries for MSVC files. Signed-off-by: Marius Storm-Olsen <mstormo@gmail.com> Acked-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
190 lines
4.9 KiB
Perl
190 lines
4.9 KiB
Perl
package Generators::QMake;
|
|
require Exporter;
|
|
|
|
use strict;
|
|
use vars qw($VERSION);
|
|
|
|
our $VERSION = '1.00';
|
|
our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
|
|
@ISA = qw(Exporter);
|
|
|
|
BEGIN {
|
|
push @EXPORT_OK, qw(generate);
|
|
}
|
|
|
|
sub generate {
|
|
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
|
|
|
my @libs = @{$build_structure{"LIBS"}};
|
|
foreach (@libs) {
|
|
createLibProject($_, $git_dir, $out_dir, $rel_dir, %build_structure);
|
|
}
|
|
|
|
my @apps = @{$build_structure{"APPS"}};
|
|
foreach (@apps) {
|
|
createAppProject($_, $git_dir, $out_dir, $rel_dir, %build_structure);
|
|
}
|
|
|
|
createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
|
|
return 0;
|
|
}
|
|
|
|
sub createLibProject {
|
|
my ($libname, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
|
print "Generate $libname lib project\n";
|
|
$rel_dir = "../$rel_dir";
|
|
|
|
my $sources = join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"LIBS_${libname}_SOURCES"}})));
|
|
my $defines = join(" \\\n\t", sort(@{$build_structure{"LIBS_${libname}_DEFINES"}}));
|
|
my $includes= join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"LIBS_${libname}_INCLUDES"}})));
|
|
my $cflags = join(" ", sort(@{$build_structure{"LIBS_${libname}_CFLAGS"}}));
|
|
|
|
my $cflags_debug = $cflags;
|
|
$cflags_debug =~ s/-MT/-MTd/;
|
|
$cflags_debug =~ s/-O.//;
|
|
|
|
my $cflags_release = $cflags;
|
|
$cflags_release =~ s/-MTd/-MT/;
|
|
|
|
my @tmp = @{$build_structure{"LIBS_${libname}_LFLAGS"}};
|
|
my @tmp2 = ();
|
|
foreach (@tmp) {
|
|
if (/^-LTCG/) {
|
|
} elsif (/^-L/) {
|
|
$_ =~ s/^-L/-LIBPATH:$rel_dir\//;
|
|
}
|
|
push(@tmp2, $_);
|
|
}
|
|
my $lflags = join(" ", sort(@tmp));
|
|
|
|
my $target = $libname;
|
|
$target =~ s/\//_/g;
|
|
$defines =~ s/-D//g;
|
|
$defines =~ s/"/\\\\"/g;
|
|
$includes =~ s/-I//g;
|
|
mkdir "$target" || die "Could not create the directory $target for lib project!\n";
|
|
open F, ">$target/$target.pro" || die "Could not open $target/$target.pro for writing!\n";
|
|
print F << "EOM";
|
|
TEMPLATE = lib
|
|
TARGET = $target
|
|
DESTDIR = $rel_dir
|
|
|
|
CONFIG -= qt
|
|
CONFIG += static
|
|
|
|
QMAKE_CFLAGS =
|
|
QMAKE_CFLAGS_RELEASE = $cflags_release
|
|
QMAKE_CFLAGS_DEBUG = $cflags_debug
|
|
QMAKE_LIBFLAGS = $lflags
|
|
|
|
DEFINES += \\
|
|
$defines
|
|
|
|
INCLUDEPATH += \\
|
|
$includes
|
|
|
|
SOURCES += \\
|
|
$sources
|
|
EOM
|
|
close F;
|
|
}
|
|
|
|
sub createAppProject {
|
|
my ($appname, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
|
print "Generate $appname app project\n";
|
|
$rel_dir = "../$rel_dir";
|
|
|
|
my $sources = join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"APPS_${appname}_SOURCES"}})));
|
|
my $defines = join(" \\\n\t", sort(@{$build_structure{"APPS_${appname}_DEFINES"}}));
|
|
my $includes= join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"APPS_${appname}_INCLUDES"}})));
|
|
my $cflags = join(" ", sort(@{$build_structure{"APPS_${appname}_CFLAGS"}}));
|
|
|
|
my $cflags_debug = $cflags;
|
|
$cflags_debug =~ s/-MT/-MTd/;
|
|
$cflags_debug =~ s/-O.//;
|
|
|
|
my $cflags_release = $cflags;
|
|
$cflags_release =~ s/-MTd/-MT/;
|
|
|
|
my $libs;
|
|
foreach (sort(@{$build_structure{"APPS_${appname}_LIBS"}})) {
|
|
$_ =~ s/\//_/g;
|
|
$libs .= " $_";
|
|
}
|
|
my @tmp = @{$build_structure{"APPS_${appname}_LFLAGS"}};
|
|
my @tmp2 = ();
|
|
foreach (@tmp) {
|
|
# next if ($_ eq "-NODEFAULTLIB:MSVCRT.lib");
|
|
if (/^-LTCG/) {
|
|
} elsif (/^-L/) {
|
|
$_ =~ s/^-L/-LIBPATH:$rel_dir\//;
|
|
}
|
|
push(@tmp2, $_);
|
|
}
|
|
my $lflags = join(" ", sort(@tmp));
|
|
|
|
my $target = $appname;
|
|
$target =~ s/\.exe//;
|
|
$target =~ s/\//_/g;
|
|
$defines =~ s/-D//g;
|
|
$defines =~ s/"/\\\\"/g;
|
|
$includes =~ s/-I//g;
|
|
mkdir "$target" || die "Could not create the directory $target for app project!\n";
|
|
open F, ">$target/$target.pro" || die "Could not open $target/$target.pro for writing!\n";
|
|
print F << "EOM";
|
|
TEMPLATE = app
|
|
TARGET = $target
|
|
DESTDIR = $rel_dir
|
|
|
|
CONFIG -= qt embed_manifest_exe
|
|
CONFIG += console
|
|
|
|
QMAKE_CFLAGS =
|
|
QMAKE_CFLAGS_RELEASE = $cflags_release
|
|
QMAKE_CFLAGS_DEBUG = $cflags_debug
|
|
QMAKE_LFLAGS = $lflags
|
|
LIBS = $libs
|
|
|
|
DEFINES += \\
|
|
$defines
|
|
|
|
INCLUDEPATH += \\
|
|
$includes
|
|
|
|
win32:QMAKE_LFLAGS += -LIBPATH:$rel_dir
|
|
else: QMAKE_LFLAGS += -L$rel_dir
|
|
|
|
SOURCES += \\
|
|
$sources
|
|
EOM
|
|
close F;
|
|
}
|
|
|
|
sub createGlueProject {
|
|
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
|
my $libs = join(" \\ \n", map("\t$_|$_.pro", @{$build_structure{"LIBS"}}));
|
|
my $apps = join(" \\ \n", map("\t$_|$_.pro", @{$build_structure{"APPS"}}));
|
|
$libs =~ s/\.a//g;
|
|
$libs =~ s/\//_/g;
|
|
$libs =~ s/\|/\//g;
|
|
$apps =~ s/\.exe//g;
|
|
$apps =~ s/\//_/g;
|
|
$apps =~ s/\|/\//g;
|
|
|
|
my $filename = $out_dir;
|
|
$filename =~ s/.*\/([^\/]+)$/$1/;
|
|
$filename =~ s/\/$//;
|
|
print "Generate glue project $filename.pro\n";
|
|
open F, ">$filename.pro" || die "Could not open $filename.pro for writing!\n";
|
|
print F << "EOM";
|
|
TEMPLATE = subdirs
|
|
CONFIG += ordered
|
|
SUBDIRS += \\
|
|
$libs \\
|
|
$apps
|
|
EOM
|
|
close F;
|
|
}
|
|
|
|
1;
|