189 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			189 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;
 |