You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
4.9 KiB
189 lines
4.9 KiB
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;
|
|
|