From 905658c463c4080e5c57321e605386893239acd3 Mon Sep 17 00:00:00 2001 From: "Dimitrie O. Paun" Date: Fri, 27 Feb 2004 21:24:20 +0000 Subject: [PATCH] Generate a simple Makefile that uses winegcc to compile. No longer generate a configure script, that's project policy. --- tools/winemaker | 1521 ++----------------------------------------- tools/winemaker.man | 37 +- 2 files changed, 46 insertions(+), 1512 deletions(-) diff --git a/tools/winemaker b/tools/winemaker index 9e2f85d5672..376b94795d0 100755 --- a/tools/winemaker +++ b/tools/winemaker @@ -2,7 +2,7 @@ use strict; # Copyright 2000-2002 Francois Gouget for CodeWeavers -# fgouget@codeweavers.com +# Copyright 2004 Dimitrie O. Paun # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,7 +19,7 @@ use strict; # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -my $version="0.5.9"; +my $version="0.6.0"; use Cwd; use File::Basename; @@ -116,14 +116,9 @@ 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. +# no makefiles, but also no .spec files, etc. my $opt_no_generated_files; -## -# If true then winemaker should not generate the spec files. -# This is useful if winemaker is being used to create a build environment -my $opt_no_generated_specs; - ## # Specifies not to print the banner if set. my $opt_no_banner; @@ -221,14 +216,6 @@ 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; @@ -266,7 +253,6 @@ sub target_init($) @$target[$T_DLLS]=[]; @$target[$T_LIBRARY_PATH]=[]; @$target[$T_LIBRARIES]=[]; - @$target[$T_DEPENDS]=[]; } sub get_default_init($) @@ -360,11 +346,6 @@ my @main_project; # 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; - ##### @@ -443,27 +424,11 @@ sub source_set_options($$) } elsif ($option =~ /^-P/) { push @{@$target[$T_DLL_PATH]},"-L$'"; } elsif ($option =~ /^-i/) { - my $dllname = $'; - if ($dllname =~ /^msvcrt$/) { - push @{@$target[$T_INCLUDE_PATH]},"-I\$(WINE_INCLUDE_ROOT)/msvcrt"; - } - push @{@$target[$T_DLLS]},$dllname; + push @{@$target[$T_DLLS]},"$'"; } elsif ($option =~ /^-L/) { push @{@$target[$T_LIBRARY_PATH]},$option; } elsif ($option =~ /^-l/) { push @{@$target[$T_LIBRARIES]},"$'"; - } elsif ($option =~ /^--wrap/) { - if (@$target[$T_TYPE] != $TT_DLL) { - @$target[$T_FLAGS]|=$TF_WRAP; - } else { - print STDERR "warning: option --wrap is illegal for DLLs - ignoring"; - }; - } elsif ($option =~ /^--nowrap/) { - if (@$target[$T_TYPE] != $TT_DLL) { - @$target[$T_FLAGS]&=~$TF_WRAP; - } else { - print STDERR "warning: option --nowrap is illegal for DLLs - ignoring"; - } } elsif ($option =~ /^--mfc/) { @$target[$T_FLAGS]|=$TF_MFC; @$target[$T_FLAGS]&=~$TF_NOMFC; @@ -479,12 +444,6 @@ sub source_set_options($$) return 0; } } - if (@$target[$T_TYPE] != $TT_DLL && - @$target[$T_FLAGS] & $TF_MFC && - !(@$target[$T_FLAGS] & $TF_WRAP)) { - print STDERR "info: option --mfc requires --wrap"; - @$target[$T_FLAGS]|=$TF_WRAP; - } return 1; } @@ -745,13 +704,7 @@ sub source_scan_directory($$$$) 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/-P/-i/-L/-l/--mfc/--wrap),\n"; + print "* Type any project-wide options (-D/-I/-P/-i/-L/-l/--mfc),\n"; if (defined $flag_desc) { print "* (currently $flag_desc)\n"; } @@ -789,7 +742,6 @@ sub source_scan_directory($$$$) if ($target_name =~ /\.dll$/) { @$target[$T_TYPE]=$TT_DLL; @$target[$T_INIT]=get_default_init($TT_DLL); - @$target[$T_FLAGS]&=~$TF_WRAP; push @local_depends,"$target_name.so"; push @local_dlls,$target_name; } else { @@ -801,7 +753,7 @@ sub source_scan_directory($$$$) $basename=~ s/\.(dll|exe)$//i; # This is the default link list of Visual Studio, except odbccp32 # which we don't have in Wine. - my @std_imports=qw(advapi32 comdlg32 gdi32 kernel32 odbc32 ole32 oleaut32 shell32 user32 winspool); + my @std_imports=qw(odbc32 ole32 oleaut32 winspool); my @std_libraries=qw(uuid); if ((@$target[$T_FLAGS] & $TF_NODLLS) == 0) { @$target[$T_DLLS]=\@std_imports; @@ -810,9 +762,6 @@ sub source_scan_directory($$$$) @$target[$T_DLLS]=[]; @$target[$T_LIBRARIES]=[]; } - if ((@$target[$T_FLAGS] & $TF_NOMSVCRT) == 0) { - push @{@$target[$T_DLLS]},"msvcrt"; - } push @{@$project[$P_TARGETS]},$target; # Ask for target-specific options @@ -821,18 +770,10 @@ sub source_scan_directory($$$$) 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 (-P/-i/-L/-l/--mfc/--wrap) specific to the target\n"; + 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=; @@ -846,7 +787,6 @@ sub source_scan_directory($$$$) print "Please re-enter the options:\n"; } } - push @{@$target[$T_DLL_PATH]},"-L\$(WINE_DLL_ROOT)"; if (@$target[$T_FLAGS] & $TF_MFC) { @$project_settings[$T_FLAGS]|=$TF_MFC; push @{@$target[$T_DLL_PATH]},"\$(MFC_LIBRARY_PATH)"; @@ -910,12 +850,13 @@ sub source_scan_directory($$$$) $opt_ask_target_options=$OPT_ASK_YES; } + if ((@$project_settings[$T_FLAGS] & $TF_NOMSVCRT) == 0) { + push @{@$project_settings[$T_DEFINES]},"-mno-cygwin"; + } + if (@$project_settings[$T_FLAGS] & $TF_MFC) { push @{@$project_settings[$T_INCLUDE_PATH]},"\$(MFC_INCLUDE_PATH)"; } - if ((@$project_settings[$T_FLAGS] & $TF_NOMSVCRT)==0) { - push @{@$project_settings[$T_INCLUDE_PATH]},"-I\$(WINE_INCLUDE_ROOT)/msvcrt"; - } # The sources that did not match, if any, go to the extra # source list of the project settings foreach my $source (@sources_c) { @@ -950,7 +891,6 @@ sub source_scan_directory($$$$) foreach my $target (@exe_list) { push @{@$target[$T_DLL_PATH]},"-L."; push @{@$target[$T_DLLS]},@local_dlls; - push @{@$target[$T_DEPENDS]},@local_depends; } } } @@ -981,62 +921,6 @@ sub source_scan() @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 my $project (@projects) { - foreach my $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_DLLS]=[ "kernel32", "user32" ]; - push @{@$wrapper[$T_LIBRARIES]}, "dl"; - 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]=@$target[$T_NAME]; - @$target[$T_NAME]=~ s/.exe$/.dll/; - @$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 @@ -1601,9 +1485,6 @@ sub fix_source() print "Fixing the source files...\n"; foreach my $project (@projects) { foreach my $target (@$project[$P_SETTINGS],@{@$project[$P_TARGETS]}) { - if (@$target[$T_FLAGS] & $TF_WRAPPER) { - next; - } foreach my $source (@{@$target[$T_SOURCES_C]}, @{@$target[$T_SOURCES_CXX]}, @{@$target[$T_SOURCES_RC]}, @{@$target[$T_SOURCES_MISC]}) { fix_file($source,$project,$target); } @@ -1619,59 +1500,6 @@ sub fix_source() # ##### -## -# Generates a target's .spec file -sub generate_spec_file($$$) -{ - return if ($opt_no_generated_specs); - - my $path=$_[0]; - my $target=$_[1]; - my $project_settings=$_[2]; - - my $basename=@$target[$T_NAME]; - if (@$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; - } - - # Don't forget to export the 'Main' function for wrapped executables, - # except for MFC ones! - if ((@$target[$T_FLAGS]&($TF_WRAP|$TF_WRAPPER|$TF_MFC)) == $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]; - my $app_name=@$target[$T_NAME]; - my $wrapper_name=$app_name; - $app_name=~ s/\.exe$/\.dll/; - - return generate_from_template("$path${wrapper_name}_wrapper.c","wrapper.c",[ - ["APP_NAME",$app_name], - ["APP_TYPE",(@$target[$T_TYPE]==$TT_GUIEXE?"GUIEXE":"CUIEXE")], - ["APP_INIT",(@$target[$T_TYPE]==$TT_GUIEXE?"\"WinMain\"":"\"main\"")], - ["APP_MFC",(@$target[$T_FLAGS] & $TF_MFC?"\"mfc\"":"NULL")]]); -} - ## # A convenience function to generate all the lists (defines, # C sources, C++ source, etc.) in the Makefile @@ -1730,8 +1558,8 @@ sub generate_project_files($) 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"; + if (!open(FILEO,">@$project[$P_PATH]Makefile")) { + print STDERR "error: could not open \"@$project[$P_PATH]/Makefile\" for writing\n"; print STDERR " $!\n"; return; } @@ -1739,16 +1567,7 @@ sub generate_project_files($) print FILEO "### Generated by Winemaker\n"; print FILEO "\n\n"; - print FILEO "### Generic autoconf variables\n\n"; - generate_list("TOPSRCDIR",1,[ "\@top_srcdir\@" ]); - my $dotdotpath=@$project[$P_PATH]; - $dotdotpath =~ s%[^/]+%..%g; - $dotdotpath =~ s%/$%%; - $dotdotpath = "." if ($dotdotpath eq ""); - generate_list("TOPOBJDIR",1,[ $dotdotpath ]); - generate_list("SRCDIR",1,[ "\@srcdir\@" ]); - generate_list("VPATH",1,[ "\@srcdir\@" ]); - print FILEO "\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 @@ -1825,9 +1644,8 @@ sub generate_project_files($) 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]); - generate_list("${canon}_DEPENDS",1,@$target[$T_DEPENDS]); print FILEO "\n"; - generate_list("${canon}_OBJS",1,["\$(${canon}_C_SRCS:.c=.o)","\$(${canon}_CXX_SRCS:.cpp=.o)","\$(EXTRA_OBJS)"]); + 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"; @@ -1865,59 +1683,23 @@ sub generate_project_files($) return "\$(${canon}_SPEC_SRCS)"; }); } - print FILEO "\n\n\n"; + 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 "WINEBUILD = winebuild\n"; + print FILEO "\n\n"; print FILEO "### Generic autoconf targets\n\n"; print FILEO "all:"; if (@$project[$P_PATH] eq "") { - print FILEO " wineapploader"; print FILEO " \$(SUBDIRS)"; } if (@{@$project[$P_TARGETS]} > 0) { print FILEO " \$(DLLS:%=%.so) \$(EXES:%=%.so)"; } print FILEO "\n\n"; - if (@$project[$P_PATH] eq "") { - print FILEO "wineapploader: wineapploader.in\n"; - print FILEO "\tsed -e 's,\@bindir\\\@,\$(bindir),g' " . - "-e 's,\@winelibdir\\\@,.,g' " . - "\$(SRCDIR)/wineapploader.in >\$\@ || \$(RM) \$\@\n"; - print FILEO "\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 "\t_list=\"\$(SUBDIRS)\"; for i in \$\$_list; do (cd \$\$i; \$(MAKE) install) || exit 1; done\n"; - } - if (@{@$project[$P_TARGETS]} > 0) { - print FILEO "\t_list=\"\$(EXES:%.exe=%)\"; for i in \$\$_list; do \$(INSTALL_SCRIPT) \$\$i \$(bindir); done\n"; - print FILEO "\t_list=\"\$(EXES:%=%.so) \$(DLLS:%=%.so)\"; for i in \$\$_list; do \$(INSTALL_PROGRAM) \$\$i \$(dlldir); 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 "\t_list=\"\$(SUBDIRS)\"; for i in \$\$_list; do (cd \$\$i; \$(MAKE) uninstall) || exit 1; done\n"; - } - if (@{@$project[$P_TARGETS]} > 0) { - print FILEO "\t_list=\"\$(EXES:%.exe=%)\"; for i in \$\$_list; do \$(RM) \$(bindir)/\$\$i;done\n"; - print FILEO "\t_list=\"\$(EXES:%=%.so) \$(DLLS:%=%.so)\"; for i in \$\$_list; do \$(RM) \$(dlldir)/\$\$i;done\n"; - } - print FILEO "\n"; - if (@$project[$P_PATH] eq "") { - print FILEO "clean::\n"; - print FILEO "\t\$(RM) wineapploader\n"; - print FILEO "\n"; - print FILEO "distclean: clean\n"; - print FILEO "\t\$(RM) config.* configure.lineno Make.rules\n"; - print FILEO "\t\$(RM) -r autom4te.cache\n"; - print FILEO "\tfind . -name Makefile -exec \$(RM) {} \\;\n"; - print FILEO "\n"; - } if (@{@$project[$P_TARGETS]} > 0) { print FILEO "### Target specific build rules\n\n"; @@ -1934,191 +1716,44 @@ sub generate_project_files($) $mode = ""; } - if (@$target[$T_FLAGS] & $TF_WRAPPER) { - $all_dlls="\$(${canon}_DLLS:%=-l%)"; - $all_libs="\$(${canon}_LIBRARIES:%=-l%) \$(WINE_LIBRARIES)"; - } else { - $all_dlls="\$(${canon}_DLLS:%=-l%) \$(GLOBAL_DLLS:%=-l%)"; - $all_libs="\$(${canon}_LIBRARIES:%=-l%) \$(ALL_LIBRARIES)"; - } + $all_dlls="\$(${canon}_DLLS:%=-l%) \$(GLOBAL_DLLS:%=-l%)"; + $all_libs="\$(${canon}_LIBRARIES:%=-l%) \$(ALL_LIBRARIES)"; + + print FILEO "%.res: %.rc:\n"; + print FILEO " \$(RC) \$(RCFLAGS) -fo\$@ \$<\n"; + print FILEO "\n"; print FILEO "\$(${canon}_MODULE).dbg.c: \$(${canon}_C_SRCS) \$(${canon}_CXX_SRCS)\n"; - print FILEO "\t\$(LDPATH) \$(WINEBUILD) -o \$\@ --debug -C\$(SRCDIR) \$(${canon}_C_SRCS) \$(${canon}_CXX_SRCS)\n"; + print FILEO "\t\$(WINEBUILD) -o \$\@ --debug -C\$(SRCDIR) \$(${canon}_C_SRCS) \$(${canon}_CXX_SRCS)\n"; print FILEO "\n"; - print FILEO "\$(${canon}_MODULE).spec.c: \$(${canon}_SPEC_SRCS) \$(${canon}_RC_SRCS:.rc=.res) \$(${canon}_OBJS)\n"; - print FILEO "\t\$(LDPATH) \$(WINEBUILD) -fPIC -o \$\@ $mode \$(${canon}_SPEC_SRCS:%=--spec %) \$(${canon}_RC_SRCS:%.rc=%.res) \$(${canon}_OBJS) \$(${canon}_DLL_PATH) \$(WINE_DLL_PATH) \$(GLOBAL_DLL_PATH) $all_dlls\n"; - print FILEO "\n"; - print FILEO "\$(${canon}_MODULE).so: \$(${canon}_MODULE).dbg.o \$(${canon}_MODULE).spec.o \$(${canon}_OBJS) \$(${canon}_DEPENDS)\n"; + print FILEO "\$(${canon}_MODULE).so: \$(${canon}_MODULE).dbg.o \$(${canon}_OBJS)\n"; if (@{@$target[$T_SOURCES_CXX]} > 0 or @{@$project_settings[$T_SOURCES_CXX]} > 0) { - print FILEO "\t\$(LDXXSHARED)"; + print FILEO "\t\$(CXX)"; } else { - print FILEO "\t\$(LDSHARED)"; + print FILEO "\t\$(CC)"; } - print FILEO " \$(LDDLLFLAGS) -o \$\@ \$(${canon}_OBJS) \$(${canon}_MODULE).dbg.o \$(${canon}_MODULE).spec.o \$(${canon}_LIBRARY_PATH) \$(ALL_LIBRARY_PATH) $all_libs \$(LIBS)\n"; - if (@$target[$T_TYPE] != $TT_DLL) { - print FILEO "\ttest -f \$(${canon}_BASEMODULE) || \$(INSTALL_SCRIPT) \$(TOPOBJDIR)/wineapploader \$(${canon}_BASEMODULE)\n"; + if ($opt_target_type == $TT_GUIEXE) { + print FILEO " -mwindows"; + } else { + print FILEO " -mconsole"; } + print FILEO " \$(LDDLLFLAGS) -o \$\@ \$(${canon}_OBJS) \$(${canon}_MODULE).dbg.o \$(${canon}_LIBRARY_PATH) \$(ALL_LIBRARY_PATH) $all_libs \$(LIBS)\n"; print FILEO "\n\n"; } } close(FILEO); - foreach my $target (@{@$project[$P_TARGETS]}) { - if (@$target[$T_TYPE] == $TT_DLL) { - 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_from_template($$;$) -{ - my $filename=$_[0]; - my $template=$_[1]; - my $substitutions=$_[2]; - - if (!defined $templates{$template}) { - print STDERR "winemaker: internal error: No template called '$template'\n"; - return 0; - } - - if (!open(FILEO,">$filename")) { - print STDERR "error: unable to open \"$filename\" for writing:\n"; - print STDERR " $!\n"; - return 0; - } - my $warned; - foreach my $line (@{$templates{$template}}) { - if ($line =~ /(\#\#WINEMAKER_[A-Z_]+\#\#)/) { - if (defined $substitutions) { - foreach my $pattern (@$substitutions) { - $line =~ s%\#\#WINEMAKER_@$pattern[0]\#\#%@$pattern[1]%; - } - } - if (!$warned and $line =~ /(\#\#WINEMAKER_[A-Z_]+\#\#)/) { - print STDERR "warning: no value was provided for template $1 in \"$filename\"\n"; - $warned=1; - } - } - print FILEO $line; - } - close(FILEO); - return 1; -} - -## -# Generates the global files: -# configure -# configure.ac -# Make.rules.in -# wineapploader.in -sub generate_global_files() -{ - my @include_path; - foreach my $path (@{$global_settings[$T_INCLUDE_PATH]}) { - if ($path !~ /^-L/ or is_absolute($')) { - push @include_path, $path; - } else { - push @include_path, "-L\$(TOPSRCDIR)/$'"; - } - } - my @dll_path; - foreach my $path (@{$global_settings[$T_DLL_PATH]}) { - if ($path !~ /^-L/ or is_absolute($')) { - push @dll_path, $path; - } else { - push @dll_path, "-L\$(TOPSRCDIR)/$'"; - } - } - my @library_path; - foreach my $path (@{$global_settings[$T_LIBRARY_PATH]}) { - if ($path !~ /^-L/ or is_absolute($')) { - push @library_path, $path; - } else { - push @library_path, "-L\$(TOPSRCDIR)/$'"; - } - } - generate_from_template("Make.rules.in","Make.rules.in",[ - ["DEFINES", join(" ", @{$global_settings[$T_DEFINES]}) ], - ["INCLUDE_PATH", join(" ", @include_path) ], - ["DLL_PATH", join(" ", @dll_path) ], - ["DLLS", join(" ", @{$global_settings[$T_DLLS]}) ], - ["LIBRARY_PATH", join(" ", @library_path) ], - ["LIBRARIES", join(" ", @{$global_settings[$T_LIBRARIES]}) ]]); - generate_from_template("wineapploader.in","wineapploader.in"); - - # Get the name of a source file for configure.ac - my $a_source_file; - search_a_file: foreach my $project (@projects) { - foreach my $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_from_template("configure.ac","configure.ac",[ - ["PROJECTS",join("\n",map { "@$_[$P_PATH]Makefile" } @projects)], - ["SOURCE","$a_source_file"], - ["NEEDS_MFC","$needs_mfc"]]); - system("autoconf configure.ac > configure"); - - # 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 () { - 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 my $project (@projects) { my $path=@$project[$P_PATH]; @@ -2152,7 +1787,6 @@ $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_generated_specs=0; $opt_no_source_fix=0; $opt_no_banner=0; @@ -2175,12 +1809,11 @@ 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]\n"; + print STDERR " [--lower-include|--nolower-include] [--mfc|--nomfc]\n"; print STDERR " [--guiexe|--windows|--cuiexe|--console|--dll]\n"; - print STDERR " [--wrap|--nowrap] [--mfc|--nomfc]\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] [--nogenerated-specs]\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"; @@ -2218,9 +1851,6 @@ while (@ARGV>0) { $opt_no_generated_files=0; } elsif ($arg eq "--nogenerated-files") { $opt_no_generated_files=1; - } elsif ($arg eq "--nogenerated-specs") { - $opt_no_generated_specs=1; - } elsif ($arg =~ /^-D/) { push @{$global_settings[$T_DEFINES]},$arg; } elsif ($arg =~ /^-I/) { @@ -2228,11 +1858,7 @@ while (@ARGV>0) { } elsif ($arg =~ /^-P/) { push @{$global_settings[$T_DLL_PATH]},"-L$'"; } elsif ($arg =~ /^-i/) { - my $dllname = $'; - if ($dllname =~ /^msvcrt$/) { - push @{$global_settings[$T_INCLUDE_PATH]},"-I\$(WINE_INCLUDE_ROOT)/msvcrt"; - } - push @{$global_settings[$T_DLLS]},$dllname; + push @{$global_settings[$T_DLLS]},$'; } elsif ($arg =~ /^-L/) { push @{$global_settings[$T_LIBRARY_PATH]},$arg; } elsif ($arg =~ /^-l/) { @@ -2249,17 +1875,11 @@ while (@ARGV>0) { $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; - $needs_mfc=1; } elsif ($arg eq "--nomfc") { $opt_flags&=~$TF_MFC; $opt_flags|=$TF_NOMFC; - $needs_mfc=0; } elsif ($arg eq "--nodlls") { $opt_flags|=$TF_NODLLS; } elsif ($arg eq "--nomsvcrt") { @@ -2278,11 +1898,6 @@ while (@ARGV>0) { usage(); } } - - if ($opt_flags & $TF_MFC && $opt_target_type != $TT_DLL) { - print STDERR "info: option --mfc requires --wrap\n"; - $opt_flags |= $TF_WRAP; - }; } if (!defined $opt_work_dir) { @@ -2306,9 +1921,6 @@ 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 if (! $opt_no_source_fix) { fix_source(); @@ -2321,1056 +1933,3 @@ if (! $opt_no_generated_files) { __DATA__ ---- configure.ac --- -dnl Process this file with autoconf to produce a configure script. -dnl Author: Michael Patra -dnl -dnl Francois Gouget for CodeWeavers - -AC_REVISION([configure.ac 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_PROG_LN_S - -dnl **** Check for some libraries **** - -dnl Check for -lm for BeOS -AC_CHECK_LIB(m,sqrt) -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 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],,ac_found=1;ac_cv_pheader_$1="$ac_dir";break) - done - CPPFLAGS="$save_CPPFLAGS" - ifelse([$3],,,[if test -z "$ac_found" - then - $3 - fi - ]) -]) -$1="$ac_cv_pheader_$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_plibrary_$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_plibrary_$1="$ac_dir";break) - done - LIBS="$save_LIBS" - ifelse([$4],,,[if test -z "$ac_found" - then - $4 - fi - ]) -]) -$1="$ac_cv_plibrary_$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 **** - -LDPATH="" -WINE_INCLUDE_ROOT="" -WINE_INCLUDE_PATH="" -WINE_LIBRARY_ROOT="" -WINE_LIBRARY_PATH="" -WINE_DLL_ROOT="" -WINE_DLL_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_ROOT/include/wine/windows:$WINE_ROOT/include/windows" - WINE_LIBRARY_ROOT="$WINE_ROOT:$WINE_ROOT/libs:$WINE_ROOT/lib" - WINE_DLL_ROOT="$WINE_ROOT/dlls:$WINE_ROOT/lib:$WINE_ROOT/lib/wine" - WINE_TOOL_PATH="$WINE_ROOT:$WINE_ROOT/bin:$WINE_ROOT/tools/wrc:$WINE_ROOT/tools/winebuild" -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-dlls, -[ --with-wine-dlls=DIR the Wine dlls are in DIR], -[if test "$withval" != "no"; then - WINE_DLLS="$withval"; -else - WINE_DLLS=""; -fi]) -if test -n "$WINE_DLLS" -then - WINE_DLL_ROOT="$WINE_DLLS" -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/tools/wrc:$WINE_TOOLS/tools/winebuild" -fi - -if test -z "$WINE_INCLUDE_ROOT" -then - WINE_INCLUDE_ROOT=":/usr/include/wine/windows:/usr/include/wine:/usr/local/include/wine/windows:/opt/wine/include/windows:/opt/wine/include/wine"; -else - AC_PATH_FILE(WINE_INCLUDE_ROOT,[windef.h],[ - AC_MSG_ERROR([Could not find the Wine headers (windef.h)]) - ],$WINE_INCLUDE_ROOT) -fi -AC_PATH_HEADER(WINE_INCLUDE_ROOT,[windef.h],[ - AC_MSG_ERROR([Could not include the Wine headers (windef.h)]) -],$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 - AC_PATH_FILE(WINE_LIBRARY_ROOT,[libwine.so], - [ - AC_PATH_FILE(WINE_LIBRARY_ROOT,[libwine.dylib], - [AC_MSG_ERROR([Could not find the Wine libraries (libwine.dylib or libwine.so)])], - $WINE_LIBRARY_ROOT) - ], $WINE_LIBRARY_ROOT) -fi -AC_PATH_LIBRARY(WINE_LIBRARY_ROOT,[-lwine],[],[ - AC_MSG_ERROR([Could not link with the Wine libraries (libwine.so)]) -],$WINE_LIBRARY_ROOT) -if test -n "$WINE_LIBRARY_ROOT" -then - WINE_LIBRARY_PATH="-L$WINE_LIBRARY_ROOT" - LDPATH="$WINE_LIBRARY_ROOT" -else - WINE_LIBRARY_PATH="" -fi - -save_LIBS="$LIBS" -LIBS="$WINE_LIBRARY_PATH $LIBS" - -AC_CHECK_LIB(wine_unicode,wine_cp_wcstombs,[],[ - AC_MSG_ERROR([Could not find the Wine dlls (libwine_unicode.so)]) -]) - -LIBS="$save_LIBS" - -if test -z "$WINE_DLL_ROOT" -then - if test -n "$WINE_LIBRARY_ROOT" - then - WINE_DLL_ROOT="$WINE_LIBRARY_ROOT:$WINE_LIBRARY_ROOT/dlls:$WINE_LIBRARY_ROOT/wine" - else - WINE_DLL_ROOT="/lib:/lib/wine:/usr/lib:/usr/lib/wine:/usr/local/lib:/usr/local/lib/wine" - fi -fi - -AC_PATH_FILE(WINE_DLL_ROOT,[libntdll.def],[ - AC_MSG_ERROR([Could not find the Wine dlls (libntdll.def)]) -],[$WINE_DLL_ROOT]) -WINE_DLL_PATH="-L$WINE_DLL_ROOT" -WINE_LIBRARY_PATH="$WINE_LIBRARY_PATH -L$WINE_DLL_ROOT" - -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 - -case $build_os in - darwin*|macosx*) - LDPATH="DYLD_LIBRARY_PATH=\"$LDPATH:\$\$DYLD_LIBRARY_PATH\"";; - *) - LDPATH="LD_LIBRARY_PATH=\"$LDPATH:\$\$LD_LIBRARY_PATH\"" -esac - -AC_SUBST(LDPATH) -AC_SUBST(WINE_INCLUDE_PATH) -AC_SUBST(WINE_LIBRARY_PATH) -AC_SUBST(WINE_DLL_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/msvcrt -D_DLL -D_MT $CPPFLAGS" - ATL_INCLUDE_PATH="-I\$(WINE_INCLUDE_ROOT)/msvcrt -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:$MFC_INCLUDE_ROOT/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:$MFC_LIBRARY_ROOT/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: -# 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@ -WINE_DLL_ROOT = @WINE_DLL_ROOT@ -WINE_DLL_PATH = @WINE_DLL_PATH@ - -LDPATH = @LDPATH@ - -# 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@ - -# Global definitions and options - -GLOBAL_DEFINES = ##WINEMAKER_DEFINES## -GLOBAL_INCLUDE_PATH = ##WINEMAKER_INCLUDE_PATH## -GLOBAL_DLL_PATH = ##WINEMAKER_DLL_PATH## -GLOBAL_DLLS = ##WINEMAKER_DLLS## -GLOBAL_LIBRARY_PATH = ##WINEMAKER_LIBRARY_PATH## -GLOBAL_LIBRARIES = ##WINEMAKER_LIBRARIES## - -# First some useful definitions - -SHELL = /bin/sh -CC = @CC@ -CPP = @CPP@ -CXX = @CXX@ -WRC = @WRC@ -CFLAGS = @CFLAGS@ $(CEXTRA) -CXXFLAGS = @CXXFLAGS@ $(CXXEXTRA) -WRCFLAGS = $(WRCEXTRA) -OPTIONS = @OPTIONS@ -D_REENTRANT -LIBS = @LIBS@ $(LIBRARY_PATH) -DIVINCL = $(GLOBAL_INCLUDE_PATH) -I$(SRCDIR) $(INCLUDE_PATH) $(WINE_INCLUDE_PATH) -ALLCFLAGS = $(DIVINCL) $(CFLAGS) $(GLOBAL_DEFINES) $(DEFINES) $(OPTIONS) -ALLCXXFLAGS=$(DIVINCL) $(CXXFLAGS) $(GLOBAL_DEFINES) $(DEFINES) $(OPTIONS) -ALL_DLL_PATH = $(DLL_PATH) $(GLOBAL_DLL_PATH) $(WINE_DLL_PATH) -ALL_LIBRARY_PATH = $(LIBRARY_PATH) $(GLOBAL_LIBRARY_PATH) $(WINE_LIBRARY_PATH) -WINE_LIBRARIES = -lwine -lwine_unicode -ALL_LIBRARIES = $(LIBRARIES:%=-l%) $(GLOBAL_LIBRARIES:%=-l%) $(WINE_LIBRARIES) -LDSHARED = @LDSHARED@ -LDXXSHARED= @LDXXSHARED@ -LDDLLFLAGS= @LDDLLFLAGS@ -LN_S = @LN_S@ -RM = rm -f -MV = mv -MKDIR = mkdir -p -WINE = @WINE@ -WINEBUILD = @WINEBUILD@ -@SET_MAKE@ - -# Installation infos - -INSTALL = install -INSTALL_PROGRAM = $(INSTALL) -INSTALL_SCRIPT = $(INSTALL) -INSTALL_DATA = $(INSTALL) -m 644 -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -dlldir = @libdir@/wine - -prog_manext = 1 -conf_manext = 5 - -OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.cpp=.o) \ - $(SPEC_SRCS:.spec=.spec.o) -CLEAN_FILES = *.dbg.c *.spec.c y.tab.c y.tab.h lex.yy.c \ - core *.orig *.rej \ - \\\#*\\\# *~ *% .\\\#* - -# Implicit rules - -.SUFFIXES: .cpp .rc .res .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: - $(LDPATH) $(WRC) $(WRCFLAGS) $(DIVINCL) -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 $@ 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) - $(RM) $(DLLS:%=%.dbg.o) $(DLLS:%=%.spec.o) $(DLLS:%=%.so) - $(RM) $(EXES:%=%.dbg.o) $(EXES:%=%.spec.o) $(EXES:%=%.so) $(EXES:%.exe=%) - -# 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 ---- wineapploader.in --- -#!/bin/sh -# -# Wrapper script to start a Winelib application once it is installed -# -# Copyright (C) 2002 Alexandre Julliard - -# determine the app Winelib library name -appname=`basename "$0" .exe`.exe - -#allow Wine to load Winelib application from the current directory -export WINEDLLPATH=$WINEDLLPATH:@winelibdir@ - -# first try explicit WINELOADER -if [ -x "$WINELOADER" ]; then exec "$WINELOADER" "$appname" "$@"; fi - -# then default bin directory -if [ -x "@bindir@/wine" ]; then exec "@bindir@/wine" "$appname" "$@"; fi - -# now try the directory containing $0 -appdir="" -case "$0" in - */*) - # $0 contains a path, use it - appdir=`dirname "$0"` - ;; - *) - # no directory in $0, search in PATH - saved_ifs=$IFS - IFS=: - for d in $PATH - do - IFS=$saved_ifs - if [ -x "$d/$0" ]; then appdir="$d"; break; fi - done - ;; -esac -if [ -x "$appdir/wine" ]; then exec "$appdir/wine" "$appname" "$@"; fi - -# finally look in PATH -exec wine "$appname" "$@" ---- wrapper.c --- -/* - * Copyright 2000 Francois Gouget for CodeWeavers - */ - -#ifndef STRICT -#define STRICT -#endif - -#include -#include - - - -/* - * Describe the wrapped application - */ - -/** - * This is either CUIEXE for a console based application or - * GUIEXE for a regular windows application. - */ -#define GUIEXE 0 -#define CUIEXE 1 -#define APP_TYPE ##WINEMAKER_APP_TYPE## - -/** - * This is the name of the library containing the application, - * e.g. 'hello.dll' if the application is called 'hello.exe'. - */ -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 -{ - HINSTANCE hApp = 0, hMFC = 0, hMain = 0; - void* appMain; - int retcode; - - /* 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=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); - } - - return retcode; -} diff --git a/tools/winemaker.man b/tools/winemaker.man index b76e1385f7d..4555437fdb8 100644 --- a/tools/winemaker.man +++ b/tools/winemaker.man @@ -13,16 +13,12 @@ winemaker \- generate a build infrastructure for compiling Windows programs on U ] .br [ -.IR "--lower-include " "| " "--nolower-include " +.IR "--lower-include " "| " "--nolower-include " ] [ " "--mfc " "| " "--nomfc " ] .br [ .IR "--guiexe " "| " "--windows " "| " "--cuiexe " "| " "--console " "| " "--dll " "| " "--nodlls " ] -.br - [ -.IR "--wrap " "| " "--nowrap " "] [ " "--mfc " "| " "--nomfc " -] .br [ .IR "-Dmacro[=defn] " "] [ " "-Idir " "] [ " "-Ldir " "] [ " "-idll" "] [ " "-llibrary " @@ -33,7 +29,7 @@ winemaker \- generate a build infrastructure for compiling Windows programs on U ] .br [ -.IR "--generated-files " "] [ " "--nogenerated-files " "] [ " "--nogenerated-specs " +.IR "--generated-files " "] [ " "--nogenerated-files " "] ] .SH DESCRIPTION @@ -129,20 +125,9 @@ The standard set of libraries is: advapi32.dll, comdlg32.dll, gdi32.dll, kernel32.dll, odbc32.dll, ole32.dll, oleaut32.dll, shell32.dll, user32.dll, winspool.drv. .TP -.I --wrap -Specifies that executable targets should be built as libraries and a small -executable wrapper generated for them. This technique is sometimes required -to solve initialization problems occurring on the application startup. -.TP -.I --nowrap -Specifies that no wrapper should be generated for executable targets. This is -the default. -.TP .I --mfc -Specifies that the targets are MFC based. In such a case winemaker generates a -configure script with MFC specific options, modifies the include and -library paths accordingly, links the target with the MFC library and -generates wrappers for these targets that are executables. +Specifies that the targets are MFC based. In such a case winemaker the include +and library paths accordingly, and links the target with the MFC library. .TP .I --nomfc Specifies that targets are not MFC-based. This option disables use of MFC libraries @@ -173,17 +158,10 @@ target specific options. Specifies that there is only one target, and that it is called "name". .TP .I --generated-files -Tells winemaker to generate the build infrastructure files, i.e. the spec -files, the wrapper files, the Makefile.in files, the Make.rules.in file, the -configure.in file and the configure script. This is the default. +Tells winemaker to generate the build the Makefile. This is the default. .TP .I --nogenerated-files -Tells winemaker not to generate any of the above files. -.TP -.I --nogenerated-specs -Tells winemaker not to generate the spec files when generating files. This is -particularly useful when using winemaker to generate a build environment and -you already have a spec file. +Tells winemaker not to generate the Makefile. .SH EXAMPLES .PP @@ -240,9 +218,6 @@ exports (for libraries). We could then restore all these settings for the corresponding Winelib target. The problem is that we should have such a tool available under the Wine license first. .PP -The wrapper code should be generic, i.e. you should be able to have just one -wrapper and specify which library to load using an option. -.PP Furthermore it is not very good at finding the library containing the executable: it must either be in the current directory or in the .IR LD_LIBRARY_PATH .