Eclipse setup.pl
From MythTV Official Wiki
This script creates the necessary Ecplise files to open mythtv sources with Eclipse on Windows. For an unknown reason, import fails.
#!c:/perl/bin/perl.exe -w ############################################################################## ### =file ### Eclipse_setup.pl ### ### =location ### ### ### =description ### Tool for automating Eclipse projects for mythtv on MS Windows XP (and compatible) ### Meant as a temporary solution until incorporated into win32-packager.pl ### ### =examples ### Eclipse_setup.pl -h ### Print usage ### win32-packager.pl -p <path> ### Setup project environment in path. Assumes mythtv, mythplugins and myththemes are underneath ### ### =revision ### $Id$ ### ### =author ### Arnon Meshoulam ############################################################################## use strict; use File::Find; use Getopt::Std; use IO::File; $| = 1; # autoflush stdout; my $install_root = "c:/mythtv"; # default installation path my $msys = "c:/msys/1.0"; my $qt_path = $ENV{'QTDIR'}; # default QT PATH my $qt_path_double = perl2double($qt_path); my $unix_qt_path = perl2unix($qt_path); my @components = ( 'mythtv', 'myththemes', 'mythplugins' ); my @eclipse_files = ( '.project', '.cproject'); my @eclipse_dirs = ('.externalToolBuilders', '.metadata', '.settings'); my @cproject_content; ############################################################################## # get command line options my $opt_string = 'hp:'; my %opt = (); getopts( "$opt_string", \%opt ); usage() if $opt{h}; if (defined $opt{p}) { $install_root = $opt{p}; } #Check that sub-dirs exist and that we are not overwritting an existing project foreach my $comp( @components ) { if (! -d $install_root.'/'.$comp ) { die "Expected directory $install_root/$comp not found "; } foreach my $files (@eclipse_files) { if (-f $install_root.'/'.$comp.'/'.$files ) { die "Existing Eclipse project files found: $install_root/$comp/$files"; } } foreach my $dirs (@eclipse_dirs) { if (-d $install_root.'/'.$comp.'/'.$dirs) { die "Existing Ecplise project directory found: $install_root/$comp/$dirs "; } } } die "Please set QTDIR to point to QT Directory and run this script again" if ($qt_path eq ""); die "Could not find directory $qt_path" if !(-d perl2dos($qt_path)); die "Could not find msys directory: $msys" if !(-d perl2dos($msys)); # Create Root .metadata mkdirs($install_root.'/'.'.metadata'); mkdirs($install_root.'/'.'.metadata/.plugins'); mkdirs($install_root.'/'.'.metadata/.plugins/org.eclipse.core.runtime/.settings'); writefile($install_root.'/'.'.metadata/.plugins/org.eclipse.core.runtime/.settings/com.trolltech.qtcppproject.prefs', ' eclipse.preferences.version=1 com.trolltech.qtcppproject.qtversionname.0=QT 4.4.0 com.trolltech.qtcppproject.qtautosetmkspec=true com.trolltech.qtcppproject.qtversiondefault=QT 4.4.0 com.trolltech.qtcppproject.qtversioncount=1 com.trolltech.qtcppproject.qtautosetmkcmd=true com.trolltech.qtcppproject.qtversionincludepath.0='.$qt_path_double.'\\\\include com.trolltech.qtcppproject.qtversionbinpath.0='.$qt_path_double.'\\\\bin '); writefile($install_root.'/'.'.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs', ' version=1 eclipse.preferences.version=1 description.autobuilding=false'); foreach my $comp( @components ) { @cproject_content = ""; writefile($install_root.'/'.$comp.'/'.'.project', '<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>mythtv</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>com.trolltech.qtcppproject.QtMakefileGenerator</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.cdt.make.core.makeBuilder</name> <triggers>clean,full,incremental,</triggers> <arguments> <dictionary> <key>org.eclipse.cdt.make.core.build.arguments</key> <value></value> </dictionary> <dictionary> <key>org.eclipse.cdt.core.errorOutputParser</key> <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.environment</key> <value>QMAKESPEC=win32-g++|TARGET_OS=COMSPEC|INSTALL_ROOT=|PATH='.$qt_path.'\bin;${env_var:PATH}|</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.enableAutoBuild</key> <value>false</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.enableFullBuild</key> <value>true</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key> <value>true</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.build.location</key> <value></value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.build.command</key> <value>mingw32-make</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.build.target.clean</key> <value></value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.enableCleanBuild</key> <value>true</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.append_environment</key> <value>true</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> <value>false</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.build.target.auto</key> <value>debug</value> </dictionary> <dictionary> <key>org.eclipse.cdt.make.core.stopOnError</key> <value>false</value> </dictionary> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.cdt.core.cnature</nature> <nature>org.eclipse.cdt.core.ccnature</nature> <nature>org.eclipse.cdt.make.core.makeNature</nature> <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature> <nature>com.trolltech.qtcppproject.QtNature</nature> </natures> </projectDescription> '); push @cproject_content, " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <?fileVersion 4.0.0?> <cproject> <storageModule moduleId=\"org.eclipse.cdt.core.settings\"> <cconfiguration id=\"org.eclipse.cdt.core.default.config.1395462625\"> <storageModule buildSystemId=\"org.eclipse.cdt.core.defaultConfigDataProvider\" id=\"org.eclipse.cdt.core.default.config.354312420\" moduleId=\"org.eclipse.cdt.core.settings\" name=\"Configuration\"> <externalSettings/> <extensions/> </storageModule> <storageModule moduleId=\"org.eclipse.cdt.core.pathentry\"/> <pathentry kind=\"src\" path=\"\"/> <pathentry kind=\"out\" path=\"\"/> </storagemodule> <storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/> <storageModule moduleId=\"scannerConfiguration\"> <autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\"/> <profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"specsFile\"> <runAction arguments=\"-E -P -v -dD \${plugin_state_location}/\${specs_file}\" command=\"gcc\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> <profile id=\"org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"makefileGenerator\"> <runAction arguments=\"-f \${project_name}_scd.mk\" command=\"make\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> <profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"specsFile\"> <runAction arguments=\"-E -P -v -dD \${plugin_state_location}/\${specs_file}\" command=\"gcc\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> <profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"specsFile\"> <runAction arguments=\"-E -P -v -dD \${plugin_state_location}/specs.cpp\" command=\"g++\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> <profile id=\"org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"specsFile\"> <runAction arguments=\"-E -P -v -dD \${plugin_state_location}/specs.c\" command=\"gcc\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> <profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"specsFile\"> <runAction arguments=\"-E -P -v -dD \${plugin_state_location}/\${specs_file}\" command=\"gcc\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> <profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"specsFile\"> <runAction arguments=\"-E -P -v -dD \${plugin_state_location}/specs.cpp\" command=\"g++\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> <profile id=\"org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC\"> <buildOutputProvider> <openAction enabled=\"true\" filePath=\"\"/> <parser enabled=\"true\"/> </buildOutputProvider> <scannerInfoProvider id=\"specsFile\"> <runAction arguments=\"-E -P -v -dD \${plugin_state_location}/specs.c\" command=\"gcc\" useDefault=\"true\"/> <parser enabled=\"true\"/> </scannerInfoProvider> </profile> </storageModule> <storageModule moduleId=\"org.eclipse.cdt.core.language.mapping\"/>"; push @cproject_content, " <storageModule moduleId=\"org.eclipse.cdt.make.core.buildtargets\"> <buildTargets> "; # for each directory in project, find .pro file and create the pattern find(\&TargetMakes, $install_root.'/'.$comp); push @cproject_content, "</buildTargets> </storageModule> </cconfiguration> </storageModule> </cproject> "; writefile($install_root.'/'.$comp.'/'.'.cproject', @cproject_content); mkdirs($install_root.'/'.$comp.'/'.'.externalToolBuilders'); mkdirs($install_root.'/'.$comp.'/'.'.metadata'); mkdirs($install_root.'/'.$comp.'/'.'.metadata/.plugins'); writefile($install_root.'/'.$comp.'/'.'.metadata/version.ini', 'org.eclipse.core.runtime=1'); mkdirs($install_root.'/'.$comp.'/'.'.settings'); } sub TargetMakes { my ($name, $ext) = split /./, $_; my ($rel_path) = $File::Find::dir; $File::Find::prune=1; push @cproject_content, "<target name=\"$name\" path=\"$name\" targetID=\"org.eclipse.cdt.make.MakeTargetBuilder\"> <buildCommand>mingw32-make</buildCommand> <buildArguments></buildArguments> <buildTarget></buildTarget> <stopOnError>false</stopOnError> <useDefaultCommand>false</useDefaultCommand> <runAllBuilders>false</runAllBuilders> </target>"; push @cproject_content, "<target name=\"Install\" path=\"$rel_path\" targetID=\"org.eclipse.cdt.make.MakeTargetBuilder\"> <buildCommand>mingw32-make</buildCommand> <buildArguments></buildArguments> <buildTarget>install</buildTarget> <stopOnError>false</stopOnError> <useDefaultCommand>false</useDefaultCommand> <runAllBuilders>false</runAllBuilders> </target>"; } # creates a directory with name given. Always creates off $install_root. sub writedir { my ($dirname) = @_; mkdirs($install_root.'/'.$dirname); } sub mkdirs { my $path = shift; die "backslash in foldername not allowed in mkdirs function:($path)\n" if $path =~ m#\\#; $path = perl2dos($path); print "mkdir $path\n"; # reduce path to just windows, # incase we have a rogue unix mkdir command elsewhere! print `set PATH=C:\\WINDOWS\\system32;c:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem && mkdir $path`; } #creates a file with the name and contents given sub writefile { my ( $filename, @contents) = @_; my $fh = new IO::File ("> $filename") || die "error opening $filename for writing: $!\n"; $fh->binmode(); $fh->print(join('',@contents)); print "Creating $filename\n"; $fh->close(); } #------------------------------------------------------------------------------ # DOS executable CMD.exe versions of the paths (for when we [exec] to DOS mode): sub perl2dos { my $p = shift; $p =~ s#/#\\#g; # single forward to single backward return $p; } #------------------------------------------------------------------------------ # DOS executable CMD.exe versions of the paths (for when we [exec] to DOS mode): sub perl2double { my $p = shift; $p =~ s#/#\\\\#g; # single forward to double backward $p =~ s#\\#\\\\#g; # single forward to double backward $p =~ s#:#\\:#g; # colon to escaped colon return $p; } #------------------------------------------------------------------------------ # unix compatible versions of the perl paths (for when we [shell] to unix/bash mode): sub perl2unix { my $p = shift; print "perl2unix: $p\n"; $p =~ s#$msys#/#i; # remove superfluous msys folders if they are there $p =~ s#^([CD]):#/$1#ig; #change c:/ into /c (or a D:) so c:/msys becomes /c/msys etc. $p =~ s#//#/#ig; # reduce any double forward slashes to single ones. return $p; } sub usage { print << 'END_USAGE'; -h This message END_USAGE exit; } #------------------------------------------------------------------------------