#!/usr/bin/perl -w
use strict;

# Copyright 2000-2004 Francois Gouget for CodeWeavers
# Copyright 2004 Dimitrie O. Paun
# Copyright 2009-2011 André Hentschel
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
#

my $version="0.8.1";

use Cwd;
use File::Basename;
use File::Copy;



#####
#
# Options
#
#####

# The following constants define what we do with the case of filenames

##
# Never rename a file to lowercase
my $OPT_LOWER_NONE=0;

##
# Rename all files to lowercase
my $OPT_LOWER_ALL=1;

##
# Rename only files that are all uppercase to lowercase
my $OPT_LOWER_UPPERCASE=2;


# The following constants define whether to ask questions or not

##
# No (synonym of never)
my $OPT_ASK_NO=0;

##
# Yes (always)
my $OPT_ASK_YES=1;

##
# Skip the questions till the end of this scope
my $OPT_ASK_SKIP=-1;


# The following constants define the architecture

##
# Default Architecture will be chosen
my $OPT_ARCH_DEFAULT=0;

##
# 32-Bit Target
my $OPT_ARCH_32=32;

##
# 64-Bit Target
my $OPT_ARCH_64=64;


# General options

##
# This is the directory in which winemaker will operate.
my $opt_work_dir;

##
# This is the file in which winemaker will operate if a project file is specified.
my $opt_work_file;

##
# Make a backup of the files
my $opt_backup;

##
# Defines which files to rename
my $opt_lower;

##
# If we don't find the file referenced by an include, lower it
my $opt_lower_include;

##
# If true then winemaker should not attempt to fix the source.  This is
# useful if the source is known to be already in a suitable form and is
# readonly
my $opt_no_source_fix;

# Options for the 'Source' method

##
# Specifies that we have only one target so that all sources relate
# to this target. By default this variable is left undefined which
# means winemaker should try to find out by itself what the targets
# are. If not undefined then this contains the name of the default
# target (without the extension).
my $opt_single_target;

##
# If '$opt_single_target' has been specified then this is the type of
# that target. Otherwise it specifies whether the default target type
# is guiexe or cuiexe.
my $opt_target_type;

##
# Contains the default set of flags to be used when creating a new target.
my $opt_flags;

##
# Contains 32 for 32-Bit-Targets and 64 for 64-Bit-Targets
my $opt_arch;

##
# If true then winemaker should ask questions to the user as it goes
# along.
my $opt_is_interactive;
my $opt_ask_project_options;
my $opt_ask_target_options;

##
# If false then winemaker should not generate the makefiles.
my $opt_no_generated_files;

##
# Specifies not to print the banner if set.
my $opt_no_banner;



#####
#
# Target modelization
#
#####

# The description of a target is stored in an array. The constants
# below identify what is stored at each index of the array.

##
# This is the name of the target.
my $T_NAME=0;

##
# Defines the type of target we want to build. See the TT_xxx
# constants below
my $T_TYPE=1;

##
# This is a bitfield containing flags refining the way the target
# should be handled. See the TF_xxx constants below
my $T_FLAGS=2;

##
# This is a reference to an array containing the list of the
# resp. C, C++, RC, other (.h, .hxx, etc.) source files.
my $T_SOURCES_C=3;
my $T_SOURCES_CXX=4;
my $T_SOURCES_RC=5;
my $T_SOURCES_MISC=6;

##
# This is a reference to an array containing the list of
# C compiler options
my $T_CEXTRA=7;

##
# This is a reference to an array containing the list of
# C++ compiler options
my $T_CXXEXTRA=8;

##
# This is a reference to an array containing the list of
# RC compiler options
my $T_RCEXTRA=9;

##
# This is a reference to an array containing the list of macro
# definitions
my $T_DEFINES=10;

##
# This is a reference to an array containing the list of directory
# names that constitute the include path
my $T_INCLUDE_PATH=11;

##
# Flags for the linker
my $T_LDFLAGS=12;

##
# Flags for the archiver
my $T_ARFLAGS=13;

##
# Same as T_INCLUDE_PATH but for the dll search path
my $T_DLL_PATH=14;

##
# The list of Windows dlls to import
my $T_DLLS=15;

##
# Same as T_INCLUDE_PATH but for the library search path
my $T_LIBRARY_PATH=16;

##
# The list of Unix libraries to link with
my $T_LIBRARIES=17;


# The following constants define the recognized types of target

##
# This is not a real target. This type of target is used to collect
# the sources that don't seem to belong to any other target. Thus no
# real target is generated for them, we just put the sources of the
# fake target in the global source list.
my $TT_SETTINGS=0;

##
# For executables in the windows subsystem
my $TT_GUIEXE=1;

##
# For executables in the console subsystem
my $TT_CUIEXE=2;

##
# For dynamically linked libraries
my $TT_DLL=3;

##
# For static libraries
my $TT_LIB=4;


# The following constants further refine how the target should be handled

##
# This target is an MFC-based target
my $TF_MFC=4;

##
# User has specified --nomfc option for this target or globally
my $TF_NOMFC=8;

##
# --nodlls option: Do not use standard DLL set
my $TF_NODLLS=16;

##
# --nomsvcrt option: Do not link with msvcrt
my $TF_NOMSVCRT=32;

##
# This target has a def file (only use it with TT_DLL)
my $TF_HASDEF=64;

##
# Initialize a target:
# - set the target type to TT_SETTINGS, i.e. no real target will
#   be generated.
sub target_init($)
{
  my $target=$_[0];

  @$target[$T_TYPE]=$TT_SETTINGS;
  @$target[$T_FLAGS]=$opt_flags;
  @$target[$T_SOURCES_C]=[];
  @$target[$T_SOURCES_CXX]=[];
  @$target[$T_SOURCES_RC]=[];
  @$target[$T_SOURCES_MISC]=[];
  @$target[$T_CEXTRA]=[];
  @$target[$T_CXXEXTRA]=[];
  @$target[$T_RCEXTRA]=[];
  @$target[$T_DEFINES]=[];
  @$target[$T_INCLUDE_PATH]=[];
  @$target[$T_LDFLAGS]=[];
  @$target[$T_ARFLAGS]=[];
  @$target[$T_DLL_PATH]=[];
  @$target[$T_DLLS]=[];
  @$target[$T_LIBRARY_PATH]=[];
  @$target[$T_LIBRARIES]=[];
}



#####
#
# Project modelization
#
#####

# First we have the notion of project. A project is described by an
# array (since we don't have structs in perl). The constants below
# identify what is stored at each index of the array.

##
# This is the path in which this project is located. In other
# words, this is the path to the Makefile.
my $P_PATH=0;

##
# This index contains a reference to an array containing the project-wide
# settings. The structure of that arrray is actually identical to that of
# a regular target since it can also contain extra sources.
my $P_SETTINGS=1;

##
# This index contains a reference to an array of targets for this
# project. Each target describes how an executable or library is to
# be built. For each target this description takes the same form as
# that of the project: an array. So this entry is an array of arrays.
my $P_TARGETS=2;

##
# Initialize a project:
# - set the project's path
# - initialize the target list
# - create a default target (will be removed later if unnecessary)
sub project_init($$$)
{
  my ($project, $path, $global_settings)=@_;

  my $project_settings=[];
  target_init($project_settings);
  @$project_settings[$T_DEFINES]=[@{@$global_settings[$T_DEFINES]}];
  @$project_settings[$T_INCLUDE_PATH]=[@{@$global_settings[$T_INCLUDE_PATH]}];
  @$project_settings[$T_DLL_PATH]=[@{@$global_settings[$T_DLL_PATH]}];
  @$project_settings[$T_DLLS]=[@{@$global_settings[$T_DLLS]}];
  @$project_settings[$T_LIBRARY_PATH]=[@{@$global_settings[$T_LIBRARY_PATH]}];
  @$project_settings[$T_LIBRARIES]=[@{@$global_settings[$T_LIBRARIES]}];

  @$project[$P_PATH]=$path;
  @$project[$P_SETTINGS]=$project_settings;
  @$project[$P_TARGETS]=[];
}



#####
#
# Global variables
#
#####

my %warnings;

my %templates;

##
# This maps a directory name to a reference to an array listing
# its contents (files and directories)
my %directories;

##
# Contains the list of all projects. This list tells us what are
# the subprojects of the main Makefile and where we have to generate
# Makefiles.
my @projects=();

##
# This is the main project, i.e. the one in the "." directory.
# It may well be empty in which case the main Makefile will only
# call out subprojects.
my @main_project;

##
# Contains the defaults for the include path, etc.
# We store the defaults as if this were a target except that we only
# exploit the defines, include path, library path, library list and misc
# sources fields.
my @global_settings;



#####
#
# Utility functions
#
#####

##
# Cleans up a name to make it an acceptable Makefile
# variable name.
sub canonize($)
{
  my $name=$_[0];

  $name =~ tr/a-zA-Z0-9_/_/c;
  return $name;
}

##
# Returns true is the specified pathname is absolute.
# Note: pathnames that start with a variable '$' or
# '~' are considered absolute.
sub is_absolute($)
{
  my $path=$_[0];

  return ($path =~ /^[\/~\$]/);
}

##
# Retrieves the contents of the specified directory.
# We either get it from the directories hashtable which acts as a
# cache, or use opendir, readdir, closedir and store the result
# in the hashtable.
sub get_directory_contents($)
{
  my $dirname=$_[0];
  my $directory;

  #print "getting the contents of $dirname\n";

  # check for a cached version
  $dirname =~ s+/$++;
  if ($dirname eq "") {
    $dirname=cwd;
  }
  $directory=$directories{$dirname};
  if (defined $directory) {
    #print "->@$directory\n";
    return $directory;
  }

  # Read this directory
  if (opendir(DIRECTORY, "$dirname")) {
    my @files=readdir DIRECTORY;
    closedir(DIRECTORY);
    $directory=\@files;
  } else {
    # Return an empty list
    #print "error: cannot open $dirname\n";
    my @files;
    $directory=\@files;
  }
  #print "->@$directory\n";
  $directories{$dirname}=$directory;
  return $directory;
}

##
# Removes a directory from the cache.
# This is needed if one of its files or subdirectory has been renamed.
sub clear_directory_cache($)
{
    my ($dirname)=@_;
    delete $directories{$dirname};
}


#####
#
# 'Source'-based Project analysis
#
#####

##
# Allows the user to specify makefile and target specific options
# - target: the structure in which to store the results
# - options: the string containing the options
sub source_set_options($$)
{
  my $target=$_[0];
  my $options=$_[1];

  #FIXME: we must deal with escaping of stuff and all
  foreach my $option (split / /,$options) {
    if (@$target[$T_TYPE] == $TT_SETTINGS and $option =~ /^-D/) {
      push @{@$target[$T_DEFINES]},$option;
    } elsif (@$target[$T_TYPE] == $TT_SETTINGS and $option =~ /^-I/) {
      push @{@$target[$T_INCLUDE_PATH]},$option;
    } elsif ($option =~ /^-P/) {
      push @{@$target[$T_DLL_PATH]},"-L$'";
    } elsif ($option =~ /^-i/) {
      push @{@$target[$T_DLLS]},"$'";
    } elsif ($option =~ /^-L/) {
      push @{@$target[$T_LIBRARY_PATH]},$option;
    } elsif ($option =~ /^-l/) {
      push @{@$target[$T_LIBRARIES]},"$'";
    } elsif ($option =~ /^--mfc/) {
      @$target[$T_FLAGS]|=$TF_MFC;
      @$target[$T_FLAGS]&=~$TF_NOMFC;
    } elsif ($option =~ /^--nomfc/) {
      @$target[$T_FLAGS]&=~$TF_MFC;
      @$target[$T_FLAGS]|=$TF_NOMFC;
    } elsif ($option =~ /^--nodlls/) {
      @$target[$T_FLAGS]|=$TF_NODLLS;
    } elsif ($option =~ /^--nomsvcrt/) {
      @$target[$T_FLAGS]|=$TF_NOMSVCRT;
    } else {
      print STDERR "error: unknown option \"$option\"\n";
      return 0;
    }
  }
  return 1;
}

##
# Scans the specified project file to:
# - get a list of targets for this project
# - get some settings
# - get the list of source files
sub source_scan_project_file($$$);
sub source_scan_project_file($$$)
{
    # a reference to the parent's project
    my $parent_project=$_[0];
    # 0 if it is a single project, 1 if it is part of a workspace
    my $is_sub_project=$_[1];
    # the name of the project file, with complete path, or without if in
    # the same directory
    my $filename=$_[2];

    # reference to the project for this file. May not be used
    my $project;
    # list of sources found in the current file
    my @sources_c=();
    my @sources_cxx=();
    my @sources_rc=();
    my @sources_misc=();
    # some more settings
    my $path=dirname($filename);
    my $prj_target_cflags;
    my $prj_target_defines;
    my $prj_target_ldflags;
    my $prj_target_libs;
    my $prj_name;
    my $found_cfg=0;
    my $prj_cfg;
    my $prj_target_type=$TT_GUIEXE;
    my @prj_target_options;

    if (!($path=~/\/$/)) {
        $path.="/";
    }

    if (defined $opt_single_target or $is_sub_project == 0) {
        # Either there is a single target and thus a single project,
        # or we are a single project-file for which a project
        # already exists
        $project=$parent_project;
    } else {
        $project=[];
        project_init($project, $path, \@global_settings);
    }
    my $project_settings=@$project[$P_SETTINGS];

    if ($filename =~ /.dsp$/i) {
        # First find out what this project file contains:
        # collect all sources, find targets and settings
        if (!open(FILEI,$filename)) {
            print STDERR "error: unable to open $filename for reading:\n";
            print STDERR "       $!\n";
            return;
        }
        my $sfilet;
        while (<FILEI>) {
            # Remove any trailing CtrlZ, which isn't strictly in the file
            if (/\x1A/) {
                s/\x1A//;
                last if (/^$/)
            }

            # Remove any trailing CrLf
            s/\r\n$/\n/;
            if (!/\n$/) {
                # Make sure all lines are '\n' terminated
                $_ .= "\n";
            }

            if (/^\# Microsoft Developer Studio Project File - Name=\"([^\"]+)/) {
                $prj_name="$1";
                $prj_name=~s/\s+/_/g;
                #print $prj_name;
                next;
            } elsif (/^# TARGTYPE/) {
                if (/[[:space:]]0+x0*101$/) {
                    # Application
                    $prj_target_type=$TT_GUIEXE;
                }elsif (/[[:space:]]0+x0*102$/) {
                    # Dynamic-Link Library
                    $prj_target_type=$TT_DLL;
                }elsif (/[[:space:]]0+x0*103$/) {
                    # Console Application
                    $prj_target_type=$TT_CUIEXE;
                }elsif (/[[:space:]]0+x0*104$/) {
                    # Static Library
                    $prj_target_type=$TT_LIB;
                }
                next;
            } elsif (/^# ADD CPP(.*)/ && $found_cfg==1) {
                $prj_target_cflags=$1;
                @prj_target_options=split(/\s+\//, $prj_target_cflags);
                $prj_target_cflags="";
                foreach ( @prj_target_options ) {
                    if ($_ eq "") {
                        # empty
                    } elsif (/nologo/) {
                        # Suppress Startup Banner and Information Messages
                    } elsif (/^W0$/) {
                        # Turns off all warning messages
                        $prj_target_cflags.="-w ";
                    } elsif (/^W[123]$/) {
                        # Warning Level
                        $prj_target_cflags.="-W ";
                    } elsif (/^W4$/) {
                        # Warning Level
                        $prj_target_cflags.="-Wall ";
                    } elsif (/^WX$/) {
                        # Warnings As Errors
                        $prj_target_cflags.="-Werror ";
                    } elsif (/^Gm$/) {
                        # Enable Minimal Rebuild
                    } elsif (/^GX$/) {
                        # Enable Exception Handling
                        $prj_target_cflags.="-fexceptions ";
                    } elsif (/^Gd$/) {
                        # use cdecl calling convention (default)
                    } elsif (/^Gr$/) {
                        # use fastcall calling convention
                    } elsif (/^Gz$/) {
                        # use stdcall calling convention
                        $prj_target_cflags.="-mrtd ";
                    } elsif (/^Z[d7iI]$/) {
                        # Debug Info
                        $prj_target_cflags.="-g ";
                    } elsif (/^Od$/) {
                        # Disable Optimizations
                        $prj_target_cflags.="-O0 ";
                    } elsif (/^O1$/) {
                        # Minimize Size
                        $prj_target_cflags.="-Os ";
                    } elsif (/^O2$/) {
                        # Maximize Speed
                        $prj_target_cflags.="-O2 ";
                    } elsif (/^Ob0$/) {
                        # Disables inline Expansion
                        $prj_target_cflags.="-fno-inline ";
                    } elsif (/^Ob1$/) {
                        #In-line Function Expansion
                        $prj_target_cflags.="-finline-functions ";
                    } elsif (/^Ob2$/) {
                        # auto In-line Function Expansion
                        $prj_target_cflags.="-finline-functions ";
                    } elsif (/^Ox$/) {
                        # Use maximum optimization
                        $prj_target_cflags.="-O3 ";
                    } elsif (/^Oy$/) {
                        # Frame-Pointer Omission
                        $prj_target_cflags.="-fomit-frame-pointer ";
                    } elsif (/^Oy-$/) {
                        # Frame-Pointer Omission
                        $prj_target_cflags.="-fno-omit-frame-pointer ";
                    } elsif (/^GZ$/) {
                        # Catch Release-Build Errors in Debug Build
                    } elsif (/^M[DLT]d?$/) {
                        # Use Multithreaded Run-Time Library
                    } elsif (/^D\s*\"(.*)\"/) {
                        # Preprocessor Definitions
                        $prj_target_defines.="-D".$1." ";
                    } elsif (/^I\s*\"(.*)\"/) {
                        # Additional Include Directories
                        $sfilet=$1;
                        $sfilet=~s/\\/\//g;
                        if ($sfilet=~/^\w:/) {
                            print STDERR "warning: Can't fix path $sfilet\n"
                        } else {
                            push @{@$project_settings[$T_INCLUDE_PATH]},"-I".$sfilet." ";
                        }
                    } elsif (/^U\s*\"(.*)\"/) {
                        # Undefines a previously defined symbol
                        $prj_target_cflags.="-U".$1." ";
                    } elsif (/^Fp/) {
                        # Name .PCH File
                    } elsif (/^F[Rr]/) {
                        # Create .SBR File
                    } elsif (/^YX$/) {
                        # Automatic Use of Precompiled Headers
                    } elsif (/^FD$/) {
                        # Generate File Dependencies
                    } elsif (/^c$/) {
                        # Compile Without Linking
                        # this option is always present and is already specified in the suffix rules
                    } elsif (/^GB$/) {
                        # Blend Optimization
                        $prj_target_cflags.="-D_M_IX86=500 ";
                    } elsif (/^G6$/) {
                        # Pentium Pro Optimization
                        $prj_target_cflags.="-D_M_IX86=600 ";
                    } elsif (/^G5$/) {
                        # Pentium Optimization
                        $prj_target_cflags.="-D_M_IX86=500 ";
                    } elsif (/^G3$/) {
                        # 80386 Optimization
                        $prj_target_cflags.="-D_M_IX86=300 ";
                    } elsif (/^G4$/) {
                        # 80486 Optimization
                        $prj_target_cflags.="-D_M_IX86=400 ";
                    } elsif (/^Yc/) {
                        # Create Precompiled Header
                    } elsif (/^Yu/) {
                        # Use Precompiled Header
                    } elsif (/^Za$/) {
                        # Disable Language Extensions
                        $prj_target_cflags.="-ansi ";
                    } elsif (/^Ze$/) {
                        # Enable Microsoft Extensions
                    } elsif (/^Zm[[:digit:]]+$/) {
                        # Specify Memory Allocation Limit
                    } elsif (/^Zp1?$/) {
                        # Packs structures on 1-byte boundaries
                        $prj_target_cflags.="-fpack-struct ";
                    } elsif (/^Zp(2|4|8|16)$/) {
                        # Struct Member Alignment
                        $prj_target_cflags.="-fpack-struct=".$1;
                    } else {
                        print "C compiler option $_ not implemented\n";
                    }
                }

                #print "\nOptions: $prj_target_cflags\n";
                next;
            } elsif (/^# ADD LINK32(.*)/ && $found_cfg==1) {
                $prj_target_ldflags=$1;
                @prj_target_options=split(/\s+\//, $prj_target_ldflags);
                $prj_target_ldflags="";
                $prj_target_libs=$prj_target_options[0];
                $prj_target_libs=~s/\\/\//g;
                $prj_target_libs=~s/\.lib//g;
                $prj_target_libs=~s/\s+/ -l/g;
                shift (@prj_target_options);
                foreach ( @prj_target_options ) {
                    if ($_ eq "") {
                        # empty
                    } elsif (/^base:(.*)/) {
                        # Base Address
                        $prj_target_ldflags.="--image-base ".$1." ";
                    } elsif (/^debug$/) {
                        # Generate Debug Info
                    } elsif (/^dll$/) {
                        # Build a DLL
                        $prj_target_type=$TT_DLL;
                    } elsif (/^incremental:[[:alpha:]]+$/) {
                        # Link Incrmentally
                    } elsif (/^implib:/) {
                        # Name import library
                    } elsif (/^libpath:\"(.*)\"/) {
                        # Additional Libpath
                        push @{@$project_settings[$T_DLL_PATH]},"-L$1";
                    } elsif (/^machine:[[:alnum:]]+$/) {
                        # Specify Target Platform
                    } elsif (/^map/) {
                        # Generate Mapfile
                        if (/^map:(.*)/) {
                            $prj_target_ldflags.="-Map ".$1." ";
                        } else {
                            $prj_target_ldflags.="-Map ".$prj_name.".map ";
                        }
                    } elsif (/^nologo$/) {
                        # Suppress Startup Banner and Information Messages
                    } elsif (/^out:/) {
                        # Output File Name
                        # may use it as Target?
                    } elsif (/^pdbtype:/) {
                        # Program Database Storage
                    } elsif (/^subsystem:/) {
                        # Specify Subsystem
                    } elsif (/^version:[[:digit:].]+$/) {
                        # Version Information
                    } else {
                        print "Linker option $_ not implemented\n";
                    }
                }
                next;
            } elsif (/^LIB32=/ && $found_cfg==1) {
                #$libflag = 1;
                next;
            } elsif (/^SOURCE=(.*)$/) {
                my @components=split /[\/\\]+/, $1;
                $sfilet=search_from($path, \@components);
                if (!defined $sfilet) { next; }
                if ($sfilet =~ /\.c$/i and $sfilet !~ /\.(dbg|spec)\.c$/) {
                    push @sources_c,$sfilet;
                } elsif ($sfilet =~ /\.(cpp|cxx)$/i) {
                    if ($sfilet =~ /^stdafx.cpp$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
                        push @sources_misc,$sfilet;
                        @$project_settings[$T_FLAGS]|=$TF_MFC;
                    } else {
                        push @sources_cxx,$sfilet;
                    }
                } elsif ($sfilet =~ /\.rc$/i) {
                    push @sources_rc,$sfilet;
                } elsif ($sfilet =~ /\.def$/i) {
                        @$project_settings[$T_FLAGS]|=$TF_HASDEF;
                } elsif ($sfilet =~ /\.(h|hxx|hpp|inl|rc2|dlg)$/i) {
                    push @sources_misc,$sfilet;
                    if ($sfilet =~ /^stdafx.h$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
                        @$project_settings[$T_FLAGS]|=$TF_MFC;
                    }
                }
                next;

            } elsif (/^# (Begin|End) Source File/) {
                # Source-Files already handled
                next;
            } elsif (/^# (Begin|End) Group/) {
                # Groups are ignored
                next;
            } elsif (/^# (Begin|End) Custom Build/) {
                # Custom Builds are ignored
                next;
            } elsif (/^# ADD LIB32 /) {
                #"ARFLAGS=rus"
                next;
            } elsif (/^# Begin Target$/) {
                # Targets are ignored
                next;
            } elsif (/^# End Target$/) {
                # Targets are ignored
                next;
            } elsif (/^!/) {
                if ($found_cfg == 1) {
                    $found_cfg=0;
                }
                if (/if (.*)\(CFG\)" == "(.*)"/i) {
                    if ($2 eq $prj_cfg) {
                        $found_cfg=1;
                    }
                }
                next;
            } elsif (/^CFG=(.*)/i) {
                $prj_cfg=$1;
                next;
            }
                else { # Line recognized
                # print "|\n";
            }
        }
        close(FILEI);

        push @{@$project_settings[$T_LIBRARIES]},$prj_target_libs;
        push @{@$project_settings[$T_CEXTRA]},$prj_target_cflags;
        push @{@$project_settings[$T_CXXEXTRA]},$prj_target_cflags;
        push @{@$project_settings[$T_DEFINES]},$prj_target_defines;
        push @{@$project_settings[$T_LDFLAGS]},$prj_target_ldflags;
    } elsif ($filename =~ /.vcproj$/i) {
        # Import XML::LibXML, you need the libxml package (deb: libxml-libxml-perl, rpm: perl-libxml-perl)
        require XML::LibXML;

        my $xmlparser = XML::LibXML->new();
        my $project_xml = $xmlparser->parse_file($filename);
        my $sfilet;
        my $configt;

        foreach my $vc_project ($project_xml->findnodes('/VisualStudioProject')) {
            foreach my $vc_project_attr ($vc_project->attributes) {
                if ($vc_project_attr->getName eq "Name") {
                    $prj_name=$vc_project_attr->getValue;
                    $prj_name=~s/\s+/_/g;
                    last;
                }
            }
        }

        for (my $flevel = 0; $flevel <= 5; $flevel++) {
            foreach my $vc_file ($project_xml->findnodes('/VisualStudioProject/Files/'.('Filter/' x $flevel).'File')) {
                foreach my $vc_file_attr ($vc_file->attributes) {
                    if ($vc_file_attr->getName eq "RelativePath") {
                        $sfilet = $vc_file_attr->getValue;
                        $sfilet=~s/\\\\/\\/g; #remove double backslash
                        $sfilet=~s/^\.\\//; #remove starting 'this directory'
                        $sfilet=~s/\\/\//g; #make slashes out of backslashes
                        if ($sfilet =~ /\.c$/i and $sfilet !~ /\.(dbg|spec)\.c$/) {
                            push @sources_c,$sfilet;
                        } elsif ($sfilet =~ /\.(cpp|cxx)$/i) {
                            if ($sfilet =~ /^stdafx.cpp$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
                                push @sources_misc,$sfilet;
                                @$project_settings[$T_FLAGS]|=$TF_MFC;
                            } else {
                                push @sources_cxx,$sfilet;
                            }
                        } elsif ($sfilet =~ /\.rc$/i) {
                            push @sources_rc,$sfilet;
                        } elsif ($sfilet =~ /\.def$/i) {
                            @$project_settings[$T_FLAGS]|=$TF_HASDEF;
                        } elsif ($sfilet =~ /\.(h|hxx|hpp|inl|rc2|dlg)$/i) {
                            push @sources_misc,$sfilet;
                            if ($sfilet =~ /^stdafx.h$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
                                @$project_settings[$T_FLAGS]|=$TF_MFC;
                            }
                        }
                    }
                }
            }
        }

        my @vc_configurations = $project_xml->findnodes('/VisualStudioProject/Configurations/Configuration');
        my $vc_configuration = $vc_configurations[0];
        foreach my $vc_configuration_attr ($vc_configuration->attributes) {
            if ($vc_configuration_attr->getName eq "ConfigurationType") {
                if ($vc_configuration_attr->getValue==1) {
                    $prj_target_type=$TT_GUIEXE; # Application
                } elsif ($vc_configuration_attr->getValue==2) {
                    $prj_target_type=$TT_DLL; # Dynamic-Link Library
                } elsif ($vc_configuration_attr->getValue==4) {
                    $prj_target_type=$TT_LIB; # Static Library
                }
            }
        }

        foreach my $vc_configuration_tools ($vc_configuration->findnodes('Tool')) {
            my @find_tool = $vc_configuration_tools->attributes;
            if ($find_tool[0]->getValue eq "VCCLCompilerTool") {
                foreach my $vc_compiler_tool ($vc_configuration_tools->attributes) {
                    if ($vc_compiler_tool->getName eq "Optimization") {$prj_target_cflags.="-O".$vc_compiler_tool->getValue." ";}
                    if ($vc_compiler_tool->getName eq "WarningLevel") {
                        if ($vc_compiler_tool->getValue==0) {
                            $prj_target_cflags.="-w ";
                        } elsif ($vc_compiler_tool->getValue<4) {
                            $prj_target_cflags.="-W ";
                        } elsif ($vc_compiler_tool->getValue==4) {
                            $prj_target_cflags.="-Wall ";
                        } elsif ($vc_compiler_tool->getValue eq "X") {
                            $prj_target_cflags.="-Werror ";
                        }
                    }
                    if ($vc_compiler_tool->getName eq "PreprocessorDefinitions") {
                        $configt=$vc_compiler_tool->getValue;
                        $configt=~s/;\s*/ -D/g;
                        $prj_target_defines.="-D".$configt." ";
                    }
                    if ($vc_compiler_tool->getName eq "AdditionalIncludeDirectories") {
                        $configt=$vc_compiler_tool->getValue;
                        $configt=~s/\\/\//g;
                        $configt=~s/;/ -I/g;
                        push @{@$project_settings[$T_INCLUDE_PATH]},"-I".$configt;
                    }
                }
            }
            if ($find_tool[0]->getValue eq "VCLinkerTool") {
                foreach my $vc_linker_tool ($vc_configuration_tools->attributes) {
                    if ($vc_linker_tool->getName eq "AdditionalDependencies") {
                        $prj_target_libs=" ".$vc_linker_tool->getValue;
                        $prj_target_libs=~s/\\/\//g;
                        $prj_target_libs=~s/\.lib//g;
                        $prj_target_libs=~s/\s+/ -l/g;
                    }
                }
            }
        }

        push @{@$project_settings[$T_LIBRARIES]},$prj_target_libs;
        push @{@$project_settings[$T_CEXTRA]},$prj_target_cflags;
        push @{@$project_settings[$T_CXXEXTRA]},$prj_target_cflags;
        push @{@$project_settings[$T_DEFINES]},$prj_target_defines;
    }

    # Add this project to the project list, except for
    # the main project which is already in the list.
    if ($is_sub_project == 1) {
        push @projects,$project;
    }

    # Ask for project-wide options
    if ($opt_ask_project_options == $OPT_ASK_YES) {
        my $flag_desc="";
        if ((@$project_settings[$T_FLAGS] & $TF_MFC)!=0) {
            $flag_desc="mfc";
        }
        print "* Type any project-wide options (-D/-I/-P/-i/-L/-l/--mfc),\n";
        if (defined $flag_desc) {
            print "* (currently $flag_desc)\n";
        }
        print "* or 'skip' to skip the target specific options,\n";
        print "* or 'never' to not be asked this question again:\n";
        while (1) {
            my $options=<STDIN>;
            chomp $options;
            if ($options eq "skip") {
                $opt_ask_target_options=$OPT_ASK_SKIP;
                last;
            } elsif ($options eq "never") {
                $opt_ask_project_options=$OPT_ASK_NO;
                last;
            } elsif (source_set_options($project_settings,$options)) {
                last;
            }
            print "Please re-enter the options:\n";
        }
    }

    # Create the target...
    my $target=[];
    target_init($target);

    if ($prj_target_type==$TT_GUIEXE or $prj_target_type==$TT_CUIEXE) {
        $prj_name=lc($prj_name.".exe");
        @$target[$T_TYPE]=$opt_target_type;
        push @{@$target[$T_LDFLAGS]},(@$target[$T_TYPE] == $TT_CUIEXE ? "-mconsole" : "-mwindows");
    } elsif ($prj_target_type==$TT_LIB) {
        $prj_name=lc("lib".$prj_name.".a");
        @$target[$T_TYPE]=$TT_LIB;
        push @{@$target[$T_ARFLAGS]},("rc");
    } else {
        $prj_name=lc($prj_name.".dll");
        @$target[$T_TYPE]=$TT_DLL;
        my $canon=canonize($prj_name);
        if (@$project_settings[$T_FLAGS] & $TF_HASDEF) {
            push @{@$target[$T_LDFLAGS]},("-shared","\$(${canon}_MODULE:.dll=.def)");
        } else {
            push @{@$target[$T_LDFLAGS]},("-shared","\$(${canon}_MODULE:.dll=.spec)");
        }
    }

    @$target[$T_NAME]=$prj_name;
    @$target[$T_FLAGS]|=@$project_settings[$T_FLAGS];

    # This is the default link list of Visual Studio
    my @std_imports=qw(odbc32 ole32 oleaut32 winspool odbccp32);
    my @std_libraries=qw(uuid);
    if ((@$target[$T_FLAGS] & $TF_NODLLS) == 0) {
        @$target[$T_DLLS]=\@std_imports;
        @$target[$T_LIBRARIES]=\@std_libraries;
    } else {
        @$target[$T_DLLS]=[];
        @$target[$T_LIBRARIES]=[];
    }
    if ((@$target[$T_FLAGS] & $TF_NOMSVCRT) == 0) {
        push @{@$target[$T_LDFLAGS]},"-mno-cygwin";
        if ($opt_arch != $OPT_ARCH_DEFAULT) {
            push @{@$target[$T_LDFLAGS]},"-m$opt_arch";
        }
    }
    push @{@$project[$P_TARGETS]},$target;

    # Ask for target-specific options
    if ($opt_ask_target_options == $OPT_ASK_YES) {
        my $flag_desc="";
        if ((@$target[$T_FLAGS] & $TF_MFC)!=0) {
            $flag_desc=" (mfc";
        }
        if ($flag_desc ne "") {
            $flag_desc.=")";
        }
        print "* Specify any link option (-P/-i/-L/-l/--mfc) specific to the target\n";
        print "* \"$prj_name\"$flag_desc or 'never' to not be asked this question again:\n";
        while (1) {
        my $options=<STDIN>;
        chomp $options;
        if ($options eq "never") {
            $opt_ask_target_options=$OPT_ASK_NO;
            last;
        } elsif (source_set_options($target,$options)) {
            last;
        }
        print "Please re-enter the options:\n";
        }
    }
    if (@$target[$T_FLAGS] & $TF_MFC) {
        @$project_settings[$T_FLAGS]|=$TF_MFC;
        push @{@$target[$T_DLL_PATH]},"\$(MFC_LIBRARY_PATH)";
        push @{@$target[$T_DLLS]},"mfc.dll";
        # FIXME: Link with the MFC in the Unix sense, until we
        # start exporting the functions properly.
        push @{@$target[$T_LIBRARY_PATH]},"\$(MFC_LIBRARY_PATH)";
        push @{@$target[$T_LIBRARIES]},"mfc";
    }

    # Match sources...
    push @{@$target[$T_SOURCES_C]},@{@$project_settings[$T_SOURCES_C]},@sources_c;
    @$project_settings[$T_SOURCES_C]=[];
    @sources_c=();
    push @{@$target[$T_SOURCES_CXX]},@{@$project_settings[$T_SOURCES_CXX]},@sources_cxx;
    @$project_settings[$T_SOURCES_CXX]=[];
    @sources_cxx=();
    push @{@$target[$T_SOURCES_RC]},@{@$project_settings[$T_SOURCES_RC]},@sources_rc;
    @$project_settings[$T_SOURCES_RC]=[];
    @sources_rc=();
    push @{@$target[$T_SOURCES_MISC]},@{@$project_settings[$T_SOURCES_MISC]},@sources_misc;
    @$project_settings[$T_SOURCES_MISC]=[];
    @sources_misc=();

    @$target[$T_SOURCES_C]=[sort @{@$target[$T_SOURCES_C]}];
    @$target[$T_SOURCES_CXX]=[sort @{@$target[$T_SOURCES_CXX]}];
    @$target[$T_SOURCES_RC]=[sort @{@$target[$T_SOURCES_RC]}];
    @$target[$T_SOURCES_MISC]=[sort @{@$target[$T_SOURCES_MISC]}];

    if ($opt_ask_target_options == $OPT_ASK_SKIP) {
        $opt_ask_target_options=$OPT_ASK_YES;
    }

    if ((@$project_settings[$T_FLAGS] & $TF_NOMSVCRT) == 0) {
        push @{@$project_settings[$T_CEXTRA]},"-mno-cygwin";
        push @{@$project_settings[$T_CXXEXTRA]},"-mno-cygwin";
        if ($opt_arch != $OPT_ARCH_DEFAULT) {
            push @{@$project_settings[$T_CEXTRA]},"-m$opt_arch";
            push @{@$project_settings[$T_CXXEXTRA]},"-m$opt_arch";
        }
    }

    if (@$project_settings[$T_FLAGS] & $TF_MFC) {
        push @{@$project_settings[$T_INCLUDE_PATH]},"\$(MFC_INCLUDE_PATH)";
    }
    # The sources that did not match, if any, go to the extra
    # source list of the project settings
    foreach my $source (@sources_c) {
        if ($source ne "") {
            push @{@$project_settings[$T_SOURCES_C]},$source;
        }
    }
    @$project_settings[$T_SOURCES_C]=[sort @{@$project_settings[$T_SOURCES_C]}];
    foreach my $source (@sources_cxx) {
        if ($source ne "") {
            push @{@$project_settings[$T_SOURCES_CXX]},$source;
        }
    }
    @$project_settings[$T_SOURCES_CXX]=[sort @{@$project_settings[$T_SOURCES_CXX]}];
    foreach my $source (@sources_rc) {
        if ($source ne "") {
            push @{@$project_settings[$T_SOURCES_RC]},$source;
        }
    }
    @$project_settings[$T_SOURCES_RC]=[sort @{@$project_settings[$T_SOURCES_RC]}];
    foreach my $source (@sources_misc) {
        if ($source ne "") {
            push @{@$project_settings[$T_SOURCES_MISC]},$source;
        }
    }
    @$project_settings[$T_SOURCES_MISC]=[sort @{@$project_settings[$T_SOURCES_MISC]}];
}

##
# Scans the specified workspace file to find the project files
sub source_scan_workspace_file($);
sub source_scan_workspace_file($)
{
    my $filename=$_[0];
    my $path=dirname($filename);
    my @components;

    if (! -e $filename) {
        return;
    }

    if (!open(FILEIWS,$filename)) {
        print STDERR "error: unable to open $filename for reading:\n";
        print STDERR "       $!\n";
        return;
    }

    my $prj_name;
    my $prj_path;

    if ($filename =~ /.dsw$/i) {
        while (<FILEIWS>) {
            # Remove any trailing CrLf
            s/\r\n$/\n/;

            # catch a project definition
            if (/^Project:\s\"(.*)\"=(.*)\s-/) {
                $prj_name=$1;
                $prj_path=$2;
                @components=split /[\/\\]+/, $prj_path;
                $prj_path=search_from($path, \@components);
                print "Name: $prj_name\nPath: $prj_path\n";
                source_scan_project_file(\@main_project,1,$prj_path);
                next;
            } elsif (/^#/) {
                # ignore Comments
            } elsif (/^Global:/) {
                # ignore the Global section
            } elsif (/\w:/) {
                print STDERR "unknown section $_\n";
            } elsif (/^Microsoft(.*)Studio(.*)File,\sFormat Version\s(.*)/) {
                print "\nFileversion: $3\n";
            }
        }
        close(FILEIWS);
    } elsif ($filename =~ /.sln$/i) {
        while (<FILEIWS>) {
            # Remove any trailing CrLf
            s/\r\n$/\n/;

            # catch a project definition
            if (/^Project(.*)=\s*"(.*)",\s*"(.*)",\s*"(.*)"/) {
                $prj_name=$2;
                $prj_path=$3;
                if ($prj_path eq "Solution Items") { next; }
                @components=split /[\/\\]+/, $3;
                $prj_path=search_from($path, \@components);
                print "Name: $prj_name\nPath: $prj_path\n";
                source_scan_project_file(\@main_project,1,$prj_path);
                next;
            } elsif (/^Microsoft(.*)Studio(.*)File,\sFormat Version\s(.*)/) {
                print "\nFileversion: $3\n";
            }
        }
        close(FILEIWS);
    }

    @projects=sort { @$a[$P_PATH] cmp @$b[$P_PATH] } @projects;
}

##
# Scans the specified directory to:
# - see if we should create a Makefile in this directory. We normally do
#   so if we find a project file and sources
# - get a list of targets for this directory
# - get the list of source files
sub source_scan_directory($$$$);
sub source_scan_directory($$$$)
{
  # a reference to the parent's project
  my $parent_project=$_[0];
  # the full relative path to the current directory, including a
  # trailing '/', or an empty string if this is the top level directory
  my $path=$_[1];
  # the name of this directory, including a trailing '/', or an empty
  # string if this is the top level directory
  my $dirname=$_[2];
  # if set then no targets will be looked for and the sources will all
  # end up in the parent_project's 'misc' bucket
  my $no_target=$_[3];

  # reference to the project for this directory. May not be used
  my $project;
  # list of targets found in the 'current' directory
  my %targets;
  # list of sources found in the current directory
  my @sources_c=();
  my @sources_cxx=();
  my @sources_rc=();
  my @sources_misc=();
  # true if this directory contains a Windows project
  my $has_win_project=0;
  # true if this directory contains headers
  my $has_headers=0;
  # If we don't find any executable/library then we might make up targets
  # from the list of .dsp/.mak files we find since they usually have the
  # same name as their target.
  my @prj_files=();
  my @mak_files=();

  if (defined $opt_single_target or $dirname eq "") {
    # Either there is a single target and thus a single project,
    # or we are in the top level directory for which a project
    # already exists
    $project=$parent_project;
  } else {
    $project=[];
    project_init($project, $path, \@global_settings);
  }
  my $project_settings=@$project[$P_SETTINGS];

  # First find out what this directory contains:
  # collect all sources, targets and subdirectories
  my $directory=get_directory_contents($path);
  foreach my $dentry (@$directory) {
    if ($dentry =~ /^\./) {
      next;
    }
    my $fullentry="$path$dentry";
    if (-d "$fullentry") {
      if ($dentry =~ /^(Release|Debug)/i) {
	# These directories are often used to store the object files and the
	# resulting executable/library. They should not contain anything else.
        my @candidates=grep /\.(exe|dll|lib)$/i, @{get_directory_contents("$fullentry")};
        foreach my $candidate (sort @candidates) {
            my $dlldup = $candidate;
            $dlldup =~ s/\.lib$/.dll/;
            if ($candidate =~ /\.lib$/ and $targets{$dlldup})
            {
                # Often lib files are created together with dll files, even if the dll file is the
                # real target.
                next;
            }
            $targets{$candidate}=1;
        }
      } elsif ($dentry =~ /^include/i) {
        # This directory must contain headers we're going to need
        push @{@$project_settings[$T_INCLUDE_PATH]},"-I$dentry";
        source_scan_directory($project,"$fullentry/","$dentry/",1);
      } else {
	# Recursively scan this directory. Any source file that cannot be
	# attributed to a project in one of the subdirectories will be
	# attributed to this project.
	source_scan_directory($project,"$fullentry/","$dentry/",$no_target);
      }
    } elsif (-f "$fullentry") {
      if ($dentry =~ /\.(exe|dll|lib)$/i) {
	$targets{$dentry}=1;
      } elsif ($dentry =~ /\.c$/i and $dentry !~ /\.(dbg|spec)\.c$/) {
	push @sources_c,"$dentry";
      } elsif ($dentry =~ /\.(cpp|cxx)$/i) {
	if ($dentry =~ /^stdafx.cpp$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
	  push @sources_misc,"$dentry";
	  @$project_settings[$T_FLAGS]|=$TF_MFC;
	} else {
	  push @sources_cxx,"$dentry";
	}
      } elsif ($dentry =~ /\.rc$/i) {
	push @sources_rc,"$dentry";
      } elsif ($dentry =~ /\.def$/i) {
	@$project_settings[$T_FLAGS]|=$TF_HASDEF;
      } elsif ($dentry =~ /\.(h|hxx|hpp|inl|rc2|dlg)$/i) {
	$has_headers=1;
	push @sources_misc,"$dentry";
	if ($dentry =~ /^stdafx.h$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
	  @$project_settings[$T_FLAGS]|=$TF_MFC;
	}
      } elsif ($dentry =~ /\.(dsp|vcproj)$/i) {
	push @prj_files,"$dentry";
	$has_win_project=1;
      } elsif ($dentry =~ /\.mak$/i) {
	push @mak_files,"$dentry";
	$has_win_project=1;
      } elsif ($dentry =~ /^makefile/i) {
	$has_win_project=1;
      }
    }
  }

  if ($has_headers) {
    push @{@$project_settings[$T_INCLUDE_PATH]},"-I.";
  }
  # If we have a single target then all we have to do is assign
  # all the sources to it and we're done
  # FIXME: does this play well with the --interactive mode?
  if ($opt_single_target) {
    my $target=@{@$project[$P_TARGETS]}[0];
    push @{@$target[$T_SOURCES_C]},map "$path$_",@sources_c;
    push @{@$target[$T_SOURCES_CXX]},map "$path$_",@sources_cxx;
    push @{@$target[$T_SOURCES_RC]},map "$path$_",@sources_rc;
    push @{@$target[$T_SOURCES_MISC]},map "$path$_",@sources_misc;
    return;
  }
  if ($no_target) {
    my $parent_settings=@$parent_project[$P_SETTINGS];
    push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@sources_c;
    push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@sources_cxx;
    push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@sources_rc;
    push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@sources_misc;
    push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@{@$project_settings[$T_SOURCES_MISC]};
    return;
  }

  my $source_count=@sources_c+@sources_cxx+@sources_rc+
                   @{@$project_settings[$T_SOURCES_C]}+
                   @{@$project_settings[$T_SOURCES_CXX]}+
                   @{@$project_settings[$T_SOURCES_RC]};
  if ($source_count == 0) {
    # A project without real sources is not a project, get out!
    if ($project!=$parent_project) {
      my $parent_settings=@$parent_project[$P_SETTINGS];
      push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@sources_misc;
      push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@{@$project_settings[$T_SOURCES_MISC]};
    }
    return;
  }
  #print "targets=",%targets,"\n";
  #print "target_count=$target_count\n";
  #print "has_win_project=$has_win_project\n";
  #print "dirname=$dirname\n";

  my $target_count;
  if (($has_win_project != 0) or ($dirname eq "")) {
    # Deal with cases where we could not find any executable/library, and
    # thus have no target, although we did find some sort of windows project.
    $target_count=keys %targets;
    if ($target_count == 0) {
      # Try to come up with a target list based on .dsp/.mak files
      my $prj_list;
      if (@prj_files > 0) {
        print "Projectfile found! You might want to try using it directly.\n";
        $prj_list=\@prj_files;
      } else {
        $prj_list=\@mak_files;
      }
      foreach my $filename (@$prj_list) {
	$filename =~ s/\.(dsp|vcproj|mak)$//i;
	if ($opt_target_type == $TT_DLL) {
	  $filename = "$filename.dll";
	}
	$targets{$filename}=1;
      }
      $target_count=keys %targets;
      if ($target_count == 0) {
	# Still nothing, try the name of the directory
	my $name;
	if ($dirname eq "") {
	  # Bad luck, this is the top level directory!
	  $name=(split /\//, cwd)[-1];
	} else {
	  $name=$dirname;
	  # Remove the trailing '/'. Also eliminate whatever is after the last
	  # '.' as it is likely to be meaningless (.orig, .new, ...)
	  $name =~ s+(/|\.[^.]*)$++;
	  if ($name eq "src") {
	    # 'src' is probably a subdirectory of the real project directory.
	    # Try again with the parent (if any).
	    my $parent=$path;
	    if ($parent =~ s+([^/]*)/[^/]*/$+$1+) {
	      $name=$parent;
	    } else {
	      $name=(split /\//, cwd)[-1];
	    }
	  }
	}
	$name =~ s+(/|\.[^.]*)$++;
	if ($opt_target_type == $TT_DLL) {
	  $name = canonize($name).".dll";
	} elsif ($opt_target_type == $TT_LIB) {
	  $name = "lib".canonize($name).".a";
	} else {
	  $name = canonize($name).".exe";
	}
	$targets{$name}=1;
      }
    }

    # Ask confirmation to the user if he wishes so
    if ($opt_is_interactive == $OPT_ASK_YES) {
      my $target_list=join " ",keys %targets;
      print "\n*** In ",($path?$path:"./"),"\n";
      print "* winemaker found the following list of (potential) targets\n";
      print "*   $target_list\n";
      print "* Type enter to use it as is, your own comma-separated list of\n";
      print "* targets, 'none' to assign the source files to a parent directory,\n";
      print "* or 'ignore' to ignore everything in this directory tree.\n";
      print "* Target list:\n";
      $target_list=<STDIN>;
      chomp $target_list;
      if ($target_list eq "") {
	# Keep the target list as is, i.e. do nothing
      } elsif ($target_list eq "none") {
	# Empty the target list
	undef %targets;
      } elsif ($target_list eq "ignore") {
	# Ignore this subtree altogether
	return;
      } else {
	undef %targets;
	foreach my $target (split /,/,$target_list) {
	  $target =~ s+^\s*++;
	  $target =~ s+\s*$++;
	  $targets{$target}=1;
	}
      }
    }
  }

  # If we have no project at this level, then transfer all
  # the sources to the parent project
  $target_count=keys %targets;
  if ($target_count == 0) {
    if ($project!=$parent_project) {
      my $parent_settings=@$parent_project[$P_SETTINGS];
      push @{@$parent_settings[$T_SOURCES_C]},map "$dirname$_",@sources_c;
      push @{@$parent_settings[$T_SOURCES_CXX]},map "$dirname$_",@sources_cxx;
      push @{@$parent_settings[$T_SOURCES_RC]},map "$dirname$_",@sources_rc;
      push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@sources_misc;
      push @{@$parent_settings[$T_SOURCES_MISC]},map "$dirname$_",@{@$project_settings[$T_SOURCES_MISC]};
    }
    return;
  }

  # Otherwise add this project to the project list, except for
  # the main project which is already in the list.
  if ($dirname ne "") {
    push @projects,$project;
  }

  # Ask for project-wide options
  if ($opt_ask_project_options == $OPT_ASK_YES) {
    my $flag_desc="";
    if ((@$project_settings[$T_FLAGS] & $TF_MFC)!=0) {
      $flag_desc="mfc";
    }
    print "* Type any project-wide options (-D/-I/-P/-i/-L/-l/--mfc),\n";
    if (defined $flag_desc) {
      print "* (currently $flag_desc)\n";
    }
    print "* or 'skip' to skip the target specific options,\n";
    print "* or 'never' to not be asked this question again:\n";
    while (1) {
      my $options=<STDIN>;
      chomp $options;
      if ($options eq "skip") {
        $opt_ask_target_options=$OPT_ASK_SKIP;
        last;
      } elsif ($options eq "never") {
        $opt_ask_project_options=$OPT_ASK_NO;
        last;
      } elsif (source_set_options($project_settings,$options)) {
        last;
      }
      print "Please re-enter the options:\n";
    }
  }

  # - Create the targets
  # - Check if we have both libraries and programs
  # - Match each target with source files (sort in reverse
  #   alphabetical order to get the longest matches first)
  my @local_dlls=();
  my @local_libs=();
  my @local_depends=();
  my @exe_list=();
  foreach my $target_name (map (lc, (sort { $b cmp $a } keys %targets))) {
    # Create the target...
    my $target=[];
    target_init($target);
    @$target[$T_NAME]=$target_name;
    @$target[$T_FLAGS]|=@$project_settings[$T_FLAGS];
    if ($target_name =~ /\.dll$/) {
      @$target[$T_TYPE]=$TT_DLL;
      push @local_depends,"$target_name.so";
      push @local_dlls,$target_name;
      my $canon=canonize($target_name);
      if (@$project_settings[$T_FLAGS] & $TF_HASDEF) {
          push @{@$target[$T_LDFLAGS]},("-shared","\$(${canon}_MODULE:.dll=.def)");
      } else {
          push @{@$target[$T_LDFLAGS]},("-shared","\$(${canon}_MODULE:.dll=.spec)");
      }
    } elsif ($target_name =~ /\.lib$/) {
      $target_name =~ s/(.*)\.lib/lib$1.a/;
      @$target[$T_NAME]=$target_name;
      @$target[$T_TYPE]=$TT_LIB;
      push @local_depends,"$target_name";
      push @local_libs,$target_name;
      push @{@$target[$T_ARFLAGS]},("rc");
    } elsif ($target_name =~ /\.a$/) {
      @$target[$T_NAME]=$target_name;
      @$target[$T_TYPE]=$TT_LIB;
      push @local_depends,"$target_name";
      push @local_libs,$target_name;
      push @{@$target[$T_ARFLAGS]},("rc");
    } else {
      @$target[$T_TYPE]=$opt_target_type;
      push @exe_list,$target;
      push @{@$target[$T_LDFLAGS]},(@$target[$T_TYPE] == $TT_CUIEXE ? "-mconsole" : "-mwindows");
    }
    my $basename=$target_name;
    $basename=~ s/\.(dll|exe)$//i;
    # This is the default link list of Visual Studio
    my @std_imports=qw(odbc32 ole32 oleaut32 winspool odbccp32);
    my @std_libraries=qw(uuid);
    if ((@$target[$T_FLAGS] & $TF_NODLLS) == 0) {
      @$target[$T_DLLS]=\@std_imports;
      @$target[$T_LIBRARIES]=\@std_libraries;
    } else {
      @$target[$T_DLLS]=[];
      @$target[$T_LIBRARIES]=[];
    }
    if ((@$target[$T_FLAGS] & $TF_NOMSVCRT) == 0) {
      push @{@$target[$T_LDFLAGS]},"-mno-cygwin";
      if ($opt_arch != $OPT_ARCH_DEFAULT) {
        push @{@$target[$T_LDFLAGS]},"-m$opt_arch";
      }
    }
    push @{@$project[$P_TARGETS]},$target;

    # Ask for target-specific options
    if ($opt_ask_target_options == $OPT_ASK_YES) {
      my $flag_desc="";
      if ((@$target[$T_FLAGS] & $TF_MFC)!=0) {
	$flag_desc=" (mfc";
      }
      if ($flag_desc ne "") {
	$flag_desc.=")";
      }
      print "* Specify any link option (-P/-i/-L/-l/--mfc) specific to the target\n";
      print "* \"$target_name\"$flag_desc or 'never' to not be asked this question again:\n";
      while (1) {
        my $options=<STDIN>;
        chomp $options;
        if ($options eq "never") {
          $opt_ask_target_options=$OPT_ASK_NO;
          last;
        } elsif (source_set_options($target,$options)) {
          last;
        }
        print "Please re-enter the options:\n";
      }
    }
    if (@$target[$T_FLAGS] & $TF_MFC) {
      @$project_settings[$T_FLAGS]|=$TF_MFC;
      push @{@$target[$T_DLL_PATH]},"\$(MFC_LIBRARY_PATH)";
      push @{@$target[$T_DLLS]},"mfc.dll";
      # FIXME: Link with the MFC in the Unix sense, until we
      # start exporting the functions properly.
      push @{@$target[$T_LIBRARY_PATH]},"\$(MFC_LIBRARY_PATH)";
      push @{@$target[$T_LIBRARIES]},"mfc";
    }

    # Match sources...
    if ($target_count == 1) {
      push @{@$target[$T_SOURCES_C]},@{@$project_settings[$T_SOURCES_C]},@sources_c;
      @$project_settings[$T_SOURCES_C]=[];
      @sources_c=();

      push @{@$target[$T_SOURCES_CXX]},@{@$project_settings[$T_SOURCES_CXX]},@sources_cxx;
      @$project_settings[$T_SOURCES_CXX]=[];
      @sources_cxx=();

      push @{@$target[$T_SOURCES_RC]},@{@$project_settings[$T_SOURCES_RC]},@sources_rc;
      @$project_settings[$T_SOURCES_RC]=[];
      @sources_rc=();

      push @{@$target[$T_SOURCES_MISC]},@{@$project_settings[$T_SOURCES_MISC]},@sources_misc;
      # No need for sorting these sources
      @$project_settings[$T_SOURCES_MISC]=[];
      @sources_misc=();
    } else {
      foreach my $source (@sources_c) {
	if ($source =~ /^$basename/i) {
	  push @{@$target[$T_SOURCES_C]},$source;
	  $source="";
	}
      }
      foreach my $source (@sources_cxx) {
	if ($source =~ /^$basename/i) {
	  push @{@$target[$T_SOURCES_CXX]},$source;
	  $source="";
	}
      }
      foreach my $source (@sources_rc) {
	if ($source =~ /^$basename/i) {
	  push @{@$target[$T_SOURCES_RC]},$source;
	  $source="";
	}
      }
      foreach my $source (@sources_misc) {
	if ($source =~ /^$basename/i) {
	  push @{@$target[$T_SOURCES_MISC]},$source;
	  $source="";
	}
      }
    }
    @$target[$T_SOURCES_C]=[sort @{@$target[$T_SOURCES_C]}];
    @$target[$T_SOURCES_CXX]=[sort @{@$target[$T_SOURCES_CXX]}];
    @$target[$T_SOURCES_RC]=[sort @{@$target[$T_SOURCES_RC]}];
    @$target[$T_SOURCES_MISC]=[sort @{@$target[$T_SOURCES_MISC]}];
  }
  if ($opt_ask_target_options == $OPT_ASK_SKIP) {
    $opt_ask_target_options=$OPT_ASK_YES;
  }

  if ((@$project_settings[$T_FLAGS] & $TF_NOMSVCRT) == 0) {
    push @{@$project_settings[$T_CEXTRA]},"-mno-cygwin";
    push @{@$project_settings[$T_CXXEXTRA]},"-mno-cygwin";
      if ($opt_arch != $OPT_ARCH_DEFAULT) {
        push @{@$project_settings[$T_CEXTRA]},"-m$opt_arch";
        push @{@$project_settings[$T_CXXEXTRA]},"-m$opt_arch";
      }
  }

  if (@$project_settings[$T_FLAGS] & $TF_MFC) {
    push @{@$project_settings[$T_INCLUDE_PATH]},"\$(MFC_INCLUDE_PATH)";
  }
  # The sources that did not match, if any, go to the extra
  # source list of the project settings
  foreach my $source (@sources_c) {
    if ($source ne "") {
      push @{@$project_settings[$T_SOURCES_C]},$source;
    }
  }
  @$project_settings[$T_SOURCES_C]=[sort @{@$project_settings[$T_SOURCES_C]}];
  foreach my $source (@sources_cxx) {
    if ($source ne "") {
      push @{@$project_settings[$T_SOURCES_CXX]},$source;
    }
  }
  @$project_settings[$T_SOURCES_CXX]=[sort @{@$project_settings[$T_SOURCES_CXX]}];
  foreach my $source (@sources_rc) {
    if ($source ne "") {
      push @{@$project_settings[$T_SOURCES_RC]},$source;
    }
  }
  @$project_settings[$T_SOURCES_RC]=[sort @{@$project_settings[$T_SOURCES_RC]}];
  foreach my $source (@sources_misc) {
    if ($source ne "") {
      push @{@$project_settings[$T_SOURCES_MISC]},$source;
    }
  }
  @$project_settings[$T_SOURCES_MISC]=[sort @{@$project_settings[$T_SOURCES_MISC]}];

  # Finally if we are building both libraries and programs in
  # this directory, then the programs should be linked with all
  # the libraries
  if (@local_dlls > 0 and @exe_list > 0) {
    foreach my $target (@exe_list) {
      push @{@$target[$T_DLL_PATH]},"-L.";
      push @{@$target[$T_DLLS]},@local_dlls;
    }
  }
  if (@local_libs > 0 and @exe_list > 0) {
    foreach my $target (@exe_list) {
      push @{@$target[$T_LIBRARY_PATH]},"-L.";
      push @{@$target[$T_LIBRARIES]},@local_libs;
    }
  }
}

##
# Scan the source directories in search of things to build
sub source_scan()
{
  # If there's a single target then this is going to be the default target
  if (defined $opt_single_target) {
    # Create the main target
    my $main_target=[];
    target_init($main_target);
    @$main_target[$T_NAME]=$opt_single_target;
    @$main_target[$T_TYPE]=$opt_target_type;

    # Add it to the list
    push @{$main_project[$P_TARGETS]},$main_target;
  }

  # The main directory is always going to be there
  push @projects,\@main_project;

    if (defined $opt_work_dir) {
        # Now scan the directory tree looking for source files and, maybe, targets
        print "Scanning the source directories...\n";
        source_scan_directory(\@main_project,"","",0);
        @projects=sort { @$a[$P_PATH] cmp @$b[$P_PATH] } @projects;
    } elsif (defined $opt_work_file) {
        if ($opt_work_file =~ /.dsp$/i or $opt_work_file =~ /.vcproj$/i) {
            source_scan_project_file(\@main_project,0,$opt_work_file);
        } elsif ($opt_work_file =~ /.dsw$/i or $opt_work_file =~ /.sln$/i) {
            source_scan_workspace_file($opt_work_file);
        }
    }
}

#####
#
# Source search
#
#####

##
# Performs a directory traversal and renames the files so that:
# - they have the case desired by the user
# - their extension is of the appropriate case
# - they don't contain annoying characters like ' ', '$', '#', ...
# But only perform these changes for source files and directories.
sub fix_file_and_directory_names($);
sub fix_file_and_directory_names($)
{
  my $dirname=$_[0];

  my $directory=get_directory_contents($dirname);
  foreach my $dentry (@$directory)
  {
      if ($dentry =~ /^\./ or $dentry eq "CVS") {
          next;
      }
      # Set $warn to 1 if the user should be warned of the renaming
      my $warn;
      my $new_name=$dentry;

      if (-f "$dirname/$dentry")
      {
          # Don't rename Winemaker's makefiles
          next if ($dentry eq "Makefile" and
                   `head -n 1 "$dirname/$dentry"` =~ /Generated by Winemaker/);

          # Leave non-source files alone
          next if ($new_name !~ /(^makefile|\.(c|cpp|h|rc|spec|def))$/i);

          # Only all lowercase extensions are supported (because of
          # rules like '.c.o:').
          $new_name =~ s/\.C$/.c/;
          $new_name =~ s/\.cpp$/.cpp/i;
          $warn=1 if ($new_name =~ s/\.cxx$/.cpp/i);
          $new_name =~ s/\.rc$/.rc/i;
          # And this last one is to avoid confusion when running make
          $warn=1 if ($new_name =~ s/^makefile$/makefile.win/i);
      }

      # Adjust the case to the user's preferences
      if (($opt_lower == $OPT_LOWER_ALL and $dentry =~ /[A-Z]/) or
          ($opt_lower == $OPT_LOWER_UPPERCASE and $dentry !~ /[a-z]/)
         ) {
          $new_name=lc $new_name;
      }

      # make doesn't support these characters well
      $new_name =~ s/[ \$]/_/g;

      # And finally, perform the renaming
      if ($new_name ne $dentry)
      {
          if ($warn) {
              print STDERR "warning: in \"$dirname\", renaming \"$dentry\" to \"$new_name\"\n";
          }
          if (!rename("$dirname/$dentry","$dirname/$new_name")) {
              print STDERR "error: in \"$dirname\", unable to rename \"$dentry\" to \"$new_name\"\n";
              print STDERR "       $!\n";
              $new_name=$dentry;
          }
          else
          {
              clear_directory_cache($dirname);
          }
      }
      if (-d "$dirname/$new_name") {
          fix_file_and_directory_names("$dirname/$new_name");
      }
  }
}



#####
#
# Source fixup
#
#####

##
# Try to find a file for the specified filename. The attempt is
# case-insensitive which is why it's not trivial. If a match is
# found then we return the pathname with the correct case.
sub search_from($$)
{
  my $dirname=$_[0];
  my $path=$_[1];
  my $real_path="";

  $dirname =~ s/(\.\/)+//;
  if ($dirname eq "" or $dirname eq "." or $dirname eq "./") {
    $dirname=cwd;
  } elsif ($dirname !~ m+^/+) {
    $dirname=cwd . "/" . $dirname;
  }
  if ($dirname !~ m+/$+) {
    $dirname.="/";
  }

  foreach my $component (@$path) {
    $component=~s/^\"//;
    $component=~s/\"$//;
    #print "    looking for $component in \"$dirname\"\n";
    if ($component eq ".") {
      # Pass it as is
      $real_path.="./";
    } elsif ($component eq "..") {
      # Go up one level
      if ($dirname =~ /\.\.\/$/) {
        $dirname.="../";
      } else {
        $dirname=dirname($dirname) . "/";
      }
      $real_path.="../";
    } else {
      # The file/directory may have been renamed before. Also try to
      # match the renamed file.
      my $renamed=$component;
      $renamed =~ s/[ \$]/_/g;
      if ($renamed eq $component) {
        undef $renamed;
      }

      my $directory=get_directory_contents $dirname;
      my $found;
      foreach my $dentry (@$directory) {
	if ($dentry =~ /^\Q$component\E$/i or
            (defined $renamed and $dentry =~ /^$renamed$/i)
           ) {
	  $dirname.="$dentry/";
	  $real_path.="$dentry/";
	  $found=1;
	  last;
	}
      }
      if (!defined $found) {
	# Give up
	#print "    could not find $component in $dirname\n";
	return;
      }
    }
  }
  $real_path=~ s+/$++;
  #print "    -> found $real_path\n";
  return $real_path;
}

##
# Performs a case-insensitive search for the specified file in the
# include path.
# $line is the line number that should be referenced when an error occurs
# $filename is the file we are looking for
# $dirname is the directory of the file containing the '#include' directive
#    if '"' was used, it is an empty string otherwise
# $project and $target specify part of the include path
sub get_real_include_name($$$$$)
{
  my $line=$_[0];
  my $filename=$_[1];
  my $dirname=$_[2];
  my $project=$_[3];
  my $target=$_[4];

  if ($filename =~ /^([a-zA-Z]:)?[\/\\]/ or $filename =~ /^[a-zA-Z]:[\/\\]?/) {
    # This is not a relative path, we cannot make any check
    my $warning="path:$filename";
    if (!defined $warnings{$warning}) {
      $warnings{$warning}="1";
      print STDERR "warning: cannot check the case of absolute pathnames:\n";
      print STDERR "$line:   $filename\n";
    }
  } else {
    # Here's how we proceed:
    # - split the filename we look for into its components
    # - then for each directory in the include path
    #   - trace the directory components starting from that directory
    #   - if we fail to find a match at any point then continue with
    #     the next directory in the include path
    #   - otherwise, rejoice, our quest is over.
    my @file_components=split /[\/\\]+/, $filename;
    #print "  Searching for $filename from @$project[$P_PATH]\n";

    my $real_filename;
    if ($dirname ne "") {
      # This is an 'include ""' -> look in dirname first.
      #print "    in $dirname (include \"\")\n";
      $real_filename=search_from($dirname,\@file_components);
      if (defined $real_filename) {
	return $real_filename;
      }
    }
    my $project_settings=@$project[$P_SETTINGS];
    foreach my $include (@{@$target[$T_INCLUDE_PATH]}, @{@$project_settings[$T_INCLUDE_PATH]}) {
      my $dirname=$include;
      $dirname=~ s+^-I++;
      $dirname=~ s+\s$++;
      if (!is_absolute($dirname)) {
	$dirname="@$project[$P_PATH]$dirname";
      } else {
        $dirname=~ s+^\$\(TOPSRCDIR\)/++;
        $dirname=~ s+^\$\(SRCDIR\)/+@$project[$P_PATH]+;
      }
      #print "    in $dirname\n";
      $real_filename=search_from("$dirname",\@file_components);
      if (defined $real_filename) {
	return $real_filename;
      }
    }
    my $dotdotpath=@$project[$P_PATH];
    $dotdotpath =~ s/[^\/]+/../g;
    foreach my $include (@{$global_settings[$T_INCLUDE_PATH]}) {
      my $dirname=$include;
      $dirname=~ s+^-I++;
      $dirname=~ s+^\$\(TOPSRCDIR\)\/++;
      $dirname=~ s+^\$\(SRCDIR\)\/+@$project[$P_PATH]+;
      #print "    in $dirname  (global setting)\n";
      $real_filename=search_from("$dirname",\@file_components);
      if (defined $real_filename) {
	return $real_filename;
      }
    }
  }
  $filename =~ s+\\\\+/+g; # in include ""
  $filename =~ s+\\+/+g; # in include <> !
  if ($opt_lower_include) {
    return lc "$filename";
  }
  return $filename;
}

sub print_pack($$$)
{
  my $indent=$_[0];
  my $size=$_[1];
  my $trailer=$_[2];

  if ($size =~ /^(1|2|4|8)$/) {
    print FILEO "$indent#include <pshpack$size.h>$trailer";
  } else {
    print FILEO "$indent/* winemaker:warning: Unknown size \"$size\". Defaulting to 4 */\n";
    print FILEO "$indent#include <pshpack4.h>$trailer";
  }
}

##
# 'Parses' a source file and fixes constructs that would not work with
# Winelib. The parsing is rather simple and not all non-portable features
# are corrected. The most important feature that is corrected is the case
# and path separator of '#include' directives. This requires that each
# source file be associated to a project & target so that the proper
# include path is used.
# Also note that the include path is relative to the directory in which the
# compiler is run, i.e. that of the project, not to that of the file.
sub fix_file($$$)
{
  my $filename=$_[0];
  my $project=$_[1];
  my $target=$_[2];
  $filename="@$project[$P_PATH]$filename";
  if (! -e $filename) {
    return;
  }

  my $is_rc=($filename =~ /\.(rc2?|dlg)$/i);
  my $dirname=dirname($filename);
  my $is_mfc=0;
  if (defined $target and (@$target[$T_FLAGS] & $TF_MFC)) {
    $is_mfc=1;
  }

  print "  $filename\n";
  if (! -e "$filename.bak") {
    if (!copy("$filename","$filename.bak")) {
      print STDERR "error: unable to make a backup of $filename:\n";
      print STDERR "       $!\n";
      return;
    }
  }
  if (!open(FILEI,"$filename.bak")) {
    print STDERR "error: unable to open $filename.bak for reading:\n";
    print STDERR "       $!\n";
    return;
  }
  if (!open(FILEO,">$filename")) {
    print STDERR "error: unable to open $filename for writing:\n";
    print STDERR "       $!\n";
    return;
  }
  my $line=0;
  my $modified=0;
  my $rc_block_depth=0;
  my $rc_textinclude_state=0;
  my @pack_stack;
  while (<FILEI>) {
    # Remove any trailing CtrlZ, which isn't strictly in the file
    if (/\x1A/) {
      s/\x1A//;
      last if (/^$/)
    }
    $line++;
    s/\r\n$/\n/;
    if (!/\n$/) {
      # Make sure all files are '\n' terminated
      $_ .= "\n";
    }
    if ($is_rc and !$is_mfc and /^(\s*)(\#\s*include\s*)\"afxres\.h\"/) {
      # VC6 automatically includes 'afxres.h', an MFC specific header, in
      # the RC files it generates (even in non-MFC projects). So we replace
      # it with 'winresrc.h' its very close standard cousin so that non MFC
      # projects can compile in Wine without the MFC sources.
      my $warning="mfc:afxres.h";
      if (!defined $warnings{$warning}) {
	$warnings{$warning}="1";
	print STDERR "warning: In non-MFC projects, winemaker replaces the MFC specific header 'afxres.h' with 'winresrc.h'\n";
	print STDERR "warning: the above warning is issued only once\n";
      }
      print FILEO "$1/* winemaker: $2\"afxres.h\" */\n";
      print FILEO "$1/* winemaker:warning: 'afxres.h' is an MFC specific header. Replacing it with 'winresrc.h' */\n";
      print FILEO "$1$2\"winresrc.h\"$'";
      $modified=1;

    } elsif (/^(\s*\#\s*include\s*)([\"<])([^\"]+)([\">])/) {
      my $from_file=($2 eq "<"?"":$dirname);
      my $real_include_name=get_real_include_name($line,$3,$from_file,$project,$target);
      print FILEO "$1$2$real_include_name$4$'";
      $modified|=($real_include_name ne $3);

    } elsif (s/^(\s*)(\#\s*pragma\s+pack\s*\(\s*)//) {
      # Pragma pack handling
      #
      # pack_stack is an array of references describing the stack of
      # pack directives currently in effect. Each directive if described
      # by a reference to an array containing:
      # - "push" for pack(push,...) directives, "" otherwise
      # - the directive's identifier at index 1
      # - the directive's alignment value at index 2
      #
      # Don't believe a word of what the documentation says: it's all wrong.
      # The code below is based on the actual behavior of Visual C/C++ 6.
      my $pack_indent=$1;
      my $pack_header=$2;
      if (/^(\))/) {
        # pragma pack()
        # Pushes the default stack alignment
        print FILEO "$pack_indent/* winemaker: $pack_header$1 */\n";
        print FILEO "$pack_indent/* winemaker:warning: Using 4 as the default alignment */\n";
        print_pack($pack_indent,4,$');
        push @pack_stack, [ "", "", 4 ];

      } elsif (/^(pop\s*(,\s*\d+\s*)?\))/) {
        # pragma pack(pop)
        # pragma pack(pop,n)
        # Goes up the stack until it finds a pack(push,...), and pops it
        # Ignores any pack(n) entry
        # Issues a warning if the pack is of the form pack(push,label)
        print FILEO "$pack_indent/* winemaker: $pack_header$1 */\n";
        my $pack_comment=$';
        $pack_comment =~ s/^\s*//;
        if ($pack_comment ne "") {
          print FILEO "$pack_indent$pack_comment";
        }
        while (1) {
          my $alignment=pop @pack_stack;
          if (!defined $alignment) {
            print FILEO "$pack_indent/* winemaker:warning: No pack(push,...) found. All the stack has been popped */\n";
            last;
          }
          if (@$alignment[1]) {
            print FILEO "$pack_indent/* winemaker:warning: Anonymous pop of pack(push,@$alignment[1]) (@$alignment[2]) */\n";
          }
          print FILEO "$pack_indent#include <poppack.h>\n";
          if (@$alignment[0]) {
            last;
          }
        }

      } elsif (/^(pop\s*,\s*(\w+)\s*(,\s*\d+\s*)?\))/) {
        # pragma pack(pop,label[,n])
        # Goes up the stack until finding a pack(push,...) and pops it.
        # 'n', if specified, is ignored.
        # Ignores any pack(n) entry
        # Issues a warning if the label of the pack does not match,
        # or if it is in fact a pack(push,n)
        my $label=$2;
        print FILEO "$pack_indent/* winemaker: $pack_header$1 */\n";
        my $pack_comment=$';
        $pack_comment =~ s/^\s*//;
        if ($pack_comment ne "") {
          print FILEO "$pack_indent$pack_comment";
        }
        while (1) {
          my $alignment=pop @pack_stack;
          if (!defined $alignment) {
            print FILEO "$pack_indent/* winemaker:warning: No pack(push,$label) found. All the stack has been popped */\n";
            last;
          }
          if (@$alignment[1] and @$alignment[1] ne $label) {
            print FILEO "$pack_indent/* winemaker:warning: Push/pop mismatch: \"@$alignment[1]\" (@$alignment[2]) != \"$label\" */\n";
          }
          print FILEO "$pack_indent#include <poppack.h>\n";
          if (@$alignment[0]) {
            last;
          }
        }

      } elsif (/^(push\s*\))/) {
        # pragma pack(push)
        # Push the current alignment
        print FILEO "$pack_indent/* winemaker: $pack_header$1 */\n";
        if (@pack_stack > 0) {
          my $alignment=$pack_stack[$#pack_stack];
          print_pack($pack_indent,@$alignment[2],$');
          push @pack_stack, [ "push", "", @$alignment[2] ];
        } else {
          print FILEO "$pack_indent/* winemaker:warning: Using 4 as the default alignment */\n";
          print_pack($pack_indent,4,$');
          push @pack_stack, [ "push", "", 4 ];
        }

      } elsif (/^((push\s*,\s*)?(\d+)\s*\))/) {
        # pragma pack([push,]n)
        # Push new alignment n
        print FILEO "$pack_indent/* winemaker: $pack_header$1 */\n";
        print_pack($pack_indent,$3,"$'");
        push @pack_stack, [ ($2 ? "push" : ""), "", $3 ];

      } elsif (/^((\w+)\s*\))/) {
        # pragma pack(label)
        # label must in fact be a macro that resolves to an integer
        # Then behaves like 'pragma pack(n)'
        print FILEO "$pack_indent/* winemaker: $pack_header$1 */\n";
        print FILEO "$pack_indent/* winemaker:warning: Assuming $2 == 4 */\n";
        print_pack($pack_indent,4,$');
        push @pack_stack, [ "", "", 4 ];

      } elsif (/^(push\s*,\s*(\w+)\s*(,\s*(\d+)\s*)?\))/) {
        # pragma pack(push,label[,n])
        # Pushes a new label on the stack. It is possible to push the same
        # label multiple times. If 'n' is omitted then the alignment is
        # unchanged. Otherwise it becomes 'n'.
        print FILEO "$pack_indent/* winemaker: $pack_header$1 */\n";
        my $size;
        if (defined $4) {
          $size=$4;
        } elsif (@pack_stack > 0) {
          my $alignment=$pack_stack[$#pack_stack];
          $size=@$alignment[2];
        } else {
          print FILEO "$pack_indent/* winemaker:warning: Using 4 as the default alignment */\n";
          $size=4;
        }
        print_pack($pack_indent,$size,$');
        push @pack_stack, [ "push", $2, $size ];

      } else {
        # pragma pack(???               -> What's that?
        print FILEO "$pack_indent/* winemaker:warning: Unknown type of pragma pack directive */\n";
        print FILEO "$pack_indent$pack_header$_";

      }
      $modified=1;

    } elsif ($is_rc) {
      if ($rc_block_depth == 0 and /^(\w+\s+(BITMAP|CURSOR|FONT|FONTDIR|ICON|MESSAGETABLE|TEXT|RTF)\s+((DISCARDABLE|FIXED|IMPURE|LOADONCALL|MOVEABLE|PRELOAD|PURE)\s+)*)([\"<]?)([^\">\r\n]+)([\">]?)/) {
	my $from_file=($5 eq "<"?"":$dirname);
	my $real_include_name=get_real_include_name($line,$6,$from_file,$project,$target);
	print FILEO "$1$5$real_include_name$7$'";
	$modified|=($real_include_name ne $6);

      } elsif (/^(\s*RCINCLUDE\s*)([\"<]?)([^\">\r\n]+)([\">]?)/) {
	my $from_file=($2 eq "<"?"":$dirname);
	my $real_include_name=get_real_include_name($line,$3,$from_file,$project,$target);
	print FILEO "$1$2$real_include_name$4$'";
	$modified|=($real_include_name ne $3);

      } elsif ($is_rc and !$is_mfc and $rc_block_depth == 0 and /^\s*\d+\s+TEXTINCLUDE\s*/) {
	$rc_textinclude_state=1;
	print FILEO;

      } elsif ($rc_textinclude_state == 3 and /^(\s*\"\#\s*include\s*\"\")afxres\.h(\"\"\\r\\n\")/) {
	print FILEO "$1winresrc.h$2$'";
	$modified=1;

      } elsif (/^\s*BEGIN(\W.*)?$/) {
	$rc_textinclude_state|=2;
	$rc_block_depth++;
	print FILEO;

      } elsif (/^\s*END(\W.*)?$/) {
	$rc_textinclude_state=0;
	if ($rc_block_depth>0) {
	  $rc_block_depth--;
	}
	print FILEO;

      } else {
	print FILEO;
      }

    } else {
      print FILEO;
    }
  }

  close(FILEI);
  close(FILEO);
  if ($opt_backup == 0 or $modified == 0) {
    if (!unlink("$filename.bak")) {
      print STDERR "error: unable to delete $filename.bak:\n";
      print STDERR "       $!\n";
    }
  }
}

##
# Analyzes each source file in turn to find and correct issues
# that would cause it not to compile.
sub fix_source()
{
  print "Fixing the source files...\n";
  foreach my $project (@projects) {
    foreach my $target (@$project[$P_SETTINGS],@{@$project[$P_TARGETS]}) {
      foreach my $source (@{@$target[$T_SOURCES_C]}, @{@$target[$T_SOURCES_CXX]}, @{@$target[$T_SOURCES_RC]}, @{@$target[$T_SOURCES_MISC]}) {
	fix_file($source,$project,$target);
      }
    }
  }
}



#####
#
# File generation
#
#####

##
# A convenience function to generate all the lists (defines,
# C sources, C++ source, etc.) in the Makefile
sub generate_list($$$;$)
{
  my $name=$_[0];
  my $last=$_[1];
  my $list=$_[2];
  my $data=$_[3];
  my $first=$name;

  if ($name) {
    printf FILEO "%-22s=",$name;
  }
  if (defined $list) {
    foreach my $item (@$list) {
      my $value;
      if (defined $data) {
        $value=&$data($item);
      } else {
        if (defined $item) {
          $value=$item;
        } else {
          $value="";
        }
      }
      if ($value ne "") {
	if ($first) {
	  print FILEO " $value";
	  $first=0;
	} else {
	  print FILEO " \\\n\t\t\t$value";
	}
      }
    }
  }
  if ($last) {
    print FILEO "\n";
  }
}

##
# Generates a project's Makefile and all the target files
sub generate_project_files($)
{
  my $project=$_[0];
  my $project_settings=@$project[$P_SETTINGS];
  my @dll_list=();
  my @lib_list=();
  my @exe_list=();

  # Then sort the targets and separate the libraries from the programs
  foreach my $target (sort { @$a[$T_NAME] cmp @$b[$T_NAME] } @{@$project[$P_TARGETS]}) {
    if (@$target[$T_TYPE] == $TT_DLL) {
      push @dll_list,$target;
    } elsif (@$target[$T_TYPE] == $TT_LIB) {
      push @lib_list,$target;
    } else {
      push @exe_list,$target;
    }
  }
  @$project[$P_TARGETS]=[];
  push @{@$project[$P_TARGETS]}, @dll_list;
  push @{@$project[$P_TARGETS]}, @lib_list;
  push @{@$project[$P_TARGETS]}, @exe_list;

  if (!open(FILEO,">@$project[$P_PATH]Makefile")) {
    print STDERR "error: could not open \"@$project[$P_PATH]/Makefile\" for writing\n";
    print STDERR "       $!\n";
    return;
  }

  print FILEO "### Generated by Winemaker $version\n";
  print FILEO "###\n";
  print FILEO "### Invocation command line was\n";
  print FILEO "### $0";
  foreach(@ARGV) {
    print FILEO " $_";
  }
  print FILEO "\n\n\n";

  generate_list("SRCDIR",1,[ "." ]);
  if (@$project[$P_PATH] eq "") {
    # This is the main project. It is also responsible for recursively
    # calling the other projects
    generate_list("SUBDIRS",1,\@projects,sub
		  {
		    if ($_[0] != \@main_project) {
		      my $subdir=@{$_[0]}[$P_PATH];
		      $subdir =~ s+/$++;
		      return $subdir;
		    }
		    # Eliminating the main project by returning undefined!
		  });
  }
  if (@{@$project[$P_TARGETS]} > 0) {
    generate_list("DLLS",1,\@dll_list,sub
		  {
		    return @{$_[0]}[$T_NAME];
		  });
    generate_list("LIBS",1,\@lib_list,sub
		  {
		    return @{$_[0]}[$T_NAME];
		  });
    generate_list("EXES",1,\@exe_list,sub
		  {
		    return "@{$_[0]}[$T_NAME]";
		  });
    print FILEO "\n\n\n";

    print FILEO "### Common settings\n\n";
    # Make it so that the project-wide settings override the global settings
    generate_list("CEXTRA",1,@$project_settings[$T_CEXTRA]);
    generate_list("CXXEXTRA",1,@$project_settings[$T_CXXEXTRA]);
    generate_list("RCEXTRA",1,@$project_settings[$T_RCEXTRA]);
    generate_list("DEFINES",1,@$project_settings[$T_DEFINES]);
    generate_list("INCLUDE_PATH",1,@$project_settings[$T_INCLUDE_PATH]);
    generate_list("DLL_PATH",1,@$project_settings[$T_DLL_PATH]);
    generate_list("DLL_IMPORTS",1,@$project_settings[$T_DLLS]);
    generate_list("LIBRARY_PATH",1,@$project_settings[$T_LIBRARY_PATH]);
    generate_list("LIBRARIES",1,@$project_settings[$T_LIBRARIES]);
    print FILEO "\n\n";

    my $extra_source_count=@{@$project_settings[$T_SOURCES_C]}+
                           @{@$project_settings[$T_SOURCES_CXX]}+
                           @{@$project_settings[$T_SOURCES_RC]};
    my $no_extra=($extra_source_count == 0);
    if (!$no_extra) {
      print FILEO "### Extra source lists\n\n";
      generate_list("EXTRA_C_SRCS",1,@$project_settings[$T_SOURCES_C]);
      generate_list("EXTRA_CXX_SRCS",1,@$project_settings[$T_SOURCES_CXX]);
      generate_list("EXTRA_RC_SRCS",1,@$project_settings[$T_SOURCES_RC]);
      print FILEO "\n";
      generate_list("EXTRA_OBJS",1,["\$(EXTRA_C_SRCS:.c=.o)","\$(EXTRA_CXX_SRCS:.cpp=.o)"]);
      print FILEO "\n\n\n";
    }

    # Iterate over all the targets...
    foreach my $target (@{@$project[$P_TARGETS]}) {
      print FILEO "### @$target[$T_NAME] sources and settings\n\n";
      my $canon=canonize("@$target[$T_NAME]");
      $canon =~ s+_so$++;

      generate_list("${canon}_MODULE",1,[@$target[$T_NAME]]);
      generate_list("${canon}_C_SRCS",1,@$target[$T_SOURCES_C]);
      generate_list("${canon}_CXX_SRCS",1,@$target[$T_SOURCES_CXX]);
      generate_list("${canon}_RC_SRCS",1,@$target[$T_SOURCES_RC]);
      generate_list("${canon}_LDFLAGS",1,@$target[$T_LDFLAGS]);
      generate_list("${canon}_ARFLAGS",1,@$target[$T_ARFLAGS]);
      generate_list("${canon}_DLL_PATH",1,@$target[$T_DLL_PATH]);
      generate_list("${canon}_DLLS",1,@$target[$T_DLLS]);
      generate_list("${canon}_LIBRARY_PATH",1,@$target[$T_LIBRARY_PATH]);
      generate_list("${canon}_LIBRARIES",1,@$target[$T_LIBRARIES]);
      print FILEO "\n";
      generate_list("${canon}_OBJS",1,["\$(${canon}_C_SRCS:.c=.o)","\$(${canon}_CXX_SRCS:.cpp=.o)","\$(${canon}_RC_SRCS:.rc=.res)"]);
      print FILEO "\n\n\n";
    }
    print FILEO "### Global source lists\n\n";
    generate_list("C_SRCS",$no_extra,@$project[$P_TARGETS],sub
		  {
		    my $canon=canonize(@{$_[0]}[$T_NAME]);
		    $canon =~ s+_so$++;
		    return "\$(${canon}_C_SRCS)";
		  });
    if (!$no_extra) {
      generate_list("",1,[ "\$(EXTRA_C_SRCS)" ]);
    }
    generate_list("CXX_SRCS",$no_extra,@$project[$P_TARGETS],sub
		  {
		    my $canon=canonize(@{$_[0]}[$T_NAME]);
		    $canon =~ s+_so$++;
		    return "\$(${canon}_CXX_SRCS)";
		  });
    if (!$no_extra) {
      generate_list("",1,[ "\$(EXTRA_CXX_SRCS)" ]);
    }
    generate_list("RC_SRCS",$no_extra,@$project[$P_TARGETS],sub
		  {
		    my $canon=canonize(@{$_[0]}[$T_NAME]);
		    $canon =~ s+_so$++;
		    return "\$(${canon}_RC_SRCS)";
		  });
    if (!$no_extra) {
      generate_list("",1,[ "\$(EXTRA_RC_SRCS)" ]);
    }
  }
  print FILEO "\n\n";
  print FILEO "### Tools\n\n";
  print FILEO "CC = winegcc\n";
  print FILEO "CXX = wineg++\n";
  print FILEO "RC = wrc\n";
  print FILEO "AR = ar\n";
  print FILEO "\n\n";

  print FILEO "### Generic targets\n\n";
  print FILEO "all:";
  if (@$project[$P_PATH] eq "") {
    print FILEO " \$(SUBDIRS)";
  }
  if (@{@$project[$P_TARGETS]} > 0) {
    print FILEO " \$(DLLS:%=%.so) \$(LIBS) \$(EXES)";
  }
  print FILEO "\n\n";
  print FILEO "### Build rules\n";
  print FILEO "\n";
  print FILEO ".PHONY: all clean dummy\n";
  print FILEO "\n";
  print FILEO "\$(SUBDIRS): dummy\n";
  print FILEO "\t\@cd \$\@ && \$(MAKE)\n";
  print FILEO "\n";
  print FILEO "# Implicit rules\n";
  print FILEO "\n";
  print FILEO ".SUFFIXES: .cpp .rc .res\n";
  print FILEO "DEFINCL = \$(INCLUDE_PATH) \$(DEFINES) \$(OPTIONS)\n";
  print FILEO "\n";
  print FILEO ".c.o:\n";
  print FILEO "\t\$(CC) -c \$(CFLAGS) \$(CEXTRA) \$(DEFINCL) -o \$\@ \$<\n";
  print FILEO "\n";
  print FILEO ".cpp.o:\n";
  print FILEO "\t\$(CXX) -c \$(CXXFLAGS) \$(CXXEXTRA) \$(DEFINCL) -o \$\@ \$<\n";
  print FILEO "\n";
  print FILEO ".cxx.o:\n";
  print FILEO "\t\$(CXX) -c \$(CXXFLAGS) \$(CXXEXTRA) \$(DEFINCL) -o \$\@ \$<\n";
  print FILEO "\n";
  print FILEO ".rc.res:\n";
  print FILEO "\t\$(RC) \$(RCFLAGS) \$(RCEXTRA) \$(DEFINCL) -fo\$@ \$<\n";
  print FILEO "\n";
  print FILEO "# Rules for cleaning\n";
  print FILEO "\n";
  print FILEO "CLEAN_FILES     = y.tab.c y.tab.h lex.yy.c core *.orig *.rej \\\n";
  print FILEO "                  \\\\\\#*\\\\\\# *~ *% .\\\\\\#*\n";
  print FILEO "\n";
  print FILEO "clean:: \$(SUBDIRS:%=%/__clean__) \$(EXTRASUBDIRS:%=%/__clean__)\n";
  print FILEO "\t\$(RM) \$(CLEAN_FILES) \$(RC_SRCS:.rc=.res) \$(C_SRCS:.c=.o) \$(CXX_SRCS:.cpp=.o)\n";
  print FILEO "\t\$(RM) \$(DLLS:%=%.so) \$(LIBS) \$(EXES) \$(EXES:%=%.so)\n";
  print FILEO "\n";
  print FILEO "\$(SUBDIRS:%=%/__clean__): dummy\n";
  print FILEO "\tcd `dirname \$\@` && \$(MAKE) clean\n";
  print FILEO "\n";
  print FILEO "\$(EXTRASUBDIRS:%=%/__clean__): dummy\n";
  print FILEO "\t-cd `dirname \$\@` && \$(RM) \$(CLEAN_FILES)\n";
  print FILEO "\n";

  if (@{@$project[$P_TARGETS]} > 0) {
    print FILEO "### Target specific build rules\n";
    print FILEO "DEFLIB = \$(LIBRARY_PATH) \$(LIBRARIES) \$(DLL_PATH) \$(DLL_IMPORTS:%=-l%)\n\n";
    foreach my $target (@{@$project[$P_TARGETS]}) {
      my $canon=canonize("@$target[$T_NAME]");
      $canon =~ s/_so$//;

      if (@$target[$T_TYPE] == $TT_DLL && (@$project_settings[$T_FLAGS] & $TF_HASDEF)) {
        print FILEO "\$(${canon}_MODULE).so: \$(${canon}_OBJS) \$(${canon}_MODULE:.dll=.def)\n";
      } elsif (@$target[$T_TYPE] == $TT_DLL) {
        print FILEO "\$(${canon}_MODULE).so: \$(${canon}_OBJS) \$(${canon}_MODULE:.dll=.spec)\n";
      } else {
        print FILEO "\$(${canon}_MODULE): \$(${canon}_OBJS)\n";
      }

      if (@$target[$T_TYPE] == $TT_LIB) {
        print FILEO "\t\$(AR) \$(${canon}_ARFLAGS) \$\@ \$(${canon}_OBJS)\n";
      } else {
        if (@{@$target[$T_SOURCES_CXX]} > 0 or @{@$project_settings[$T_SOURCES_CXX]} > 0) {
          print FILEO "\t\$(CXX)";
        } else {
          print FILEO "\t\$(CC)";
        }
        print FILEO " \$(${canon}_LDFLAGS) -o \$\@ \$(${canon}_OBJS) \$(${canon}_LIBRARY_PATH) \$(DEFLIB) \$(${canon}_DLLS:%=-l%) \$(${canon}_LIBRARIES:%=-l%)\n";
      }
      print FILEO "\n\n";
    }
  }
  close(FILEO);

}


##
# This is where we finally generate files. In fact this method does not
# do anything itself but calls the methods that do the actual work.
sub generate()
{
  print "Generating project files...\n";

  foreach my $project (@projects) {
    my $path=@$project[$P_PATH];
    if ($path eq "") {
      $path=".";
    } else {
      $path =~ s+/$++;
    }
    print "  $path\n";
    generate_project_files($project);
  }
}



#####
#
# Option defaults
#
#####

$opt_backup=1;
$opt_lower=$OPT_LOWER_UPPERCASE;
$opt_lower_include=1;

$opt_work_dir=undef;
$opt_single_target=undef;
$opt_target_type=$TT_GUIEXE;
$opt_flags=0;
$opt_arch=$OPT_ARCH_DEFAULT;
$opt_is_interactive=$OPT_ASK_NO;
$opt_ask_project_options=$OPT_ASK_NO;
$opt_ask_target_options=$OPT_ASK_NO;
$opt_no_generated_files=0;
$opt_no_source_fix=0;
$opt_no_banner=0;



#####
#
# Main
#
#####

sub print_banner()
{
  print "Winemaker $version\n";
  print "Copyright 2000-2004 Francois Gouget <fgouget\@codeweavers.com> for CodeWeavers\n";
  print "Copyright 2004 Dimitrie O. Paun\n";
  print "Copyright 2009-2011 André Hentschel\n";
}

sub usage()
{
  print_banner();
  print STDERR "Usage: winemaker [--nobanner] [--backup|--nobackup] [--nosource-fix]\n";
  print STDERR "                 [--lower-none|--lower-all|--lower-uppercase]\n";
  print STDERR "                 [--lower-include|--nolower-include] [--mfc|--nomfc]\n";
  print STDERR "                 [--guiexe|--windows|--cuiexe|--console|--dll|--lib]\n";
  print STDERR "                 [-Dmacro[=defn]] [-Idir] [-Pdir] [-idll] [-Ldir] [-llibrary]\n";
  print STDERR "                 [--nodlls] [--nomsvcrt] [--interactive] [--single-target name]\n";
  print STDERR "                 [--generated-files|--nogenerated-files]\n";
  print STDERR "                 [--wine32]\n";
  print STDERR "                 work_directory|project_file|workspace_file\n";
  print STDERR "\nWinemaker is designed to recursively convert all the Windows sources found in\n";
  print STDERR "the specified directory or project-file, so that they can be compiled with Winelib.\n";
  print STDERR "During this process it will modify and rename some of the corresponding files.\n";
  print STDERR "\tPlease read the manual page before use.\n";
  exit (2);
}

target_init(\@global_settings);

foreach(@ARGV) {
  my $arg=$_;
  # General options
  if ($arg eq "--nobanner") {
    $opt_no_banner=1;
  } elsif ($arg eq "--backup") {
    $opt_backup=1;
  } elsif ($arg eq "--nobackup") {
    $opt_backup=0;
  } elsif ($arg eq "--single-target") {
    $opt_single_target=shift @ARGV;
  } elsif ($arg eq "--lower-none") {
    $opt_lower=$OPT_LOWER_NONE;
  } elsif ($arg eq "--lower-all") {
    $opt_lower=$OPT_LOWER_ALL;
  } elsif ($arg eq "--lower-uppercase") {
    $opt_lower=$OPT_LOWER_UPPERCASE;
  } elsif ($arg eq "--lower-include") {
    $opt_lower_include=1;
  } elsif ($arg eq "--nolower-include") {
    $opt_lower_include=0;
  } elsif ($arg eq "--nosource-fix") {
    $opt_no_source_fix=1;
  } elsif ($arg eq "--generated-files") {
    $opt_no_generated_files=0;
  } elsif ($arg eq "--nogenerated-files") {
    $opt_no_generated_files=1;
  } elsif ($arg eq "--wine32") {
    $opt_arch=$OPT_ARCH_32;
  } elsif ($arg =~ /^-D/) {
    push @{$global_settings[$T_DEFINES]},$arg;
  } elsif ($arg =~ /^-I/) {
    push @{$global_settings[$T_INCLUDE_PATH]},$arg;
  } elsif ($arg =~ /^-P/) {
    push @{$global_settings[$T_DLL_PATH]},"-L$'";
  } elsif ($arg =~ /^-i/) {
    push @{$global_settings[$T_DLLS]},$';
  } elsif ($arg =~ /^-L/) {
    push @{$global_settings[$T_LIBRARY_PATH]},$arg;
  } elsif ($arg =~ /^-l/) {
    push @{$global_settings[$T_LIBRARIES]},$arg;

  # 'Source'-based method options
  } elsif ($arg eq "--dll") {
    $opt_target_type=$TT_DLL;
  } elsif ($arg eq "--lib") {
    $opt_target_type=$TT_LIB;
  } elsif ($arg eq "--guiexe" or $arg eq "--windows") {
    $opt_target_type=$TT_GUIEXE;
  } elsif ($arg eq "--cuiexe" or $arg eq "--console") {
    $opt_target_type=$TT_CUIEXE;
  } elsif ($arg eq "--interactive") {
    $opt_is_interactive=$OPT_ASK_YES;
    $opt_ask_project_options=$OPT_ASK_YES;
    $opt_ask_target_options=$OPT_ASK_YES;
  } elsif ($arg eq "--mfc") {
    $opt_flags|=$TF_MFC;
  } elsif ($arg eq "--nomfc") {
    $opt_flags&=~$TF_MFC;
    $opt_flags|=$TF_NOMFC;
  } elsif ($arg eq "--nodlls") {
    $opt_flags|=$TF_NODLLS;
  } elsif ($arg eq "--nomsvcrt") {
    $opt_flags|=$TF_NOMSVCRT;

  # Catch errors
  } else {
    if ($arg ne "--help" and $arg ne "-h" and $arg ne "-?") {
        if (!defined $opt_work_dir and !defined $opt_work_file) {
            if (-f $arg) {
                $opt_work_file=$arg;
            }
            else {
                $opt_work_dir=$arg;
            }
        } else {
            print STDERR "error: the work directory, \"$arg\", has already been specified (was \"$opt_work_dir\")\n";
            usage();
        }
    } else {
        usage();
    }
  }
}

if (!defined $opt_work_dir and !defined $opt_work_file) {
  print STDERR "error: you must specify the directory or project file containing the sources to be converted\n";
  usage();
} elsif (defined $opt_work_dir and !chdir $opt_work_dir) {
  print STDERR "error: could not chdir to the work directory\n";
  print STDERR "       $!\n";
  usage();
}

if ($opt_no_banner == 0) {
  print_banner();
}

project_init(\@main_project, "", \@global_settings);

# Fix the file and directory names
fix_file_and_directory_names(".");

# Scan the sources to identify the projects and targets
source_scan();

# Fix the source files
if (! $opt_no_source_fix) {
  fix_source();
}

# Generate the Makefile and the spec file
if (! $opt_no_generated_files) {
  generate();
}
