- Fix --nomfc option which is currrently broken.
- Add --nodlls option for small apps.
This commit is contained in:
parent
1b32e5eca9
commit
3aa9e8c663
|
@ -233,6 +233,14 @@ my $TF_WRAPPER=2;
|
|||
# This target is an MFC-based target
|
||||
my $TF_MFC=4;
|
||||
|
||||
##
|
||||
# User has specified --nomfc option for this target or globally
|
||||
my $TF_NOMFC=8;
|
||||
|
||||
##
|
||||
# --nodlls option: Do not use standard DLL set
|
||||
my $TF_NODLLS=16;
|
||||
|
||||
##
|
||||
# Initialize a target:
|
||||
# - set the target type to TT_SETTINGS, i.e. no real target will
|
||||
|
@ -436,23 +444,37 @@ sub source_set_options($$)
|
|||
push @{@$target[$T_LIBRARY_PATH]},$option;
|
||||
} 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;
|
||||
} 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;
|
||||
} elsif ($option =~ /^--nomfc/) {
|
||||
@$target[$T_FLAGS]&=~$TF_MFC;
|
||||
@$target[$T_FLAGS]&=~($TF_MFC|$TF_WRAP);
|
||||
@$target[$T_FLAGS]|=$TF_NOMFC;
|
||||
} elsif ($option =~ /^--nodlls/) {
|
||||
@$target[$T_FLAGS]|=$TF_NODLLS;
|
||||
} else {
|
||||
print STDERR "error: unknown option \"$option\"\n";
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -543,7 +565,7 @@ sub source_scan_directory($$$$)
|
|||
} elsif ($dentry =~ /\.c$/i and $dentry !~ /\.spec\.c$/) {
|
||||
push @sources_c,"$dentry";
|
||||
} elsif ($dentry =~ /\.(cpp|cxx)$/i) {
|
||||
if ($dentry =~ /^stdafx.cpp$/i) {
|
||||
if ($dentry =~ /^stdafx.cpp$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
|
||||
push @sources_misc,"$dentry";
|
||||
@$project_settings[$T_FLAGS]|=$TF_MFC;
|
||||
} else {
|
||||
|
@ -553,7 +575,7 @@ sub source_scan_directory($$$$)
|
|||
push @sources_rc,"$dentry";
|
||||
} elsif ($dentry =~ /\.(h|hxx|hpp|inl|rc2|dlg)$/i) {
|
||||
push @sources_misc,"$dentry";
|
||||
if ($dentry =~ /^stdafx.h$/i) {
|
||||
if ($dentry =~ /^stdafx.h$/i && !(@$project_settings[$T_FLAGS] & $TF_NOMFC)) {
|
||||
@$project_settings[$T_FLAGS]|=$TF_MFC;
|
||||
}
|
||||
} elsif ($dentry =~ /\.dsp$/i) {
|
||||
|
@ -779,7 +801,11 @@ sub source_scan_directory($$$$)
|
|||
# which we don't have in Wine. Also I add ntdll which seems
|
||||
# necessary for Winelib.
|
||||
my @std_dlls=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_DLLS]=\@std_dlls;
|
||||
if (@$target[$T_FLAGS] & $TF_NODLLS == 0) {
|
||||
@$target[$T_DLLS]=\@std_dlls;
|
||||
} else {
|
||||
@$target[$T_DLLS]=[];
|
||||
}
|
||||
push @{@$project[$P_TARGETS]},$target;
|
||||
|
||||
# Ask for target-specific options
|
||||
|
@ -2169,7 +2195,7 @@ sub usage()
|
|||
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 " [--guiexe|--windows|--cuiexe|--console|--dll]\n";
|
||||
print STDERR " [--guiexe|--windows|--cuiexe|--console|--dll|--nodlls]\n";
|
||||
print STDERR " [--wrap|--nowrap] [--mfc|--nomfc]\n";
|
||||
print STDERR " [-Dmacro[=defn]] [-Idir] [-Pdir] [-idll] [-Ldir] [-llibrary]\n";
|
||||
print STDERR " [--interactive] [--single-target name]\n";
|
||||
|
@ -2182,9 +2208,6 @@ sub usage()
|
|||
exit (2);
|
||||
}
|
||||
|
||||
|
||||
project_init(\@main_project,"");
|
||||
|
||||
while (@ARGV>0) {
|
||||
my $arg=shift @ARGV;
|
||||
# General options
|
||||
|
@ -2245,11 +2268,13 @@ while (@ARGV>0) {
|
|||
$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);
|
||||
$opt_flags&=~$TF_MFC;
|
||||
$opt_flags|=$TF_NOMFC;
|
||||
$needs_mfc=0;
|
||||
} elsif ($arg eq "--nodlls") {
|
||||
$opt_flags|=$TF_NODLLS;
|
||||
|
||||
# Catch errors
|
||||
} else {
|
||||
|
@ -2264,6 +2289,11 @@ 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) {
|
||||
|
@ -2279,6 +2309,8 @@ if ($opt_no_banner == 0) {
|
|||
print_banner();
|
||||
}
|
||||
|
||||
project_init(\@main_project,"");
|
||||
|
||||
# Fix the file and directory names
|
||||
fix_file_and_directory_names(".");
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ winemaker \- generate a build infrastructure for compiling Windows programs on U
|
|||
]
|
||||
.br
|
||||
[
|
||||
.IR "--guiexe " "| " "--windows " "| " "--cuiexe " "| " "--console " "| " "--dll "
|
||||
.IR "--guiexe " "| " "--windows " "| " "--cuiexe " "| " "--console " "| " "--dll " "| " "--nodlls "
|
||||
]
|
||||
.br
|
||||
[
|
||||
|
@ -39,32 +39,32 @@ winemaker \- generate a build infrastructure for compiling Windows programs on U
|
|||
.SH DESCRIPTION
|
||||
.PP
|
||||
.B winemaker
|
||||
is a perl script designed to help you bootstrap the
|
||||
is a perl script designed to help you bootstrap the
|
||||
process of converting your Windows sources to Winelib programs.
|
||||
.PP
|
||||
In order to do this winemaker can perform the following operations:
|
||||
.PP
|
||||
- rename your source files and directories to lowercase in the event they
|
||||
- rename your source files and directories to lowercase in the event they
|
||||
got all uppercased during the transfer.
|
||||
.PP
|
||||
- perform Dos to Unix (CRLF to LF) conversions.
|
||||
.PP
|
||||
- scan the include statements and resource file references to replace the
|
||||
- scan the include statements and resource file references to replace the
|
||||
backslashes with forward slashes.
|
||||
.PP
|
||||
- during the above step winemaker will also perform a case insensitive search
|
||||
of the referenced file in the include path and rewrite the include statement
|
||||
- during the above step winemaker will also perform a case insensitive search
|
||||
of the referenced file in the include path and rewrite the include statement
|
||||
with the right case if necessary.
|
||||
.PP
|
||||
- winemaker will also check other more exotic issues like '#pragma pack'
|
||||
usage, use of "afxres.h" in non MFC projects, and more. Whenever it
|
||||
- winemaker will also check other more exotic issues like '#pragma pack'
|
||||
usage, use of "afxres.h" in non MFC projects, and more. Whenever it
|
||||
encounters something out of the ordinary, winemaker will warn you about it.
|
||||
.PP
|
||||
- winemaker can also scan a complete directory tree at once, guess what are
|
||||
the executables and libraries you are trying to build, match them with
|
||||
- winemaker can also scan a complete directory tree at once, guess what are
|
||||
the executables and libraries you are trying to build, match them with
|
||||
source files, and generate the corresponding Makefile.in files.
|
||||
.PP
|
||||
- finally winemaker will generate a global Makefile.in file calling out to all
|
||||
- finally winemaker will generate a global Makefile.in file calling out to all
|
||||
the others, and a configure script customized for use with Winelib.
|
||||
.PP
|
||||
- winemaker knows about MFC-based project and will generate customized files.
|
||||
|
@ -75,7 +75,7 @@ the others, and a configure script customized for use with Winelib.
|
|||
Disables the printing of the banner.
|
||||
.TP
|
||||
.I --backup
|
||||
Directs winemaker to perform a backup of all the source files in which it
|
||||
Directs winemaker to perform a backup of all the source files in which it
|
||||
makes changes. This is the default.
|
||||
.TP
|
||||
.I --nobackup
|
||||
|
@ -89,58 +89,68 @@ conversion). This prevents complaints if the files are readonly.
|
|||
Tells winemaker to rename all files and directories to lowercase.
|
||||
.TP
|
||||
.I --lower-uppercase
|
||||
Tells winemaker to only rename files and directories that have an all
|
||||
uppercase name.
|
||||
Tells winemaker to only rename files and directories that have an all
|
||||
uppercase name.
|
||||
So "HELLO.C" would be renamed but not "World.c".
|
||||
.TP
|
||||
.I --lower-none
|
||||
Tells winemaker not to rename files and directories to lower case. Note
|
||||
that this does not prevent the renaming of a file if its extension cannot
|
||||
Tells winemaker not to rename files and directories to lower case. Note
|
||||
that this does not prevent the renaming of a file if its extension cannot
|
||||
be handled as is, e.g. ".Cxx". This is the default.
|
||||
.TP
|
||||
.I "--lower-include "
|
||||
Tells winemaker that if it does not find the file corresponding to an
|
||||
include statement (or other form of file reference for resource files),
|
||||
Tells winemaker that if it does not find the file corresponding to an
|
||||
include statement (or other form of file reference for resource files),
|
||||
then it should convert that filename to lowercase. This is the default.
|
||||
.TP
|
||||
.I "--nolower-include "
|
||||
Tells winemaker not to modify the include statement if it cannot find the
|
||||
Tells winemaker not to modify the include statement if it cannot find the
|
||||
referenced file.
|
||||
.TP
|
||||
.IR "--guiexe " "| " "--windows"
|
||||
Specifies that whenever winemaker finds an executable target, or a target of
|
||||
Specifies that whenever winemaker finds an executable target, or a target of
|
||||
unknown type, it should assume that it is a graphical application.
|
||||
This is the default.
|
||||
.TP
|
||||
.IR "--cuiexe " "| " "--console"
|
||||
Specifies that whenever winemaker finds an executable target, or a target of
|
||||
Specifies that whenever winemaker finds an executable target, or a target of
|
||||
unknown type, it should assume that it is a console application.
|
||||
.TP
|
||||
.I --dll
|
||||
This option tells winemaker that whenever it finds a target of unknown type,
|
||||
i.e. for which it does not know whether it is an executable or a library,
|
||||
This option tells winemaker that whenever it finds a target of unknown type,
|
||||
i.e. for which it does not know whether it is an executable or a library,
|
||||
it should assume it is a library.
|
||||
.TP
|
||||
.I --nodlls
|
||||
This option tells winemaker not to use the standard set of winelib libraries
|
||||
for imports. That is, any DLL your code uses must be explicitly passed to
|
||||
winemaker with -i options.
|
||||
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
|
||||
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 occuring on the application startup.
|
||||
.TP
|
||||
.I --nowrap
|
||||
Specifies that no wrapper should be generated for executable targets. This is
|
||||
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
|
||||
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.
|
||||
.TP
|
||||
.I --nomfc
|
||||
Specifies that targets are not MFC-based. This is the default.
|
||||
Specifies that targets are not MFC-based. This option disables use of MFC libraries
|
||||
even if winemaker encounters files "stdafx.cpp" or "stdafx.h" that would cause it
|
||||
to enable MFC automatically if neither --nomfc nor --mfc was specified.
|
||||
.TP
|
||||
.I -Dmacro[=defn]
|
||||
Adds the specified macro definition to the global list of macro definitions.
|
||||
Adds the specified macro definition to the global list of macro definitions.
|
||||
.TP
|
||||
.I -Idir
|
||||
Appends the specified directory to the global include path.
|
||||
|
@ -149,23 +159,22 @@ Appends the specified directory to the global include path.
|
|||
Appends the specified directory to the global library path.
|
||||
.TP
|
||||
.I -idll
|
||||
Adds the Winelib library to the global list of Winelib libraries to import
|
||||
in the spec file.
|
||||
Adds the Winelib library to the global list of Winelib libraries to import.
|
||||
.TP
|
||||
.I -llibrary
|
||||
Adds the specified library to the global list of libraries to link with.
|
||||
.TP
|
||||
.I --interactive
|
||||
Puts winemaker in interactive mode. In this mode winemaker will ask you to
|
||||
confirm each directory's list of targets, and then to provide directory and
|
||||
Puts winemaker in interactive mode. In this mode winemaker will ask you to
|
||||
confirm each directory's list of targets, and then to provide directory and
|
||||
target specific options.
|
||||
.TP
|
||||
.I --single-target name
|
||||
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
|
||||
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.
|
||||
.TP
|
||||
.I --nogenerated-files
|
||||
|
@ -182,28 +191,28 @@ Here is a typical winemaker use:
|
|||
.PP
|
||||
$ winemaker --lower-uppercase -DSTRICT
|
||||
.PP
|
||||
The above tells winemaker to scan the current directory and its
|
||||
subdirectories for source files. Whenever if finds a file or directory which
|
||||
name is all uppercase, it should rename it to lowercase. It should then fix
|
||||
all these source files for compilation with Winelib and generate Makefiles.
|
||||
The '-DSTRICT' specifies that the STRICT macro must be set when compiling
|
||||
these sources. Finally winemaker will create a global Makefile.in and
|
||||
The above tells winemaker to scan the current directory and its
|
||||
subdirectories for source files. Whenever if finds a file or directory which
|
||||
name is all uppercase, it should rename it to lowercase. It should then fix
|
||||
all these source files for compilation with Winelib and generate Makefiles.
|
||||
The '-DSTRICT' specifies that the STRICT macro must be set when compiling
|
||||
these sources. Finally winemaker will create a global Makefile.in and
|
||||
configure.in, and run autoconf to generate the configure script.
|
||||
.PP
|
||||
The next step would be:
|
||||
.PP
|
||||
$ ./configure --with-wine=/usr/local/opt/wine
|
||||
.PP
|
||||
This generates the makefiles from the Makefile.in files. The generated
|
||||
makefiles will fetch the Winelib headers and libraries from the Wine
|
||||
This generates the makefiles from the Makefile.in files. The generated
|
||||
makefiles will fetch the Winelib headers and libraries from the Wine
|
||||
installation located in /usr/local/opt/wine.
|
||||
.PP
|
||||
And finally:
|
||||
.PP
|
||||
$ make
|
||||
.PP
|
||||
If at this point you get compilation errors (which is quite likely for a
|
||||
reasonably sized project) then you should consult the Winelib User Guide to
|
||||
If at this point you get compilation errors (which is quite likely for a
|
||||
reasonably sized project) then you should consult the Winelib User Guide to
|
||||
find tips on how to resolve them.
|
||||
.PP
|
||||
For an MFC-based project one would have run the following commands instead:
|
||||
|
@ -219,23 +228,23 @@ $ make
|
|||
|
||||
.SH TODO / BUGS
|
||||
.PP
|
||||
Winemaker should support the Visual Studio project files (.dsp for newer
|
||||
versions and .mak for some older versions). This would allow it to be much
|
||||
more accurate, especially for the macro, include and library path
|
||||
Winemaker should support the Visual Studio project files (.dsp for newer
|
||||
versions and .mak for some older versions). This would allow it to be much
|
||||
more accurate, especially for the macro, include and library path
|
||||
settings.
|
||||
.PP
|
||||
Assuming that the windows executable/library is available, we could
|
||||
use a pedump-like tool to determine what kind of executable it is (graphical
|
||||
or console), which libraries it is linked with, and which functions it
|
||||
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
|
||||
Assuming that the windows executable/library is available, we could
|
||||
use a pedump-like tool to determine what kind of executable it is (graphical
|
||||
or console), which libraries it is linked with, and which functions it
|
||||
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
|
||||
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
|
||||
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 .
|
||||
.PP
|
||||
Winemaker does not support message files and the message compiler yet.
|
||||
|
|
Loading…
Reference in New Issue