#!/usr/bin/perl -w

# Copyright 2000 Francois Gouget for CodeWeavers
# fgouget@codeweavers.com
#
my $version="0.5.7";

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;


# General options

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

##
# 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;


# 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;

##
# 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 any file, i.e. 
# no makefiles, but also no .spec files, no configure.in, etc.
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;

##
# Defines the target's enty point, i.e. the function that is called
# on startup.
my $T_INIT=2;

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

##
# 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=4;
my $T_SOURCES_CXX=5;
my $T_SOURCES_RC=6;
my $T_SOURCES_MISC=7;

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

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

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

##
# The list of Windows libraries to import
my $T_IMPORTS=11;

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

##
# The list of dependencies between targets
my $T_DEPENDS=13;


# 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;


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

##
# This target needs a wrapper
my $TF_WRAP=1;

##
# This target is a wrapper
my $TF_WRAPPER=2;

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

##
# 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;
  # leaving $T_INIT undefined
  @$target[$T_FLAGS]=$opt_flags;
  @$target[$T_SOURCES_C]=[];
  @$target[$T_SOURCES_CXX]=[];
  @$target[$T_SOURCES_RC]=[];
  @$target[$T_SOURCES_MISC]=[];
  @$target[$T_DEFINES]=[];
  @$target[$T_INCLUDE_PATH]=[];
  @$target[$T_LIBRARY_PATH]=[];
  @$target[$T_IMPORTS]=[];
  @$target[$T_LIBRARIES]=[];
  @$target[$T_DEPENDS]=[];
}

sub get_default_init
{
  my $type=$_[0];
  if ($type == $TT_GUIEXE) {
    return "WinMain";
  } elsif ($type == $TT_CUIEXE) {
    return "main";
  } elsif ($type == $TT_DLL) {
    return "DllMain";
  }
}



#####
#
# 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=$_[0];
  my $path=$_[1];

  my $project_settings=[];
  target_init($project_settings);

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



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

my %warnings;

my %templates;

##
# 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;

##
# If one of the projects requires the MFc then we set this global variable 
# to true so that configure asks the user to provide a path tothe MFC
my $needs_mfc=0;



#####
#
# 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 =~ /^[\/~\$]/);
}

##
# Performs a binary search looking for the specified item
sub bsearch
{
  my $array=$_[0];
  my $item=$_[1];
  my $last=@{$array}-1;
  my $first=0;

  while ($first<=$last) {
    my $index=int(($first+$last)/2);
    my $cmp=@$array[$index] cmp $item;
    if ($cmp<0) {
      $first=$index+1;
    } elsif ($cmp>0) {
      $last=$index-1;
    } else {
      return $index;
    }
  }
}



#####
#
# '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 $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 =~ /^-L/) {
      push @{@$target[$T_LIBRARY_PATH]},$option;
    } elsif ($option =~ /^-i/) {
      push @{@$target[$T_IMPORTS]},$';
    } elsif ($option =~ /^-l/) {
      push @{@$target[$T_LIBRARIES]},$';
    } elsif (@$target[$T_TYPE] != $TT_DLL and 
             $option =~ /^--wrap/) {
      @$target[$T_FLAGS]|=$TF_WRAP;
    } elsif (@$target[$T_TYPE] != $TT_DLL and 
             $option =~ /^--nowrap/) {
      @$target[$T_FLAGS]&=~$TF_WRAP;
    } elsif ($option =~ /^--mfc/) {
      @$target[$T_FLAGS]|=$TF_MFC;
      if (@$target[$T_TYPE] != $TT_DLL) {
        @$target[$T_FLAGS]|=$TF_WRAP;
      }
    } elsif ($option =~ /^--nomfc/) {
      @$target[$T_FLAGS]&=~$TF_MFC;
      @$target[$T_FLAGS]&=~($TF_MFC|$TF_WRAP);
    } else {
      print STDERR "error: unknown option \"$option\"\n";
      return 0;
    }
  }
  return 1;
}

##
# 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
{
  # 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;
  # 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 @dsp_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);
  }
  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 $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)$/i, @{get_directory_contents("$fullentry")};
	foreach $candidate (@candidates) {
	  if ($candidate =~ s/\.exe$//i) {
	    $targets{$candidate}=1;
	  } elsif ($candidate =~ s/^(.*)\.dll$/lib$1.so/i) {
	    $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 =~ s/\.exe$//i) {
	$targets{$dentry}=1;
      } elsif ($dentry =~ s/^(.*)\.dll$/lib$1.so/i) {
	$targets{$dentry}=1;
      } elsif ($dentry =~ /\.c$/i and $dentry !~ /\.spec\.c$/) {
	push @sources_c,"$dentry";
      } elsif ($dentry =~ /\.(cpp|cxx)$/i) {
	if ($dentry =~ /^stdafx.cpp$/i) {
	  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 =~ /\.(h|hxx|hpp|inl|rc2|dlg)$/i) {
	push @sources_misc,"$dentry";
	if ($dentry =~ /^stdafx.h$/i) {
	  @$project_settings[$T_FLAGS]|=$TF_MFC;
	}
      } elsif ($dentry =~ /\.dsp$/i) {
	push @dsp_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;
      }
    }
  }
  closedir(DIRECTORY);

  # 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 (@dsp_files > 0) {
	$prj_list=\@dsp_files;
      } else {
	$prj_list=\@mak_files;
      }
      foreach $filename (@$prj_list) {
	$filename =~ s/\.(dsp|mak)$//i;
	if ($opt_target_type == $TT_DLL) {
	  $filename = "lib$filename.so";
	}
	$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 = "lib$name.so";
	}
	$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 $target (split /,/,$target_list) {
	  $target =~ s+^\s*++;
	  $target =~ s+\s*$++;
	  # Also accept .exe and .dll as a courtesy
	  $target =~ s+(.*)\.dll$+lib$1.so+;
	  $target =~ s+\.exe$++;
	  $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";
    }
    if ((@$project_settings[$T_FLAGS] & $TF_WRAP)!=0) {
      if ($flag_desc ne "") {
	$flag_desc.=", ";
      }
      $flag_desc.="wrapped";
    }
    print "* Type any project-wide options (-D/-I/-L/-i/-l/--mfc/--wrap),\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_imports=();
  my @local_depends=();
  my @exe_list=();
  foreach $target_name (sort { $b cmp $a } keys %targets) {
    # Create the target...
    my $basename;
    my $target=[];
    target_init($target);
    @$target[$T_NAME]=$target_name;
    @$target[$T_FLAGS]|=@$project_settings[$T_FLAGS];
    if ($target_name =~ /^lib(.*)\.so$/) {
      @$target[$T_TYPE]=$TT_DLL;
      @$target[$T_INIT]=get_default_init($TT_DLL);
      @$target[$T_FLAGS]&=~$TF_WRAP;
      $basename=$1;
      push @local_depends,$target_name;
      push @local_imports,$basename;
    } else {
      @$target[$T_TYPE]=$opt_target_type;
      @$target[$T_INIT]=get_default_init($opt_target_type);
      $basename=$target_name;
      push @exe_list,$target;
    }
    # This is the default link list of Visual Studio, except odbccp32 
    # which we don't have in Wine. Also I add ntdll which seems 
    # necessary for Winelib.
    my @std_imports=qw(advapi32.dll comdlg32.dll gdi32.dll kernel32.dll ntdll.dll odbc32.dll ole32.dll oleaut32.dll shell32.dll user32.dll winspool.drv);
    @$target[$T_IMPORTS]=\@std_imports;
    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 ((@$target[$T_FLAGS] & $TF_WRAP)!=0) {
	if ($flag_desc ne "") {
	  $flag_desc.=", ";
	} else {
	  $flag_desc=" (";
	}
	$flag_desc.="wrapped";
      }
      if ($flag_desc ne "") {
	$flag_desc.=")";
      }
      print "* Specify any link option (-L/-i/-l/--mfc/--wrap) 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_LIBRARY_PATH]},"\$(MFC_LIBRARY_PATH)";
      push @{@$target[$T_IMPORTS]},"mfc.dll";
      # FIXME: Link with the MFC in the Unix sense, until we 
      # start exporting the functions properly.
      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 $source (@sources_c) {
	if ($source =~ /^$basename/i) {
	  push @{@$target[$T_SOURCES_C]},$source;
	  $source="";
	}
      }
      foreach $source (@sources_cxx) {
	if ($source =~ /^$basename/i) {
	  push @{@$target[$T_SOURCES_CXX]},$source;
	  $source="";
	}
      }
      foreach $source (@sources_rc) {
	if ($source =~ /^$basename/i) {
	  push @{@$target[$T_SOURCES_RC]},$source;
	  $source="";
	}
      }
      foreach $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_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 $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 $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 $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 $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_imports > 0 and @exe_list > 0) {
    foreach $target (@exe_list) {
      push @{@$target[$T_LIBRARY_PATH]},"-L.";
      push @{@$target[$T_IMPORTS]},map { "$_.dll" } @local_imports;
      # Also link in the Unix sense since none of the functions 
      # will be exported.
      push @{@$target[$T_LIBRARIES]},@local_imports;
      push @{@$target[$T_DEPENDS]},@local_depends;
    }
  }
}

##
# 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);
    if ($opt_target_type == $TT_DLL) {
      @$main_target[$T_NAME]="lib$opt_single_target.so";
    } else {
      @$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;

  # 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;
}



#####
#
# 'vc.dsp'-based Project analysis
#
#####

#sub analyze_vc_dsp
#{
#  
#}



#####
#
# Creating the wrapper targets
#
#####

sub postprocess_targets
{
  foreach $project (@projects) {
    foreach $target (@{@$project[$P_TARGETS]}) {
      if ((@$target[$T_FLAGS] & $TF_WRAP) != 0) {
	my $wrapper=[];
	target_init($wrapper);
	@$wrapper[$T_NAME]=@$target[$T_NAME];
	@$wrapper[$T_TYPE]=@$target[$T_TYPE];
	@$wrapper[$T_INIT]=get_default_init(@$target[$T_TYPE]);
	@$wrapper[$T_FLAGS]=$TF_WRAPPER | (@$target[$T_FLAGS] & $TF_MFC);
	@$wrapper[$T_IMPORTS]=[ "kernel32.dll", "ntdll.dll", "user32.dll" ];
	push @{@$wrapper[$T_SOURCES_C]},"@$wrapper[$T_NAME]_wrapper.c";

	my $index=bsearch(@$target[$T_SOURCES_C],"@$wrapper[$T_NAME]_wrapper.c");
	if (defined $index) {
	  splice(@{@$target[$T_SOURCES_C]},$index,1);
	}
	@$target[$T_NAME]="lib@$target[$T_NAME].so";
	@$target[$T_TYPE]=$TT_DLL;

	push @{@$project[$P_TARGETS]},$wrapper;
      }
      if ((@$target[$T_FLAGS] & $TF_MFC) != 0) {
	@{@$project[$P_SETTINGS]}[$T_FLAGS]|=$TF_MFC;
	$needs_mfc=1;
      }
    }
  }
}



#####
#
# 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 ' ', '$', '#', ...
sub fix_file_and_directory_names
{
  my $dirname=$_[0];

  if (opendir(DIRECTORY, "$dirname")) {
    foreach $dentry (readdir DIRECTORY) {
      if ($dentry =~ /^\./ or $dentry eq "CVS") {
	next;
      }
      # Set $warn to 1 if the user should be warned of the renaming
      my $warn=0;

      # autoconf and make don't support these characters well
      my $new_name=$dentry;
      $new_name =~ s/[ \$]/_/g;

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

      # 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;
      }

      # 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;
	}
      }
      if (-d "$dirname/$new_name") {
	fix_file_and_directory_names("$dirname/$new_name");
      }
    }
    closedir(DIRECTORY);
  }
}



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

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

##
# 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;
}

##
# 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="";

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

  foreach $component (@$path) {
    #print "    looking for $component in \"$dirname\"\n";
    if ($component eq ".") {
      # Pass it as is
      $real_path.="./";
    } elsif ($component eq "..") {
      # Go up one level
      $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 $dentry (@$directory) {
	if ($dentry =~ /^$component$/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 $include (@{@$target[$T_INCLUDE_PATH]}, @{@$project_settings[$T_INCLUDE_PATH]}) {
      my $dirname=$include;
      $dirname=~ s+^-I++;
      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 $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";
  #FIXME:assuming that because there is a .bak file, this is what we want is 
  #probably flawed. Or is it???
  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>) {
    $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 'winres.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 'winres.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 'winres.h' */\n";
      print FILEO "$1$2\"winres.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 alignement 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 "$1winres.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 $project (@projects) {
    foreach $target (@$project[$P_SETTINGS],@{@$project[$P_TARGETS]}) {
      if (@$target[$T_FLAGS] & $TF_WRAPPER) {
	next;
      }
      foreach $source (@{@$target[$T_SOURCES_C]}, @{@$target[$T_SOURCES_CXX]}, @{@$target[$T_SOURCES_RC]}, @{@$target[$T_SOURCES_MISC]}) {
	fix_file($source,$project,$target);
      }
    }
  }
}



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

##
# Generates a target's .spec file
sub generate_spec_file
{
  my $path=$_[0];
  my $target=$_[1];
  my $project_settings=$_[2];

  my $basename=@$target[$T_NAME];
  $basename =~ s+\.so$++;
  if (@$target[$T_FLAGS] & $TF_WRAP) {
    $basename =~ s+^lib++;
  } elsif (@$target[$T_FLAGS] & $TF_WRAPPER) {
    $basename.="_wrapper";
  }

  if (!open(FILEO,">$path$basename.spec")) {
    print STDERR "error: could not open \"$path$basename.spec\" for writing\n";
    print STDERR "       $!\n";
    return;
  }

  my $module=$basename;
  $module =~ s+^lib++;
  $module=canonize($module);
  print FILEO "name    $module\n";
  print FILEO "type    win32\n";
  if (@$target[$T_TYPE] == $TT_GUIEXE) {
    print FILEO "mode    guiexe\n";
  } elsif (@$target[$T_TYPE] == $TT_CUIEXE) {
    print FILEO "mode    cuiexe\n";
  } else {
    print FILEO "mode    dll\n";
  }
  if (defined @$target[$T_INIT] and ((@$target[$T_FLAGS] & $TF_WRAP) == 0)) {
    print FILEO "init    @$target[$T_INIT]\n";
  }
  if (@{@$target[$T_SOURCES_RC]} > 0) {
    if (@{@$target[$T_SOURCES_RC]} > 1) {
      print STDERR "warning: the target $basename has more than one RC file. Modify the Makefile.in to remove redundant RC files, and fix the spec file\n";
    }
    my $rcname=@{@$target[$T_SOURCES_RC]}[0];
    $rcname =~ s+\.rc$++i;
    $rcname =~ s+([^/\w])+\\$1+g;
    print FILEO "rsrc    $rcname.res\n";
  }
  print FILEO "\n";
  my %imports;
  foreach $library (@{$global_settings[$T_IMPORTS]}) {
    if (!defined $imports{$library}) {
      print FILEO "import $library\n";
      $imports{$library}=1;
    }
  }
  if (defined $project_settings) {
    foreach $library (@{@$project_settings[$T_IMPORTS]}) {
      if (!defined $imports{$library}) {
        print FILEO "import $library\n";
        $imports{$library}=1;
      }
    }
  }
  foreach $library (@{@$target[$T_IMPORTS]}) {
    if (!defined $imports{$library}) {
      print FILEO "import $library\n";
      $imports{$library}=1;
    }
  }

  # Don't forget to export the 'Main' function for wrapped executables, 
  # except for MFC ones!
  if (@$target[$T_FLAGS] == $TF_WRAP) {
    if (@$target[$T_TYPE] == $TT_GUIEXE) {
      print FILEO "\n@ stdcall @$target[$T_INIT](long long ptr long) @$target[$T_INIT]\n";
    } elsif (@$target[$T_TYPE] == $TT_CUIEXE) {
      print FILEO "\n@ stdcall @$target[$T_INIT](long ptr ptr) @$target[$T_INIT]\n";
    } else {
      print FILEO "\n@ stdcall @$target[$T_INIT](ptr long ptr) @$target[$T_INIT]\n";
    }
  }

  close(FILEO);
}

##
# Generates a target's wrapper file
sub generate_wrapper_file
{
  my $path=$_[0];
  my $target=$_[1];

  if (!defined $templates{"wrapper.c"}) {
    print STDERR "winemaker: internal error: No template called 'wrapper.c'\n";
    return;
  }

  if (!open(FILEO,">$path@$target[$T_NAME]_wrapper.c")) {
    print STDERR "error: unable to open \"$path$basename.c\" for writing:\n";
    print STDERR "       $!\n";
    return;
  }
  my $app_name="\"@$target[$T_NAME]\"";
  my $app_type=(@$target[$T_TYPE]==$TT_GUIEXE?"GUIEXE":"CUIEXE");
  my $app_init=(@$target[$T_TYPE]==$TT_GUIEXE?"\"WinMain\"":"\"main\"");
  my $app_mfc=(@$target[$T_FLAGS] & $TF_MFC?"\"mfc\"":NULL);
  foreach $line (@{$templates{"wrapper.c"}}) {
    my $l=$line;
    $l =~ s/\#\#WINEMAKER_APP_NAME\#\#/$app_name/;
    $l =~ s/\#\#WINEMAKER_APP_TYPE\#\#/$app_type/;
    $l =~ s/\#\#WINEMAKER_APP_INIT\#\#/$app_init/;
    $l =~ s/\#\#WINEMAKER_APP_MFC\#\#/$app_mfc/;
    print FILEO $l;
  }
  close(FILEO);
}

##
# 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 $item (@$list) {
      my $value;
      if (defined $data) {
	$value=&$data($item);
      } else {
	$value=$item;
      }
      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.in and all the target files
sub generate_project_files
{
  my $project=$_[0];
  my $project_settings=@$project[$P_SETTINGS];
  my @dll_list=();
  my @exe_list=();

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

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

  print FILEO "### Generated by Winemaker\n";
  print FILEO "\n\n";

  print FILEO "### Generic autoconf variables\n\n";
  generate_list("TOPSRCDIR",1,[ "\@top_srcdir\@" ]);
  generate_list("TOPOBJDIR",1,[ "." ]);
  generate_list("SRCDIR",1,[ "\@srcdir\@" ]);
  generate_list("VPATH",1,[ "\@srcdir\@" ]);
  print FILEO "\n";
  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("EXES",1,\@exe_list,sub 
		  {
		    return "@{$_[0]}[$T_NAME]";
		  });
    print FILEO "\n\n\n";

    print FILEO "### Global settings\n\n";
    # Make it so that the project-wide settings override the global settings
    generate_list("DEFINES",0,@$project_settings[$T_DEFINES],sub 
		  {
		    return "$_[0]";
		  });
    generate_list("",1,$global_settings[$T_DEFINES],sub 
		  {
		    return "$_[0]";
		  });
    generate_list("INCLUDE_PATH",$no_extra,@$project_settings[$T_INCLUDE_PATH],sub 
		  {
		    return "$_[0]";
		  });
    generate_list("",1,$global_settings[$T_INCLUDE_PATH],sub 
		  {
		    if ($_[0] !~ /^-I/) {
		      return "$_[0]";
		    }
		    if (is_absolute($')) {
		      return "$_[0]";
		    }
		    return "-I\$(TOPSRCDIR)/$'";
		  });
    generate_list("LIBRARY_PATH",$no_extra,@$project_settings[$T_LIBRARY_PATH],sub 
		  {
		    return "$_[0]";
		  });
    generate_list("",1,$global_settings[$T_LIBRARY_PATH],sub 
		  {
		    if ($_[0] !~ /^-L/) {
		      return "$_[0]";
		    }
		    if (is_absolute($')) {
		      return "$_[0]";
		    }
		    return "-L\$(TOPSRCDIR)/$'";
		  });
    generate_list("LIBRARIES",$no_extra,@$project_settings[$T_LIBRARIES],sub 
		  {
		    return "$_[0]";
		  });
    generate_list("",1,$global_settings[$T_LIBRARIES],sub 
		  {
		    return "$_[0]";
		  });
    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 $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}_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]);
      my $basename=@$target[$T_NAME];
      $basename =~ s+\.so$++;
      if (@$target[$T_FLAGS] & $TF_WRAP) {
	$basename =~ s+^lib++;
      } elsif (@$target[$T_FLAGS] & $TF_WRAPPER) {
	$basename.="_wrapper";
      }
      generate_list("${canon}_SPEC_SRCS",1,[ "$basename.spec"]);
      generate_list("${canon}_LIBRARY_PATH",1,@$target[$T_LIBRARY_PATH],sub 
		    {
		      return "$_[0]";
		    });
      generate_list("${canon}_LIBRARIES",1,@$target[$T_LIBRARIES],sub 
		    {
		      return "$_[0]";
		    });
      generate_list("${canon}_DEPENDS",1,@$target[$T_DEPENDS],sub 
		    {
		      return "$_[0]";
		    });
      print FILEO "\n";
      generate_list("${canon}_OBJS",1,["\$(${canon}_C_SRCS:.c=.o)","\$(${canon}_CXX_SRCS:.cpp=.o)","\$(EXTRA_OBJS)"]);
      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)" ]);
    }
    generate_list("SPEC_SRCS",1,@$project[$P_TARGETS],sub 
		  {
		    my $canon=canonize(@{$_[0]}[$T_NAME]);
		    $canon =~ s+_so$++;
		    return "\$(${canon}_SPEC_SRCS)";
		  });
  }
  print FILEO "\n\n\n";

  print FILEO "### Generic autoconf targets\n\n";
  print FILEO "all: ";
  if (@$project[$P_PATH] eq "") {
    print FILEO "\$(SUBDIRS)";
  }
  if (@{@$project[$P_TARGETS]} > 0) {
    print FILEO "\$(DLLS) \$(EXES:%=%.so)";
  }
  print FILEO "\n\n";
  print FILEO "\@MAKE_RULES\@\n";
  print FILEO "\n";
  print FILEO "install::\n";
  if (@$project[$P_PATH] eq "") {
    # This is the main project. It is also responsible for recursively 
    # calling the other projects
    print FILEO "\tfor i in \$(SUBDIRS); do (cd \$\$i; \$(MAKE) install) || exit 1; done\n";
  }
  if (@{@$project[$P_TARGETS]} > 0) {
    print FILEO "\tfor i in \$(EXES); do \$(INSTALL_PROGRAM) \$\$i \$(bindir); done\n";
    print FILEO "\tfor i in \$(EXES:%=%.so) \$(DLLS); do \$(INSTALL_LIBRARY) \$\$i \$(libdir); done\n";
  }
  print FILEO "\n";
  print FILEO "uninstall::\n";
  if (@$project[$P_PATH] eq "") {
    # This is the main project. It is also responsible for recursively 
    # calling the other projects
    print FILEO "\tfor i in \$(SUBDIRS); do (cd \$\$i; \$(MAKE) uninstall) || exit 1; done\n";
  }
  if (@{@$project[$P_TARGETS]} > 0) {
    print FILEO "\tfor i in \$(EXES); do \$(RM) \$(bindir)/\$\$i;done\n";
    print FILEO "\tfor i in \$(EXES:%=%.so) \$(DLLS); do \$(RM) \$(libdir)/\$\$i;done\n";
  }
  print FILEO "\n\n\n";
    
  if (@{@$project[$P_TARGETS]} > 0) {
    print FILEO "### Target specific build rules\n\n";
    foreach $target (@{@$project[$P_TARGETS]}) {
      my $canon=canonize("@$target[$T_NAME]");
      $canon =~ s/_so$//;
      print FILEO "\$(${canon}_SPEC_SRCS:.spec=.tmp.o): \$(${canon}_OBJS)\n";
      print FILEO "\t\$(LDCOMBINE) \$(${canon}_OBJS) -o \$\@\n";
      print FILEO "\t-\$(STRIP) \$(STRIPFLAGS) \$\@\n";
      print FILEO "\n";
      print FILEO "\$(${canon}_SPEC_SRCS:.spec=.spec.c): \$(${canon}_SPEC_SRCS:.spec) \$(${canon}_SPEC_SRCS:.spec=.tmp.o) \$(${canon}_RC_SRCS:.rc=.res)\n";
      print FILEO "\t\$(LD_PATH) \$(WINEBUILD) -fPIC \$(${canon}_LIBRARY_PATH) \$(WINE_LIBRARY_PATH) -sym \$(${canon}_SPEC_SRCS:.spec=.tmp.o) -o \$\@ -spec \$(${canon}_SPEC_SRCS)\n";
      print FILEO "\n";
      my $t_name=@$target[$T_NAME];
      if (@$target[$T_TYPE]!=$TT_DLL) {
        $t_name.=".so";
      }
      print FILEO "$t_name: \$(${canon}_SPEC_SRCS:.spec=.spec.o) \$(${canon}_OBJS) \$(${canon}_DEPENDS) \n";
      if (@{@$target[$T_SOURCES_CXX]} > 0 or @{@$project_settings[$T_SOURCES_CXX]} > 0) {
        print FILEO "\t\$(LDXXSHARED)";
      } else {
        print FILEO "\t\$(LDSHARED)";
      }
      print FILEO " \$(LDDLLFLAGS) -o \$\@ \$(${canon}_OBJS) \$(${canon}_SPEC_SRCS:.spec=.spec.o) \$(${canon}_LIBRARY_PATH) \$(${canon}_LIBRARIES:%=-l%) \$(DLL_LINK) \$(LIBS)\n";
      if (@$target[$T_TYPE] ne $TT_DLL) {
        print FILEO "\ttest -e @$target[$T_NAME] || \$(LN_S) \$(WINE) @$target[$T_NAME]\n";
      }
      print FILEO "\n\n";
    }
  }
  close(FILEO);
 
  foreach $target (@{@$project[$P_TARGETS]}) {
    generate_spec_file(@$project[$P_PATH],$target,$project_settings);
    if (@$target[$T_FLAGS] & $TF_WRAPPER) {
      generate_wrapper_file(@$project[$P_PATH],$target);
    }
  }
}

##
# Perform the replacements in the template configure files
# Return 1 for success, 0 for failure
sub generate_configure
{
  my $filename=$_[0];
  my $a_source_file=$_[1];

  if (!defined $templates{$filename}) {
    if ($filename ne "configure") {
      print STDERR "winemaker: internal error: No template called '$filename'\n";
    }
    return 0;
  }

  if (!open(FILEO,">$filename")) {
    print STDERR "error: unable to open \"$filename\" for writing:\n";
    print STDERR "       $!\n";
    return 0;
  }
  foreach $line (@{$templates{$filename}}) {
    if ($line =~ /^\#\#WINEMAKER_PROJECTS\#\#$/) {
      foreach $project (@projects) {
	print FILEO "@$project[$P_PATH]Makefile\n";
      }
    } else {
      $line =~ s+\#\#WINEMAKER_SOURCE\#\#+$a_source_file+;
      $line =~ s+\#\#WINEMAKER_NEEDS_MFC\#\#+$needs_mfc+;
      print FILEO $line;
    }
  }
  close(FILEO);
  return 1;
}

sub generate_generic
{
  my $filename=$_[0];

  if (!defined $templates{$filename}) {
    print STDERR "winemaker: internal error: No template called '$filename'\n";
    return;
  }
  if (!open(FILEO,">$filename")) {
    print STDERR "error: unable to open \"$filename\" for writing:\n";
    print STDERR "       $!\n";
    return;
  }
  foreach $line (@{$templates{$filename}}) {
    print FILEO $line;
  }
  close(FILEO);
}

##
# Generates the global files:
# configure
# configure.in
# Make.rules.in
sub generate_global_files
{
  generate_generic("Make.rules.in");

  # Get the name of a source file for configure.in
  my $a_source_file;
  search_a_file: foreach $project (@projects) {
    foreach $target (@{@$project[$P_TARGETS]}, @$project[$P_SETTINGS]) {
      $a_source_file=@{@$target[$T_SOURCES_C]}[0];
      if (!defined $a_source_file) {
	$a_source_file=@{@$target[$T_SOURCES_CXX]}[0];
      }
      if (!defined $a_source_file) {
	$a_source_file=@{@$target[$T_SOURCES_RC]}[0];
      }
      if (defined $a_source_file) {
	$a_source_file="@$project[$P_PATH]$a_source_file";
	last search_a_file;
      }
    }
  }
  if (!defined $a_source_file) {
    $a_source_file="Makefile.in";
  }

  generate_configure("configure.in",$a_source_file);
  unlink("configure");
  if (generate_configure("configure",$a_source_file) == 0) {
    system("autoconf");
  }
  # Add execute permission to configure for whoever has the right to read it
  my @st=stat("configure");
  if (@st) {
    my $mode=$st[2];
    $mode|=($mode & 0444) >>2;
    chmod($mode,"configure");
  } else {
    print "warning: could not generate the configure script. You need to run autoconf\n";
  }
}

##
# 
sub generate_read_templates
{
  my $file;

  while (<DATA>) {
    if (/^--- ((\w\.?)+) ---$/) {
      my $filename=$1;
      if (defined $templates{$filename}) {
        print STDERR "winemaker: internal error: There is more than one template for $filename\n";
        undef $file;
      } else {
        $file=[];
        $templates{$filename}=$file;
      }
    } elsif (defined $file) {
      push @$file, $_;
    }
  }
}

##
# 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";
  generate_read_templates();
  generate_global_files();

  foreach $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=<undefined>
# $opt_single_target=<undefined>
$opt_target_type=$TT_GUIEXE;
$opt_flags=0;
$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_banner=0;



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

sub print_banner
{
  print "Winemaker $version\n";
  print "Copyright 2000 Francois Gouget <fgouget\@codeweavers.com> for CodeWeavers\n";
}

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


project_init(\@main_project,"");

while (@ARGV>0) {
  my $arg=shift @ARGV;
  # 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 "--generated-files") {
    $opt_no_generated_files=0;
  } elsif ($arg eq "--nogenerated-files") {
    $opt_no_generated_files=1;

  } elsif ($arg =~ /^-D/) {
    push @{$global_settings[$T_DEFINES]},$arg;
  } elsif ($arg =~ /^-I/) {
    push @{$global_settings[$T_INCLUDE_PATH]},$arg;
  } elsif ($arg =~ /^-L/) {
    push @{$global_settings[$T_LIBRARY_PATH]},$arg;
  } elsif ($arg =~ /^-i/) {
    push @{$global_settings[$T_IMPORTS]},$';
  } elsif ($arg =~ /^-l/) {
    push @{$global_settings[$T_LIBRARIES]},$';

  # 'Source'-based method options
  } elsif ($arg eq "--dll") {
    $opt_target_type=$TT_DLL;
  } 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 "--wrap") {
    $opt_flags|=$TF_WRAP;
  } elsif ($arg eq "--nowrap") {
    $opt_flags&=~$TF_WRAP;
  } elsif ($arg eq "--mfc") {
    $opt_flags|=$TF_MFC;
    $opt_flags|=$TF_MFC|$TF_WRAP;
    $needs_mfc=1;
  } elsif ($arg eq "--nomfc") {
    $opt_flags&=~($TF_MFC|$TF_WRAP);
    $needs_mfc=0;

  # Catch errors
  } else {
    if ($arg ne "--help" and $arg ne "-h" and $arg ne "-?") {
      if (!defined $opt_work_dir) {
        $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) {
  print STDERR "error: you must specify the directory containing the sources to be converted\n";
  usage();
} elsif (!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();
}

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

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

# Create targets for wrappers, etc.
postprocess_targets();

# Fix the source files
fix_source();

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


__DATA__
--- configure.in ---
dnl Process this file with autoconf to produce a configure script.
dnl Author: Michael Patra   <micky@marie.physik.tu-berlin.de>
dnl                         <patra@itp1.physik.tu-berlin.de>
dnl         Francois Gouget <fgouget@codeweavers.com> for CodeWeavers

AC_REVISION([configure.in 1.00])
AC_INIT(##WINEMAKER_SOURCE##)

NEEDS_MFC=##WINEMAKER_NEEDS_MFC##

dnl **** Command-line arguments ****

AC_SUBST(OPTIONS)

dnl **** Check for some programs ****

AC_PROG_MAKE_SET
AC_PROG_CC
AC_PROG_CXX
AC_PROG_CPP
AC_PATH_XTRA
AC_PROG_RANLIB
AC_PROG_LN_S
AC_PATH_PROG(LDCONFIG, ldconfig, true, /sbin:/usr/sbin:$PATH)

dnl **** Check for some libraries ****

dnl Check for -lm for BeOS
AC_CHECK_LIB(m,sqrt)
dnl Check for -li386 for NetBSD and OpenBSD
AC_CHECK_LIB(i386,i386_set_ldt)
dnl Check for -lossaudio for NetBSD
AC_CHECK_LIB(ossaudio,_oss_ioctl)
dnl Check for -lw for Solaris
AC_CHECK_LIB(w,iswalnum)
dnl Check for -lnsl for Solaris
AC_CHECK_FUNCS(gethostbyname,, AC_CHECK_LIB(nsl, gethostbyname, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl", AC_CHECK_LIB(socket, gethostbyname, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl", , -lnsl), -lsocket))
dnl Check for -lsocket for Solaris
AC_CHECK_FUNCS(connect,,AC_CHECK_LIB(socket,connect))
dnl Check for -lxpg4 for FreeBSD
AC_CHECK_LIB(xpg4,setrunelocale)
dnl Check for -lmmap for OS/2
AC_CHECK_LIB(mmap,mmap)
dnl Check for openpty
AC_CHECK_FUNCS(openpty,,
	AC_CHECK_LIB(util,openpty,
		AC_DEFINE(HAVE_OPENPTY)
		LIBS="$LIBS -lutil"
	))

AC_CHECK_HEADERS(dlfcn.h,
	AC_CHECK_FUNCS(dlopen,
		AC_DEFINE(HAVE_DL_API),
    		AC_CHECK_LIB(dl,dlopen,
			AC_DEFINE(HAVE_DL_API)
			LIBS="$LIBS -ldl",
		)
	),
)

dnl **** Check which curses lib to use ***
if test "$CURSES" = "yes"
then
    AC_CHECK_HEADERS(ncurses.h)
    if test "$ac_cv_header_ncurses_h" = "yes"
    then 
        AC_CHECK_LIB(ncurses,waddch)
    fi
    if test "$ac_cv_lib_ncurses_waddch" = "yes"
    then
        AC_CHECK_LIB(ncurses,resizeterm,AC_DEFINE(HAVE_RESIZETERM))
        AC_CHECK_LIB(ncurses,getbkgd,AC_DEFINE(HAVE_GETBKGD))
    else
        AC_CHECK_HEADERS(curses.h)
        if test "$ac_cv_header_curses_h" = "yes"
        then    
            AC_CHECK_LIB(curses,waddch)
            if test "$ac_cv_lib_curses_waddch" = "yes"
            then
                AC_CHECK_LIB(curses,resizeterm,AC_DEFINE(HAVE_RESIZETERM))
                AC_CHECK_LIB(curses,getbkgd,AC_DEFINE(HAVE_GETBKGD))
            fi
        fi
    fi
fi

dnl **** If ln -s doesn't work, use cp instead ****
if test "$ac_cv_prog_LN_S" = "ln -s"; then : ; else LN_S=cp ; fi

dnl **** Check for gcc strength-reduce bug ****

if test "x${GCC}" = "xyes"
then
  AC_CACHE_CHECK( "for gcc strength-reduce bug", ac_cv_c_gcc_strength_bug,
                  AC_TRY_RUN([
int main(void) {
  static int Array[[3]];
  unsigned int B = 3;
  int i;
  for(i=0; i<B; i++) Array[[i]] = i - 3;
  exit( Array[[1]] != -2 );
}],
    ac_cv_c_gcc_strength_bug="no",
    ac_cv_c_gcc_strength_bug="yes",
    ac_cv_c_gcc_strength_bug="yes") )
  if test "$ac_cv_c_gcc_strength_bug" = "yes"
  then
    CFLAGS="$CFLAGS -fno-strength-reduce"
  fi
fi

dnl **** Check for underscore on external symbols ****

AC_CACHE_CHECK("whether external symbols need an underscore prefix",
               ac_cv_c_extern_prefix,
[saved_libs=$LIBS
LIBS="conftest_asm.s $LIBS"
cat > conftest_asm.s <<EOF
	.globl _ac_test
_ac_test:
	.long 0
EOF
AC_TRY_LINK([extern int ac_test;],[if (ac_test) return 1],
            ac_cv_c_extern_prefix="yes",ac_cv_c_extern_prefix="no")
LIBS=$saved_libs])
if test "$ac_cv_c_extern_prefix" = "yes"
then
  AC_DEFINE(NEED_UNDERSCORE_PREFIX)
fi

dnl **** Check for working dll ****

LDSHARED=""
LDXXSHARED=""
LDDLLFLAGS=""
AC_CACHE_CHECK("whether we can build a Linux dll",
               ac_cv_c_dll_linux,
[saved_cflags=$CFLAGS
CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0,-Bsymbolic"
AC_TRY_LINK(,[return 1],ac_cv_c_dll_linux="yes",ac_cv_c_dll_linux="no")
CFLAGS=$saved_cflags
])
if test "$ac_cv_c_dll_linux" = "yes"
then
  LDSHARED="\$(CC) -shared -Wl,-rpath,\$(libdir)"
  LDXXSHARED="\$(CXX) -shared -Wl,-rpath,\$(libdir)"
  LDDLLFLAGS="-Wl,-Bsymbolic"
else
  AC_CACHE_CHECK(whether we can build a UnixWare (Solaris) dll,
                ac_cv_c_dll_unixware,
  [saved_cflags=$CFLAGS
  CFLAGS="$CFLAGS -fPIC -Wl,-G,-h,conftest.so.1.0,-B,symbolic"
  AC_TRY_LINK(,[return 1],ac_cv_c_dll_unixware="yes",ac_cv_c_dll_unixware="no")
  CFLAGS=$saved_cflags
  ])
  if test "$ac_cv_c_dll_unixware" = "yes"
  then
    LDSHARED="\$(CC) -Wl,-G"
    LDXXSHARED="\$(CXX) -Wl,-G"
    LDDLLFLAGS="-Wl,-B,symbolic"
  else
    AC_CACHE_CHECK("whether we can build a NetBSD dll",
                   ac_cv_c_dll_netbsd,
    [saved_cflags=$CFLAGS
    CFLAGS="$CFLAGS -fPIC -Wl,-Bshareable,-Bforcearchive"
    AC_TRY_LINK(,[return 1],ac_cv_c_dll_netbsd="yes",ac_cv_c_dll_netbsd="no")
    CFLAGS=$saved_cflags
    ])
    if test "$ac_cv_c_dll_netbsd" = "yes"
    then
      LDSHARED="\$(CC) -Wl,-Bshareable,-Bforcearchive"
      LDXXSHARED="\$(CXX) -Wl,-Bshareable,-Bforcearchive"
      LDDLLFLAGS="" #FIXME
    fi
  fi
fi
if test "$ac_cv_c_dll_linux" = "no" -a "$ac_cv_c_dll_unixware" = "no" -a "$ac_cv_c_dll_netbsd" = "no"
then
  AC_MSG_ERROR([Could not find how to build a dynamically linked library])
fi

CFLAGS="$CFLAGS -fPIC"
DLL_LINK="\$(WINE_LIBRARY_PATH) \$(LIBRARY_PATH) \$(LIBRARIES:%=-l%) -lwine -lwine_unicode -lwine_uuid"

AC_SUBST(DLL_LINK)
AC_SUBST(LDSHARED)
AC_SUBST(LDXXSHARED)
AC_SUBST(LDDLLFLAGS)

dnl *** check for the need to define __i386__

AC_CACHE_CHECK("whether we need to define __i386__",ac_cv_cpp_def_i386,
 AC_EGREP_CPP(yes,[#if (defined(i386) || defined(__i386)) && !defined(__i386__)
yes
#endif],
 ac_cv_cpp_def_i386="yes", ac_cv_cpp_def_i386="no"))
if test "$ac_cv_cpp_def_i386" = "yes"
then
    CFLAGS="$CFLAGS -D__i386__"
fi

dnl $GCC is set by autoconf
GCC_NO_BUILTIN=""
if test "$GCC" = "yes"
then
    GCC_NO_BUILTIN="-fno-builtin"
fi
AC_SUBST(GCC_NO_BUILTIN)

dnl **** Test Winelib-related features of the C++ compiler
AC_LANG_CPLUSPLUS()
if test "x${GCC}" = "xyes"
then
  OLDCXXFLAGS="$CXXFLAGS";
  CXXFLAGS="-fpermissive";
  AC_CACHE_CHECK("for g++ -fpermissive option", has_gxx_permissive,
    AC_TRY_COMPILE(,[
        for (int i=0;i<2;i++);
        i=0;
      ],
      [has_gxx_permissive="yes"],
      [has_gxx_permissive="no"])
   )
  CXXFLAGS="-fno-for-scope";
  AC_CACHE_CHECK("for g++ -fno-for-scope option", has_gxx_no_for_scope,
    AC_TRY_COMPILE(,[
        for (int i=0;i<2;i++);
        i=0;
      ],
      [has_gxx_no_for_scope="yes"],
      [has_gxx_no_for_scope="no"])
   )
  CXXFLAGS="$OLDCXXFLAGS";
  if test "$has_gxx_permissive" = "yes"
  then
    CXXFLAGS="$CXXFLAGS -fpermissive"
  fi
  if test "$has_gxx_no_for_scope" = "yes"
  then
    CXXFLAGS="$CXXFLAGS -fno-for-scope"
  fi
fi
AC_LANG_C()

dnl **** Test Winelib-related features of the C compiler
dnl none for now

dnl **** Macros for finding a headers/libraries in a collection of places

dnl AC_PATH_HEADER(variable,header,action-if-not-found,default-locations)
dnl Note that the above may set variable to an empty value if the header is 
dnl already in the include path
AC_DEFUN(AC_PATH_HEADER,[
AC_MSG_CHECKING([for $2])
AC_CACHE_VAL(ac_cv_path_$1,
[
  ac_found=
  ac_dummy="ifelse([$4], , :/usr/local/include, [$4])"
  save_CPPFLAGS="$CPPFLAGS"
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  for ac_dir in $ac_dummy; do
    IFS="$ac_save_ifs"
    if test -z "$ac_dir"
    then
      CPPFLAGS="$save_CPPFLAGS"
    else
      CPPFLAGS="-I$ac_dir $save_CPPFLAGS"
    fi
    AC_TRY_COMPILE([#include <$2>],,ac_found=1;ac_cv_path_$1="$ac_dir";break)
  done
  CPPFLAGS="$save_CPPFLAGS"
  ifelse([$3],,,[if test -z "$ac_found"
    then
      $3
    fi
  ])
])
$1="$ac_cv_path_$1"
if test -n "$ac_found" -o -n "[$]$1"
then
  AC_MSG_RESULT([$]$1)
else
  AC_MSG_RESULT(no)
fi
AC_SUBST($1)
])

dnl AC_PATH_LIBRARY(variable,libraries,extra libs,action-if-not-found,default-locations)
AC_DEFUN(AC_PATH_LIBRARY,[
AC_MSG_CHECKING([for $2])
AC_CACHE_VAL(ac_cv_path_$1,
[
  ac_found=
  ac_dummy="ifelse([$5], , :/usr/local/lib, [$5])"
  save_LIBS="$LIBS"
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  for ac_dir in $ac_dummy; do
    IFS="$ac_save_ifs"
    if test -z "$ac_dir"
    then
      LIBS="$2 $3 $save_LIBS"
    else
      LIBS="-L$ac_dir $2 $3 $save_LIBS"
    fi
    AC_TRY_LINK(,,ac_found=1;ac_cv_path_$1="$ac_dir";break)
  done
  LIBS="$save_LIBS"
  ifelse([$4],,,[if test -z "$ac_found"
    then
      $4
    fi
  ])
])
$1="$ac_cv_path_$1"
if test -n "$ac_found" -o -n "[$]$1"
then
  AC_MSG_RESULT([$]$1)
else
  AC_MSG_RESULT(no)
fi
AC_SUBST($1)
])

dnl **** Try to find where winelib is located ****

LD_PATH="";
WINE_INCLUDE_ROOT="";
WINE_INCLUDE_PATH="";
WINE_LIBRARY_ROOT="";
WINE_LIBRARY_PATH="";
WINE_TOOL_PATH="";
WINE="";
WINEBUILD="";
WRC="";

AC_ARG_WITH(wine,
[  --with-wine=DIR           the Wine package (or sources) is in DIR],
[if test "$withval" != "no"; then
  WINE_ROOT="$withval";
  WINE_INCLUDES="";
  WINE_LIBRARIES="";
  WINE_TOOLS="";
else
  WINE_ROOT="";
fi])
if test -n "$WINE_ROOT"
then
  WINE_INCLUDE_ROOT="$WINE_ROOT/include:$WINE_ROOT/include/wine";
  WINE_LIBRARY_ROOT="$WINE_ROOT";
  WINE_TOOL_PATH="$WINE_ROOT:$WINE_ROOT/bin:$WINE_ROOT/tools/wrc:$WINE_ROOT/tools/winebuild:$PATH";
fi

AC_ARG_WITH(wine-includes,
[  --with-wine-includes=DIR  the Wine includes are in DIR],
[if test "$withval" != "no"; then
  WINE_INCLUDES="$withval";
else
  WINE_INCLUDES="";
fi])
if test -n "$WINE_INCLUDES"
then
  WINE_INCLUDE_ROOT="$WINE_INCLUDES";
fi

AC_ARG_WITH(wine-libraries,
[  --with-wine-libraries=DIR the Wine libraries are in DIR],
[if test "$withval" != "no"; then
  WINE_LIBRARIES="$withval";
else
  WINE_LIBRARIES="";
fi])
if test -n "$WINE_LIBRARIES"
then
  WINE_LIBRARY_ROOT="$WINE_LIBRARIES";
fi

AC_ARG_WITH(wine-tools,
[  --with-wine-tools=DIR     the Wine tools are in DIR],
[if test "$withval" != "no"; then
  WINE_TOOLS="$withval";
else
  WINE_TOOLS="";
fi])
if test -n "$WINE_TOOLS"
then
  WINE_TOOL_PATH="$WINE_TOOLS:$WINE_TOOLS/wrc:$WINE_TOOLS/winebuild";
fi

if test -z "$WINE_INCLUDE_ROOT"
then
  WINE_INCLUDE_ROOT=":/usr/include/wine:/usr/local/include/wine:/opt/wine/include:/opt/wine/include/wine";
fi
AC_PATH_HEADER(WINE_INCLUDE_ROOT,windef.h,[
  AC_MSG_ERROR([Could not find the Wine includes])
],$WINE_INCLUDE_ROOT)
if test -n "$WINE_INCLUDE_ROOT"
then
  WINE_INCLUDE_PATH="-I$WINE_INCLUDE_ROOT"
else
  WINE_INCLUDE_PATH=""
fi

if test -z "$WINE_LIBRARY_ROOT"
then
  WINE_LIBRARY_ROOT=":/usr/lib/wine:/usr/local/lib:/usr/local/lib/wine:/opt/wine/lib";
else
  WINE_LIBRARY_ROOT="$WINE_LIBRARY_ROOT:$WINE_LIBRARY_ROOT/lib";
fi
AC_PATH_LIBRARY(WINE_LIBRARY_ROOT,[-lwine],[-lutil],[
  AC_MSG_ERROR([Could not find the Wine libraries (libwine.so)])
],$WINE_LIBRARY_ROOT)
if test -n "$WINE_LIBRARY_ROOT"
then
  WINE_LIBRARY_PATH="-L$WINE_LIBRARY_ROOT"
else
  WINE_LIBRARY_PATH=""
fi
AC_PATH_LIBRARY(LIBNTDLL_PATH,[-lntdll],[$WINE_LIBRARY_PATH -lwine -lwine_unicode -lncurses -ldl -lutil],[
  AC_MSG_ERROR([Could not find the Wine libraries (libntdll.so)])
],[$WINE_LIBRARY_ROOT:$WINE_LIBRARY_ROOT/dlls])
if test -n "$LIBNTDLL_PATH" -a "-L$LIBNTDLL_PATH" != "$WINE_LIBRARY_PATH"
then
  WINE_LIBRARY_PATH="$WINE_LIBRARY_PATH -L$LIBNTDLL_PATH"
fi
if test -n "$WINE_LIBRARY_PATH"
then
  LD_PATH="LD_LIBRARY_PATH=\"`echo $WINE_LIBRARY_PATH | sed -e 's/ *-L/:/g' -e 's/^://' -e 's/ *$//'`:\$\$LD_LIBRARY_PATH\""
fi

if test -z "$WINE_TOOL_PATH"
then
  WINE_TOOL_PATH="$PATH:/usr/local/bin:/opt/wine/bin";
fi
AC_PATH_PROG(WINE,wine,,$WINE_TOOL_PATH)
if test -z "$WINE"
then
  AC_MSG_ERROR([Could not find Wine's wine tool])
fi
AC_PATH_PROG(WINEBUILD,winebuild,,$WINE_TOOL_PATH)
if test -z "$WINEBUILD"
then
  AC_MSG_ERROR([Could not find Wine's winebuild tool])
fi
AC_PATH_PROG(WRC,wrc,,$WINE_TOOL_PATH)
if test -z "$WRC"
then
  AC_MSG_ERROR([Could not find Wine's wrc tool])
fi

AC_SUBST(LD_PATH)
AC_SUBST(WINE_INCLUDE_PATH)
AC_SUBST(WINE_LIBRARY_PATH)

dnl **** Try to find where the MFC are located ****
AC_LANG_CPLUSPLUS()

if test "x$NEEDS_MFC" = "x1"
then
  ATL_INCLUDE_ROOT="";
  ATL_INCLUDE_PATH="";
  MFC_INCLUDE_ROOT="";
  MFC_INCLUDE_PATH="";
  MFC_LIBRARY_ROOT="";
  MFC_LIBRARY_PATH="";

  AC_ARG_WITH(mfc,
  [  --with-mfc=DIR            the MFC package (or sources) is in DIR],
  [if test "$withval" != "no"; then
    MFC_ROOT="$withval";
    ATL_INCLUDES="";
    MFC_INCLUDES="";
    MFC_LIBRARIES="";
  else
    MFC_ROOT="";
  fi])
  if test -n "$MFC_ROOT"
  then
    ATL_INCLUDE_ROOT="$MFC_ROOT";
    MFC_INCLUDE_ROOT="$MFC_ROOT";
    MFC_LIBRARY_ROOT="$MFC_ROOT";
  fi

  AC_ARG_WITH(atl-includes,
  [  --with-atl-includes=DIR   the ATL includes are in DIR],
  [if test "$withval" != "no"; then
    ATL_INCLUDES="$withval";
  else
    ATL_INCLUDES="";
  fi])
  if test -n "$ATL_INCLUDES"
  then
    ATL_INCLUDE_ROOT="$ATL_INCLUDES";
  fi

  AC_ARG_WITH(mfc-includes,
  [  --with-mfc-includes=DIR   the MFC includes are in DIR],
  [if test "$withval" != "no"; then
    MFC_INCLUDES="$withval";
  else
    MFC_INCLUDES="";
  fi])
  if test -n "$MFC_INCLUDES"
  then
    MFC_INCLUDE_ROOT="$MFC_INCLUDES";
  fi

  AC_ARG_WITH(mfc-libraries,
  [  --with-mfc-libraries=DIR  the MFC libraries are in DIR],
  [if test "$withval" != "no"; then
    MFC_LIBRARIES="$withval";
  else
    MFC_LIBRARIES="";
  fi])
  if test -n "$MFC_LIBRARIES"
  then
    MFC_LIBRARY_ROOT="$MFC_LIBRARIES";
  fi

  OLDCPPFLAGS="$CPPFLAGS"
  dnl FIXME: We should not have defines in any of the include paths
  CPPFLAGS="$WINE_INCLUDE_PATH -I$WINE_INCLUDE_ROOT/mixedcrt -D_DLL -D_MT $CPPFLAGS"
  ATL_INCLUDE_PATH="-I\$(WINE_INCLUDE_ROOT)/mixedcrt -D_DLL -D_MT"
  if test -z "$ATL_INCLUDE_ROOT"
  then
    ATL_INCLUDE_ROOT=":$WINE_INCLUDE_ROOT/atl:/usr/include/atl:/usr/local/include/atl:/opt/mfc/include/atl:/opt/atl/include"
  else
    ATL_INCLUDE_ROOT="$ATL_INCLUDE_ROOT:$ATL_INCLUDE_ROOT/atl:$ATL_INCLUDE_ROOT/atl/include"
  fi
  AC_PATH_HEADER(ATL_INCLUDE_ROOT,atldef.h,[
    AC_MSG_ERROR([Could not find the ATL includes])
  ],$ATL_INCLUDE_ROOT)
  if test -n "$ATL_INCLUDE_ROOT"
  then
    ATL_INCLUDE_PATH="$ATL_INCLUDE_PATH -I$ATL_INCLUDE_ROOT"
  fi

  MFC_INCLUDE_PATH="$ATL_INCLUDE_PATH"
  if test -z "$MFC_INCLUDE_ROOT"
  then
    MFC_INCLUDE_ROOT=":$WINE_INCLUDE_ROOT/mfc:/usr/include/mfc:/usr/local/include/mfc:/opt/mfc/include/mfc:/opt/mfc/include"
  else
    MFC_INCLUDE_ROOT="$MFC_INCLUDE_ROOT:$MFC_INCLUDE_ROOT/mfc:$MFC_INCLUDE_ROOT/mfc/include"
  fi
  AC_PATH_HEADER(MFC_INCLUDE_ROOT,afx.h,[
    AC_MSG_ERROR([Could not find the MFC includes])
  ],$MFC_INCLUDE_ROOT)
  if test -n "$MFC_INCLUDE_ROOT" -a "$ATL_INCLUDE_ROOT" != "$MFC_INCLUDE_ROOT"
  then
    MFC_INCLUDE_PATH="$MFC_INCLUDE_PATH -I$MFC_INCLUDE_ROOT"
  fi
  CPPFLAGS="$OLDCPPFLAGS"

  if test -z "$MFC_LIBRARY_ROOT"
  then
    MFC_LIBRARY_ROOT=":$WINE_LIBRARY_ROOT:/usr/lib/mfc:/usr/local/lib:/usr/local/lib/mfc:/opt/mfc/lib";
  else
    MFC_LIBRARY_ROOT="$MFC_LIBRARY_ROOT:$MFC_LIBRARY_ROOT/lib:$MFC_LIBRARY_ROOT/mfc/src";
  fi
  AC_PATH_LIBRARY(MFC_LIBRARY_ROOT,[-lmfc],[$WINE_LIBRARY_PATH -lwine -lwine_unicode],[
    AC_MSG_ERROR([Could not find the MFC library])
  ],$MFC_LIBRARY_ROOT)
  if test -n "$MFC_LIBRARY_ROOT" -a "$MFC_LIBRARY_ROOT" != "$WINE_LIBRARY_ROOT"
  then
    MFC_LIBRARY_PATH="-L$MFC_LIBRARY_ROOT"
  else
    MFC_LIBRARY_PATH=""
  fi

  AC_SUBST(ATL_INCLUDE_PATH)
  AC_SUBST(MFC_INCLUDE_PATH)
  AC_SUBST(MFC_LIBRARY_PATH)
fi

AC_LANG_C()

dnl **** Generate output files ****

MAKE_RULES=Make.rules
AC_SUBST_FILE(MAKE_RULES)

AC_OUTPUT([
Make.rules
##WINEMAKER_PROJECTS##
 ])

echo
echo "Configure finished.  Do 'make' to build the project."
echo

dnl Local Variables:
dnl comment-start: "dnl "
dnl comment-end: ""
dnl comment-start-skip: "\\bdnl\\b\\s *"
dnl compile-command: "autoconf"
dnl End:
--- Make.rules.in ---
# Copyright 2000 Francois Gouget for CodeWeavers
# fgouget@codeweavers.com
#
# Global rules shared by all makefiles     -*-Makefile-*-
#
# Each individual makefile must define the following variables:
# WINE_INCLUDE_ROOT: Wine's headers location
# WINE_LIBRARY_ROOT: Wine's libraries location
# TOPOBJDIR    : top-level object directory
# SRCDIR       : source directory for this module
#
# Each individual makefile may define the following additional variables:
#
# SUBDIRS      : subdirectories that contain a Makefile
# DLLS         : WineLib libraries to be built
# EXES         : WineLib executables to be built
#
# CEXTRA       : extra c flags (e.g. '-Wall')
# CXXEXTRA     : extra c++ flags (e.g. '-Wall')
# WRCEXTRA     : extra wrc flags (e.g. '-p _SysRes')
# DEFINES      : defines (e.g. -DSTRICT)
# INCLUDE_PATH : additional include path
# LIBRARY_PATH : additional library path
# LIBRARIES    : additional Unix libraries to link with
#
# C_SRCS       : C sources for the module
# CXX_SRCS     : C++ sources for the module
# RC_SRCS      : resource source files
# SPEC_SRCS    : interface definition files


# Where is Wine

WINE_INCLUDE_ROOT = @WINE_INCLUDE_ROOT@
WINE_INCLUDE_PATH = @WINE_INCLUDE_PATH@
WINE_LIBRARY_ROOT = @WINE_LIBRARY_ROOT@
WINE_LIBRARY_PATH = @WINE_LIBRARY_PATH@

LD_PATH           = @LD_PATH@

# Where are the MFC

ATL_INCLUDE_ROOT = @ATL_INCLUDE_ROOT@
ATL_INCLUDE_PATH = @ATL_INCLUDE_PATH@
MFC_INCLUDE_ROOT = @MFC_INCLUDE_ROOT@
MFC_INCLUDE_PATH = @MFC_INCLUDE_PATH@
MFC_LIBRARY_ROOT = @MFC_LIBRARY_ROOT@
MFC_LIBRARY_PATH = @MFC_LIBRARY_PATH@

# First some useful definitions

SHELL     = /bin/sh
CC        = @CC@
CPP       = @CPP@
WRC       = @WRC@
CFLAGS    = @CFLAGS@
CXXFLAGS  = @CXXFLAGS@
WRCFLAGS  = -r -L
OPTIONS   = @OPTIONS@ -D_REENTRANT -DWINELIB
X_CFLAGS  = @X_CFLAGS@
X_LIBS    = @X_LIBS@
XLIB      = @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@
DLL_LINK  = @DLL_LINK@
LIBS      = @LIBS@ $(LIBRARY_PATH)
YACC      = @YACC@
LEX       = @LEX@
LEXLIB    = @LEXLIB@
LN_S      = @LN_S@
ALLFLAGS  = $(DEFINES) -I$(SRCDIR) $(WINE_INCLUDE_PATH) $(INCLUDE_PATH)
ALLCFLAGS = $(CFLAGS) $(CEXTRA) $(OPTIONS) $(X_CFLAGS) $(ALLFLAGS)
ALLCXXFLAGS=$(CXXFLAGS) $(CXXEXTRA) $(OPTIONS) $(X_CFLAGS) $(ALLFLAGS)
ALLWRCFLAGS=$(WRCFLAGS) $(WRCEXTRA) $(OPTIONS) $(ALLFLAGS)
LDCOMBINE = ld -r
LDSHARED  = @LDSHARED@
LDXXSHARED= @LDXXSHARED@
LDDLLFLAGS= @LDDLLFLAGS@
STRIP     = strip
STRIPFLAGS= --strip-unneeded
RM        = rm -f
MV        = mv
MKDIR     = mkdir -p
WINE      = @WINE@
WINEBUILD = @WINEBUILD@
@SET_MAKE@

# Installation infos

INSTALL         = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA    = @INSTALL_DATA@
prefix          = @prefix@
exec_prefix     = @exec_prefix@
bindir          = @bindir@
libdir          = @libdir@
infodir         = @infodir@
mandir          = @mandir@
prog_manext     = 1
conf_manext     = 5

OBJS            = $(C_SRCS:.c=.o) $(CXX_SRCS:.cpp=.o) \
                  $(SPEC_SRCS:.spec=.spec.o) 
CLEAN_FILES     = *.spec.c y.tab.c y.tab.h lex.yy.c \
                  core *.orig *.rej \
                  \\\#*\\\# *~ *% .\\\#*

# Implicit rules

.SUFFIXES: .cpp .rc .res .tmp.o .spec .spec.c .spec.o

.c.o:
	$(CC) -c $(ALLCFLAGS) -o $@ $<

.cpp.o:
	$(CXX) -c $(ALLCXXFLAGS) -o $@ $<

.cxx.o:
	$(CXX) -c $(ALLCXXFLAGS) -o $@ $<

.rc.res:
	$(LD_PATH) $(WRC) $(ALLWRCFLAGS) -o $@ $<

.PHONY: all install uninstall clean distclean depend dummy

# 'all' target first in case the enclosing Makefile didn't define any target

all: Makefile

# Rules for makefile

Makefile: Makefile.in $(TOPSRCDIR)/configure
	@echo Makefile is older than $?, please rerun $(TOPSRCDIR)/configure
	@exit 1

# Rules for cleaning

$(SUBDIRS:%=%/__clean__): dummy
	cd `dirname $@` && $(MAKE) clean

$(EXTRASUBDIRS:%=%/__clean__): dummy
	-cd `dirname $@` && $(RM) $(CLEAN_FILES)

clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__)
	$(RM) $(CLEAN_FILES) $(RC_SRCS:.rc=.res) $(OBJS) $(SPEC_SRCS:.spec=.tmp.o) $(EXES) $(EXES:%=%.so) $(DLLS)

# Rules for installing

$(SUBDIRS:%=%/__install__): dummy
	cd `dirname $@` && $(MAKE) install

$(SUBDIRS:%=%/__uninstall__): dummy
	cd `dirname $@` && $(MAKE) uninstall

# Misc. rules

$(SUBDIRS): dummy
	@cd $@ && $(MAKE)

dummy:

# End of global rules
--- wrapper.c ---
/*
 * Copyright 2000 Francois Gouget <fgouget@codeweavers.com> for CodeWeavers
 */

#include <dlfcn.h>
#include <windows.h>



/*
 * Describe the wrapped application
 */

/**
 * This is either CUIEXE for a console based application or
 * GUIEXE for a regular windows application.
 */
#define      APP_TYPE      ##WINEMAKER_APP_TYPE##

/**
 * This is the application library's base name, i.e. 'hello' if the 
 * library is called 'libhello.so'.
 */
static char* appName     = ##WINEMAKER_APP_NAME##;

/**
 * This is the name of the application's Windows module. If left NULL 
 * then appName is used.
 */
static char* appModule   = NULL;

/**
 * This is the application's entry point. This is usually "WinMain" for a 
 * GUIEXE and 'main' for a CUIEXE application.
 */
static char* appInit     = ##WINEMAKER_APP_INIT##;

/**
 * This is either non-NULL for MFC-based applications and is the name of the 
 * MFC's module. This is the module in which we will take the 'WinMain' 
 * function.
 */
static char* mfcModule   = ##WINEMAKER_APP_MFC##;



/*
 * Implement the main.
 */

#if APP_TYPE == GUIEXE
typedef int WINAPI (*WinMainFunc)(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				  PSTR szCmdLine, int iCmdShow);
#else
typedef int WINAPI (*MainFunc)(int argc, char** argv, char** envp);
#endif

#if APP_TYPE == GUIEXE
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
#else
int WINAPI Main(int argc, char** argv, char** envp)
#endif
{
    void* appLibrary;
    HINSTANCE hApp,hMFC,hMain;
    void* appMain;
    char* libName;
    int retcode;

    /* Load the application's library */
    libName=(char*)malloc(strlen(appName)+5+3+1);
    /* FIXME: we should get the wrapper's path and use that as the base for 
     * the library 
     */
    sprintf(libName,"./lib%s.so",appName);
    appLibrary=dlopen(libName,RTLD_NOW);
    if (appLibrary==NULL) {
        sprintf(libName,"lib%s.so",appName);
        appLibrary=dlopen(libName,RTLD_NOW);
    }
    if (appLibrary==NULL) {
        char format[]="Could not load the %s library:\r\n%s";
        char* error;
        char* msg;

        error=dlerror();
        msg=(char*)malloc(strlen(format)+strlen(libName)+strlen(error));
        sprintf(msg,format,libName,error);
        MessageBox(NULL,msg,"dlopen error",MB_OK);
        free(msg);
        return 1;
    }

    /* Then if this application is MFC based, load the MFC module */
    /* FIXME: I'm not sure this is really necessary */
    if (mfcModule!=NULL) {
        hMFC=LoadLibrary(mfcModule);
        if (hMFC==NULL) {
            char format[]="Could not load the MFC module %s (%d)";
            char* msg;

            msg=(char*)malloc(strlen(format)+strlen(mfcModule)+11);
            sprintf(msg,format,mfcModule,GetLastError());
            MessageBox(NULL,msg,"LoadLibrary error",MB_OK);
            free(msg);
            return 1;
        }
        /* MFC is a special case: the WinMain is in the MFC library, 
         * instead of the application's library.
         */
        hMain=hMFC;
    } else {
        hMFC=NULL;
    }

    /* Load the application's module */
    if (appModule==NULL) {
        appModule=appName;
    }
    hApp=LoadLibrary(appModule);
    if (hApp==NULL) {
        char format[]="Could not load the application's module %s (%d)";
        char* msg;

        msg=(char*)malloc(strlen(format)+strlen(appModule)+11);
        sprintf(msg,format,appModule,GetLastError());
        MessageBox(NULL,msg,"LoadLibrary error",MB_OK);
        free(msg);
        return 1;
    } else if (hMain==NULL) {
        hMain=hApp;
    }

    /* Get the address of the application's entry point */
    appMain=(WinMainFunc*)GetProcAddress(hMain, appInit);
    if (appMain==NULL) {
        char format[]="Could not get the address of %s (%d)";
        char* msg;

        msg=(char*)malloc(strlen(format)+strlen(appInit)+11);
        sprintf(msg,format,appInit,GetLastError());
        MessageBox(NULL,msg,"GetProcAddress error",MB_OK);
        free(msg);
        return 1;
    }

    /* And finally invoke the application's entry point */
#if APP_TYPE == GUIEXE
    retcode=(*((WinMainFunc)appMain))(hApp,hPrevInstance,szCmdLine,iCmdShow);
#else
    retcode=(*((MainFunc)appMain))(argc,argv,envp);
#endif

    /* Cleanup and done */
    FreeLibrary(hApp);
    if (hMFC!=NULL) {
        FreeLibrary(hMFC);
    }
    dlclose(appLibrary);
    free(libName);

    return retcode;
}
