Merge branch 'js/ci-buildsystems-cleanup'
Code clean-up around stale CI elements and building with Visual Studio. * js/ci-buildsystems-cleanup: config.mak.uname: drop the `vcxproj` target contrib/buildsystems: drop support for building . vcproj/.vcxproj files ci: stop linking the `prove` cachemaint
commit
1551145edb
|
@ -5,11 +5,6 @@
|
|||
|
||||
. ${0%/*}/lib.sh
|
||||
|
||||
case "$CI_OS_NAME" in
|
||||
windows*) cmd //c mklink //j t\\.prove "$(cygpath -aw "$cache_dir/.prove")";;
|
||||
*) ln -s "$cache_dir/.prove" t/.prove;;
|
||||
esac
|
||||
|
||||
run_tests=t
|
||||
|
||||
case "$jobname" in
|
||||
|
|
|
@ -5,11 +5,6 @@
|
|||
|
||||
. ${0%/*}/lib.sh
|
||||
|
||||
case "$CI_OS_NAME" in
|
||||
windows*) cmd //c mklink //j t\\.prove "$(cygpath -aw "$cache_dir/.prove")";;
|
||||
*) ln -s "$cache_dir/.prove" t/.prove;;
|
||||
esac
|
||||
|
||||
group "Run tests" make --quiet -C t T="$(cd t &&
|
||||
./helper/test-tool path-utils slice-tests "$1" "$2" t[0-9]*.sh |
|
||||
tr '\n' ' ')" ||
|
||||
|
|
|
@ -776,79 +776,3 @@ ifeq ($(uname_S),QNX)
|
|||
NO_STRCASESTR = YesPlease
|
||||
NO_STRLCPY = YesPlease
|
||||
endif
|
||||
|
||||
vcxproj:
|
||||
# Require clean work tree
|
||||
git update-index -q --refresh && \
|
||||
git diff-files --quiet && \
|
||||
git diff-index --cached --quiet HEAD --
|
||||
|
||||
# Make .vcxproj files and add them
|
||||
perl contrib/buildsystems/generate -g Vcxproj
|
||||
git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj
|
||||
|
||||
# Generate the LinkOrCopyBuiltins.targets and LinkOrCopyRemoteHttp.targets file
|
||||
(echo '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">' && \
|
||||
echo ' <Target Name="CopyBuiltins_AfterBuild" AfterTargets="AfterBuild">' && \
|
||||
for name in $(BUILT_INS);\
|
||||
do \
|
||||
echo ' <Copy SourceFiles="$$(OutDir)\git.exe" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
|
||||
done && \
|
||||
echo ' </Target>' && \
|
||||
echo '</Project>') >git/LinkOrCopyBuiltins.targets
|
||||
(echo '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">' && \
|
||||
echo ' <Target Name="CopyBuiltins_AfterBuild" AfterTargets="AfterBuild">' && \
|
||||
for name in $(REMOTE_CURL_ALIASES); \
|
||||
do \
|
||||
echo ' <Copy SourceFiles="$$(OutDir)\'"$(REMOTE_CURL_PRIMARY)"'" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
|
||||
done && \
|
||||
echo ' </Target>' && \
|
||||
echo '</Project>') >git-remote-http/LinkOrCopyRemoteHttp.targets
|
||||
git add -f git/LinkOrCopyBuiltins.targets git-remote-http/LinkOrCopyRemoteHttp.targets
|
||||
|
||||
# Add generated headers
|
||||
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(GENERATED_H)
|
||||
git add -f $(GENERATED_H)
|
||||
|
||||
# Add scripts
|
||||
rm -f perl/perl.mak
|
||||
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(SCRIPT_LIB) $(SCRIPTS)
|
||||
# Strip out the sane tool path, needed only for building
|
||||
sed -i '/^git_broken_path_fix ".*/d' git-sh-setup
|
||||
git add -f $(SCRIPT_LIB) $(SCRIPTS)
|
||||
|
||||
# Add Perl module
|
||||
$(MAKE) $(LIB_PERL_GEN)
|
||||
git add -f perl/build
|
||||
|
||||
# Add bin-wrappers, for testing
|
||||
rm -rf bin-wrappers/
|
||||
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(test_bindir_programs)
|
||||
# Ensure that the GIT_EXEC_PATH is a Unix-y one, and that the absolute
|
||||
# path of the repository is not hard-coded (GIT_EXEC_PATH will be set
|
||||
# by test-lib.sh according to the current setup)
|
||||
sed -i -e 's/^\(GIT_EXEC_PATH\)=.*/test -n "$${\1##*:*}" ||\
|
||||
\1="$$(cygpath -u "$$\1")"/' \
|
||||
-e "s|'$$(pwd)|\"\$$GIT_EXEC_PATH\"'|g" bin-wrappers/*
|
||||
# Ensure that test-* helpers find the .dll files copied to top-level
|
||||
sed -i 's|^PATH=.*|&:"$$GIT_EXEC_PATH"|' bin-wrappers/test-*
|
||||
# We do not want to force hard-linking builtins
|
||||
sed -i 's|\(git\)-\([-a-z]*\)\.exe"|\1.exe" \2|g' \
|
||||
bin-wrappers/git-{receive-pack,upload-archive}
|
||||
git add -f $(test_bindir_programs)
|
||||
|
||||
# Add templates
|
||||
$(MAKE) -C templates
|
||||
git add -f templates/boilerplates.made templates/blt/
|
||||
|
||||
# Add the translated messages
|
||||
make MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(MOFILES)
|
||||
git add -f $(MOFILES)
|
||||
|
||||
# Add build options
|
||||
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 GIT-BUILD-OPTIONS
|
||||
git add -f GIT-BUILD-OPTIONS
|
||||
|
||||
# Commit the whole shebang
|
||||
git commit -m "Generate Visual Studio solution" \
|
||||
-m "Auto-generated by \`$(MAKE)$(MAKEFLAGS) $@\`"
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
package Generators;
|
||||
require Exporter;
|
||||
|
||||
use strict;
|
||||
use File::Basename;
|
||||
no strict 'refs';
|
||||
use vars qw($VERSION @AVAILABLE);
|
||||
|
||||
our $VERSION = '1.00';
|
||||
our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
|
||||
@ISA = qw(Exporter);
|
||||
|
||||
BEGIN {
|
||||
local(*D);
|
||||
my $me = $INC{"Generators.pm"};
|
||||
die "Couldn't find myself in \@INC, which is required to load the generators!" if ("$me" eq "");
|
||||
$me = dirname($me);
|
||||
if (opendir(D,"$me/Generators")) {
|
||||
foreach my $gen (readdir(D)) {
|
||||
next unless ($gen =~ /\.pm$/);
|
||||
require "${me}/Generators/$gen";
|
||||
$gen =~ s,\.pm,,;
|
||||
push(@AVAILABLE, $gen);
|
||||
}
|
||||
closedir(D);
|
||||
my $gens = join(', ', @AVAILABLE);
|
||||
}
|
||||
|
||||
push @EXPORT_OK, qw(available);
|
||||
}
|
||||
|
||||
sub available {
|
||||
return @AVAILABLE;
|
||||
}
|
||||
|
||||
sub generate {
|
||||
my ($gen, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
return eval("Generators::${gen}::generate(\$git_dir, \$out_dir, \$rel_dir, \%build_structure)") if grep(/^$gen$/, @AVAILABLE);
|
||||
die "Generator \"${gen}\" is not available!\nAvailable generators are: @AVAILABLE\n";
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,189 +0,0 @@
|
|||
package Generators::QMake;
|
||||
require Exporter;
|
||||
|
||||
use strict;
|
||||
use vars qw($VERSION);
|
||||
|
||||
our $VERSION = '1.00';
|
||||
our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
|
||||
@ISA = qw(Exporter);
|
||||
|
||||
BEGIN {
|
||||
push @EXPORT_OK, qw(generate);
|
||||
}
|
||||
|
||||
sub generate {
|
||||
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
|
||||
my @libs = @{$build_structure{"LIBS"}};
|
||||
foreach (@libs) {
|
||||
createLibProject($_, $git_dir, $out_dir, $rel_dir, %build_structure);
|
||||
}
|
||||
|
||||
my @apps = @{$build_structure{"APPS"}};
|
||||
foreach (@apps) {
|
||||
createAppProject($_, $git_dir, $out_dir, $rel_dir, %build_structure);
|
||||
}
|
||||
|
||||
createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub createLibProject {
|
||||
my ($libname, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
print "Generate $libname lib project\n";
|
||||
$rel_dir = "../$rel_dir";
|
||||
|
||||
my $sources = join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"LIBS_${libname}_SOURCES"}})));
|
||||
my $defines = join(" \\\n\t", sort(@{$build_structure{"LIBS_${libname}_DEFINES"}}));
|
||||
my $includes= join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"LIBS_${libname}_INCLUDES"}})));
|
||||
my $cflags = join(" ", sort(@{$build_structure{"LIBS_${libname}_CFLAGS"}}));
|
||||
|
||||
my $cflags_debug = $cflags;
|
||||
$cflags_debug =~ s/-MT/-MTd/;
|
||||
$cflags_debug =~ s/-O.//;
|
||||
|
||||
my $cflags_release = $cflags;
|
||||
$cflags_release =~ s/-MTd/-MT/;
|
||||
|
||||
my @tmp = @{$build_structure{"LIBS_${libname}_LFLAGS"}};
|
||||
my @tmp2 = ();
|
||||
foreach (@tmp) {
|
||||
if (/^-LTCG/) {
|
||||
} elsif (/^-L/) {
|
||||
$_ =~ s/^-L/-LIBPATH:$rel_dir\//;
|
||||
}
|
||||
push(@tmp2, $_);
|
||||
}
|
||||
my $lflags = join(" ", sort(@tmp));
|
||||
|
||||
my $target = $libname;
|
||||
$target =~ s/\//_/g;
|
||||
$defines =~ s/-D//g;
|
||||
$defines =~ s/"/\\\\"/g;
|
||||
$includes =~ s/-I//g;
|
||||
mkdir "$target" || die "Could not create the directory $target for lib project!\n";
|
||||
open F, ">$target/$target.pro" || die "Could not open $target/$target.pro for writing!\n";
|
||||
print F << "EOM";
|
||||
TEMPLATE = lib
|
||||
TARGET = $target
|
||||
DESTDIR = $rel_dir
|
||||
|
||||
CONFIG -= qt
|
||||
CONFIG += static
|
||||
|
||||
QMAKE_CFLAGS =
|
||||
QMAKE_CFLAGS_RELEASE = $cflags_release
|
||||
QMAKE_CFLAGS_DEBUG = $cflags_debug
|
||||
QMAKE_LIBFLAGS = $lflags
|
||||
|
||||
DEFINES += \\
|
||||
$defines
|
||||
|
||||
INCLUDEPATH += \\
|
||||
$includes
|
||||
|
||||
SOURCES += \\
|
||||
$sources
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
sub createAppProject {
|
||||
my ($appname, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
print "Generate $appname app project\n";
|
||||
$rel_dir = "../$rel_dir";
|
||||
|
||||
my $sources = join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"APPS_${appname}_SOURCES"}})));
|
||||
my $defines = join(" \\\n\t", sort(@{$build_structure{"APPS_${appname}_DEFINES"}}));
|
||||
my $includes= join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"APPS_${appname}_INCLUDES"}})));
|
||||
my $cflags = join(" ", sort(@{$build_structure{"APPS_${appname}_CFLAGS"}}));
|
||||
|
||||
my $cflags_debug = $cflags;
|
||||
$cflags_debug =~ s/-MT/-MTd/;
|
||||
$cflags_debug =~ s/-O.//;
|
||||
|
||||
my $cflags_release = $cflags;
|
||||
$cflags_release =~ s/-MTd/-MT/;
|
||||
|
||||
my $libs;
|
||||
foreach (sort(@{$build_structure{"APPS_${appname}_LIBS"}})) {
|
||||
$_ =~ s/\//_/g;
|
||||
$libs .= " $_";
|
||||
}
|
||||
my @tmp = @{$build_structure{"APPS_${appname}_LFLAGS"}};
|
||||
my @tmp2 = ();
|
||||
foreach (@tmp) {
|
||||
# next if ($_ eq "-NODEFAULTLIB:MSVCRT.lib");
|
||||
if (/^-LTCG/) {
|
||||
} elsif (/^-L/) {
|
||||
$_ =~ s/^-L/-LIBPATH:$rel_dir\//;
|
||||
}
|
||||
push(@tmp2, $_);
|
||||
}
|
||||
my $lflags = join(" ", sort(@tmp));
|
||||
|
||||
my $target = $appname;
|
||||
$target =~ s/\.exe//;
|
||||
$target =~ s/\//_/g;
|
||||
$defines =~ s/-D//g;
|
||||
$defines =~ s/"/\\\\"/g;
|
||||
$includes =~ s/-I//g;
|
||||
mkdir "$target" || die "Could not create the directory $target for app project!\n";
|
||||
open F, ">$target/$target.pro" || die "Could not open $target/$target.pro for writing!\n";
|
||||
print F << "EOM";
|
||||
TEMPLATE = app
|
||||
TARGET = $target
|
||||
DESTDIR = $rel_dir
|
||||
|
||||
CONFIG -= qt embed_manifest_exe
|
||||
CONFIG += console
|
||||
|
||||
QMAKE_CFLAGS =
|
||||
QMAKE_CFLAGS_RELEASE = $cflags_release
|
||||
QMAKE_CFLAGS_DEBUG = $cflags_debug
|
||||
QMAKE_LFLAGS = $lflags
|
||||
LIBS = $libs
|
||||
|
||||
DEFINES += \\
|
||||
$defines
|
||||
|
||||
INCLUDEPATH += \\
|
||||
$includes
|
||||
|
||||
win32:QMAKE_LFLAGS += -LIBPATH:$rel_dir
|
||||
else: QMAKE_LFLAGS += -L$rel_dir
|
||||
|
||||
SOURCES += \\
|
||||
$sources
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
sub createGlueProject {
|
||||
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
my $libs = join(" \\ \n", map("\t$_|$_.pro", @{$build_structure{"LIBS"}}));
|
||||
my $apps = join(" \\ \n", map("\t$_|$_.pro", @{$build_structure{"APPS"}}));
|
||||
$libs =~ s/\.a//g;
|
||||
$libs =~ s/\//_/g;
|
||||
$libs =~ s/\|/\//g;
|
||||
$apps =~ s/\.exe//g;
|
||||
$apps =~ s/\//_/g;
|
||||
$apps =~ s/\|/\//g;
|
||||
|
||||
my $filename = $out_dir;
|
||||
$filename =~ s/.*\/([^\/]+)$/$1/;
|
||||
$filename =~ s/\/$//;
|
||||
print "Generate glue project $filename.pro\n";
|
||||
open F, ">$filename.pro" || die "Could not open $filename.pro for writing!\n";
|
||||
print F << "EOM";
|
||||
TEMPLATE = subdirs
|
||||
CONFIG += ordered
|
||||
SUBDIRS += \\
|
||||
$libs \\
|
||||
$apps
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,579 +0,0 @@
|
|||
package Generators::Vcproj;
|
||||
require Exporter;
|
||||
|
||||
use strict;
|
||||
use vars qw($VERSION);
|
||||
use Digest::SHA qw(sha256_hex);
|
||||
|
||||
our $VERSION = '1.00';
|
||||
our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
|
||||
@ISA = qw(Exporter);
|
||||
|
||||
BEGIN {
|
||||
push @EXPORT_OK, qw(generate);
|
||||
}
|
||||
|
||||
sub generate_guid ($) {
|
||||
my $hex = sha256_hex($_[0]);
|
||||
$hex =~ s/^(.{8})(.{4})(.{4})(.{4})(.{12}).*/{$1-$2-$3-$4-$5}/;
|
||||
$hex =~ tr/a-z/A-Z/;
|
||||
return $hex;
|
||||
}
|
||||
|
||||
sub generate {
|
||||
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
my @libs = @{$build_structure{"LIBS"}};
|
||||
foreach (@libs) {
|
||||
createLibProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure);
|
||||
}
|
||||
|
||||
my @apps = @{$build_structure{"APPS"}};
|
||||
foreach (@apps) {
|
||||
createAppProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure);
|
||||
}
|
||||
|
||||
createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub createLibProject {
|
||||
my ($libname, $git_dir, $out_dir, $rel_dir, $build_structure) = @_;
|
||||
print "Generate $libname vcproj lib project\n";
|
||||
$rel_dir = "..\\$rel_dir";
|
||||
$rel_dir =~ s/\//\\/g;
|
||||
|
||||
my $target = $libname;
|
||||
$target =~ s/\//_/g;
|
||||
$target =~ s/\.a//;
|
||||
|
||||
my $uuid = generate_guid($libname);
|
||||
$$build_structure{"LIBS_${target}_GUID"} = $uuid;
|
||||
|
||||
my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"LIBS_${libname}_SOURCES"}}));
|
||||
my @sources;
|
||||
foreach (@srcs) {
|
||||
$_ =~ s/\//\\/g;
|
||||
push(@sources, $_);
|
||||
}
|
||||
my $defines = join(",", sort(@{$$build_structure{"LIBS_${libname}_DEFINES"}}));
|
||||
my $includes= join(";", sort(map(""$rel_dir\\$_"", @{$$build_structure{"LIBS_${libname}_INCLUDES"}})));
|
||||
my $cflags = join(" ", sort(@{$$build_structure{"LIBS_${libname}_CFLAGS"}}));
|
||||
$cflags =~ s/\"/"/g;
|
||||
$cflags =~ s/</</g;
|
||||
$cflags =~ s/>/>/g;
|
||||
|
||||
my $cflags_debug = $cflags;
|
||||
$cflags_debug =~ s/-MT/-MTd/;
|
||||
$cflags_debug =~ s/-O.//;
|
||||
|
||||
my $cflags_release = $cflags;
|
||||
$cflags_release =~ s/-MTd/-MT/;
|
||||
|
||||
my @tmp = @{$$build_structure{"LIBS_${libname}_LFLAGS"}};
|
||||
my @tmp2 = ();
|
||||
foreach (@tmp) {
|
||||
if (/^-LTCG/) {
|
||||
} elsif (/^-L/) {
|
||||
$_ =~ s/^-L/-LIBPATH:$rel_dir\//;
|
||||
}
|
||||
push(@tmp2, $_);
|
||||
}
|
||||
my $lflags = join(" ", sort(@tmp));
|
||||
|
||||
$defines =~ s/-D//g;
|
||||
$defines =~ s/\"/\\"/g;
|
||||
$defines =~ s/</</g;
|
||||
$defines =~ s/>/>/g;
|
||||
$defines =~ s/\'//g;
|
||||
$includes =~ s/-I//g;
|
||||
mkdir "$target" || die "Could not create the directory $target for lib project!\n";
|
||||
open F, ">$target/$target.vcproj" || die "Could not open $target/$target.pro for writing!\n";
|
||||
binmode F, ":crlf";
|
||||
print F << "EOM";
|
||||
<?xml version="1.0" encoding = "Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9,00"
|
||||
Name="$target"
|
||||
ProjectGUID="$uuid">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$rel_dir"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="0"
|
||||
IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalOptions="$cflags_debug"
|
||||
Optimization="0"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="$includes"
|
||||
PreprocessorDefinitions="WIN32,_DEBUG,$defines"
|
||||
MinimalRebuild="true"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="0"
|
||||
ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
SuppressStartupBanner="true"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$rel_dir"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="0"
|
||||
WholeProgramOptimization="1"
|
||||
IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalOptions="$cflags_release"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="$includes"
|
||||
PreprocessorDefinitions="WIN32,NDEBUG,$defines"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
UsePrecompiledHeader="0"
|
||||
ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
SuppressStartupBanner="true"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
EOM
|
||||
foreach(@sources) {
|
||||
print F << "EOM";
|
||||
<File
|
||||
RelativePath="$_"/>
|
||||
EOM
|
||||
}
|
||||
print F << "EOM";
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
sub createAppProject {
|
||||
my ($appname, $git_dir, $out_dir, $rel_dir, $build_structure) = @_;
|
||||
print "Generate $appname vcproj app project\n";
|
||||
$rel_dir = "..\\$rel_dir";
|
||||
$rel_dir =~ s/\//\\/g;
|
||||
|
||||
my $target = $appname;
|
||||
$target =~ s/\//_/g;
|
||||
$target =~ s/\.exe//;
|
||||
|
||||
my $uuid = generate_guid($appname);
|
||||
$$build_structure{"APPS_${target}_GUID"} = $uuid;
|
||||
|
||||
my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"APPS_${appname}_SOURCES"}}));
|
||||
my @sources;
|
||||
foreach (@srcs) {
|
||||
$_ =~ s/\//\\/g;
|
||||
push(@sources, $_);
|
||||
}
|
||||
my $defines = join(",", sort(@{$$build_structure{"APPS_${appname}_DEFINES"}}));
|
||||
my $includes= join(";", sort(map(""$rel_dir\\$_"", @{$$build_structure{"APPS_${appname}_INCLUDES"}})));
|
||||
my $cflags = join(" ", sort(@{$$build_structure{"APPS_${appname}_CFLAGS"}}));
|
||||
$cflags =~ s/\"/"/g;
|
||||
$cflags =~ s/</</g;
|
||||
$cflags =~ s/>/>/g;
|
||||
|
||||
my $cflags_debug = $cflags;
|
||||
$cflags_debug =~ s/-MT/-MTd/;
|
||||
$cflags_debug =~ s/-O.//;
|
||||
|
||||
my $cflags_release = $cflags;
|
||||
$cflags_release =~ s/-MTd/-MT/;
|
||||
|
||||
my $libs;
|
||||
foreach (sort(@{$$build_structure{"APPS_${appname}_LIBS"}})) {
|
||||
$_ =~ s/\//_/g;
|
||||
$libs .= " $_";
|
||||
}
|
||||
my @tmp = @{$$build_structure{"APPS_${appname}_LFLAGS"}};
|
||||
my @tmp2 = ();
|
||||
foreach (@tmp) {
|
||||
if (/^-LTCG/) {
|
||||
} elsif (/^-L/) {
|
||||
$_ =~ s/^-L/-LIBPATH:$rel_dir\//;
|
||||
}
|
||||
push(@tmp2, $_);
|
||||
}
|
||||
my $lflags = join(" ", sort(@tmp)) . " -LIBPATH:$rel_dir";
|
||||
|
||||
$defines =~ s/-D//g;
|
||||
$defines =~ s/\"/\\"/g;
|
||||
$defines =~ s/</</g;
|
||||
$defines =~ s/>/>/g;
|
||||
$defines =~ s/\'//g;
|
||||
$defines =~ s/\\\\/\\/g;
|
||||
$includes =~ s/-I//g;
|
||||
mkdir "$target" || die "Could not create the directory $target for lib project!\n";
|
||||
open F, ">$target/$target.vcproj" || die "Could not open $target/$target.pro for writing!\n";
|
||||
binmode F, ":crlf";
|
||||
print F << "EOM";
|
||||
<?xml version="1.0" encoding = "Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9,00"
|
||||
Name="$target"
|
||||
ProjectGUID="$uuid">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$rel_dir"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="0"
|
||||
IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalOptions="$cflags_debug"
|
||||
Optimization="0"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="$includes"
|
||||
PreprocessorDefinitions="WIN32,_DEBUG,$defines"
|
||||
MinimalRebuild="true"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="0"
|
||||
ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$libs"
|
||||
AdditionalOptions="$lflags"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$rel_dir"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="0"
|
||||
WholeProgramOptimization="1"
|
||||
IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalOptions="$cflags_release"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="$includes"
|
||||
PreprocessorDefinitions="WIN32,NDEBUG,$defines"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
UsePrecompiledHeader="0"
|
||||
ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$libs"
|
||||
AdditionalOptions="$lflags"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
EOM
|
||||
foreach(@sources) {
|
||||
print F << "EOM";
|
||||
<File
|
||||
RelativePath="$_"/>
|
||||
EOM
|
||||
}
|
||||
print F << "EOM";
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
sub createGlueProject {
|
||||
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
print "Generate solutions file\n";
|
||||
$rel_dir = "..\\$rel_dir";
|
||||
$rel_dir =~ s/\//\\/g;
|
||||
my $SLN_HEAD = "Microsoft Visual Studio Solution File, Format Version 10.00\n# Visual Studio 2008\n";
|
||||
my $SLN_PRE = "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = ";
|
||||
my $SLN_POST = "\nEndProject\n";
|
||||
|
||||
my @libs = @{$build_structure{"LIBS"}};
|
||||
my @tmp;
|
||||
foreach (@libs) {
|
||||
$_ =~ s/\//_/g;
|
||||
$_ =~ s/\.a//;
|
||||
push(@tmp, $_);
|
||||
}
|
||||
@libs = @tmp;
|
||||
|
||||
my @apps = @{$build_structure{"APPS"}};
|
||||
@tmp = ();
|
||||
foreach (@apps) {
|
||||
$_ =~ s/\//_/g;
|
||||
$_ =~ s/\.exe//;
|
||||
if ($_ eq "git" ) {
|
||||
unshift(@tmp, $_);
|
||||
} else {
|
||||
push(@tmp, $_);
|
||||
}
|
||||
}
|
||||
@apps = @tmp;
|
||||
|
||||
open F, ">git.sln" || die "Could not open git.sln for writing!\n";
|
||||
binmode F, ":crlf";
|
||||
print F "$SLN_HEAD";
|
||||
|
||||
my $uuid_libgit = $build_structure{"LIBS_libgit_GUID"};
|
||||
my $uuid_xdiff_lib = $build_structure{"LIBS_xdiff_lib_GUID"};
|
||||
foreach (@apps) {
|
||||
my $appname = $_;
|
||||
my $uuid = $build_structure{"APPS_${appname}_GUID"};
|
||||
print F "$SLN_PRE";
|
||||
print F "\"${appname}\", \"${appname}\\${appname}.vcproj\", \"${uuid}\"\n";
|
||||
print F " ProjectSection(ProjectDependencies) = postProject\n";
|
||||
print F " ${uuid_libgit} = ${uuid_libgit}\n";
|
||||
print F " ${uuid_xdiff_lib} = ${uuid_xdiff_lib}\n";
|
||||
print F " EndProjectSection";
|
||||
print F "$SLN_POST";
|
||||
}
|
||||
foreach (@libs) {
|
||||
my $libname = $_;
|
||||
my $uuid = $build_structure{"LIBS_${libname}_GUID"};
|
||||
print F "$SLN_PRE";
|
||||
print F "\"${libname}\", \"${libname}\\${libname}.vcproj\", \"${uuid}\"";
|
||||
print F "$SLN_POST";
|
||||
}
|
||||
|
||||
print F << "EOM";
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
EOM
|
||||
print F << "EOM";
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
EOM
|
||||
foreach (@apps) {
|
||||
my $appname = $_;
|
||||
my $uuid = $build_structure{"APPS_${appname}_GUID"};
|
||||
print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
|
||||
print F "\t\t${uuid}.Release|Win32.Build.0 = Release|Win32\n";
|
||||
}
|
||||
foreach (@libs) {
|
||||
my $libname = $_;
|
||||
my $uuid = $build_structure{"LIBS_${libname}_GUID"};
|
||||
print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
|
||||
print F "\t\t${uuid}.Release|Win32.Build.0 = Release|Win32\n";
|
||||
}
|
||||
|
||||
print F << "EOM";
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,402 +0,0 @@
|
|||
package Generators::Vcxproj;
|
||||
require Exporter;
|
||||
|
||||
use strict;
|
||||
use vars qw($VERSION);
|
||||
use Digest::SHA qw(sha256_hex);
|
||||
|
||||
our $VERSION = '1.00';
|
||||
our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
|
||||
@ISA = qw(Exporter);
|
||||
|
||||
BEGIN {
|
||||
push @EXPORT_OK, qw(generate);
|
||||
}
|
||||
|
||||
sub generate_guid ($) {
|
||||
my $hex = sha256_hex($_[0]);
|
||||
$hex =~ s/^(.{8})(.{4})(.{4})(.{4})(.{12}).*/{$1-$2-$3-$4-$5}/;
|
||||
$hex =~ tr/a-z/A-Z/;
|
||||
return $hex;
|
||||
}
|
||||
|
||||
sub generate {
|
||||
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
my @libs = @{$build_structure{"LIBS"}};
|
||||
foreach (@libs) {
|
||||
createProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure, 1);
|
||||
}
|
||||
|
||||
my @apps = @{$build_structure{"APPS"}};
|
||||
foreach (@apps) {
|
||||
createProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure, 0);
|
||||
}
|
||||
|
||||
createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub createProject {
|
||||
my ($name, $git_dir, $out_dir, $rel_dir, $build_structure, $static_library) = @_;
|
||||
my $label = $static_library ? "lib" : "app";
|
||||
my $prefix = $static_library ? "LIBS_" : "APPS_";
|
||||
my $config_type = $static_library ? "StaticLibrary" : "Application";
|
||||
print "Generate $name vcxproj $label project\n";
|
||||
my $cdup = $name;
|
||||
$cdup =~ s/[^\/]+/../g;
|
||||
$cdup =~ s/\//\\/g;
|
||||
$rel_dir = $rel_dir eq "." ? $cdup : "$cdup\\$rel_dir";
|
||||
$rel_dir =~ s/\//\\/g;
|
||||
|
||||
my $target = $name;
|
||||
if ($static_library) {
|
||||
$target =~ s/\.a//;
|
||||
} else {
|
||||
$target =~ s/\.exe//;
|
||||
}
|
||||
|
||||
my $uuid = generate_guid($name);
|
||||
$$build_structure{"$prefix${target}_GUID"} = $uuid;
|
||||
my $vcxproj = $target;
|
||||
$vcxproj =~ s/(.*\/)?(.*)/$&\/$2.vcxproj/;
|
||||
$vcxproj =~ s/([^\/]*)(\/lib)\/(lib.vcxproj)/$1$2\/$1_$3/;
|
||||
$$build_structure{"$prefix${target}_VCXPROJ"} = $vcxproj;
|
||||
|
||||
my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"$prefix${name}_SOURCES"}}));
|
||||
my @sources;
|
||||
foreach (@srcs) {
|
||||
$_ =~ s/\//\\/g;
|
||||
push(@sources, $_);
|
||||
}
|
||||
my $defines = join(";", sort(@{$$build_structure{"$prefix${name}_DEFINES"}}));
|
||||
my $includes= join(";", sort(map { s/^-I//; s/\//\\/g; File::Spec->file_name_is_absolute($_) ? $_ : "$rel_dir\\$_" } @{$$build_structure{"$prefix${name}_INCLUDES"}}));
|
||||
my $cflags = join(" ", sort(map { s/^-[GLMOWZ].*//; s/.* .*/"$&"/; $_; } @{$$build_structure{"$prefix${name}_CFLAGS"}}));
|
||||
$cflags =~ s/</</g;
|
||||
$cflags =~ s/>/>/g;
|
||||
|
||||
my $libs_release = "\n ";
|
||||
my $libs_debug = "\n ";
|
||||
if (!$static_library && $name ne 'headless-git') {
|
||||
$libs_release = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib|reftable\/libreftable\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
|
||||
$libs_debug = $libs_release;
|
||||
$libs_debug =~ s/zlib\.lib/zlibd\.lib/g;
|
||||
$libs_debug =~ s/libexpat\.lib/libexpatd\.lib/g;
|
||||
$libs_debug =~ s/libcurl\.lib/libcurl-d\.lib/g;
|
||||
}
|
||||
|
||||
$defines =~ s/-D//g;
|
||||
$defines =~ s/</</g;
|
||||
$defines =~ s/>/>/g;
|
||||
$defines =~ s/\'//g;
|
||||
|
||||
die "Could not create the directory $target for $label project!\n" unless (-d "$target" || mkdir "$target");
|
||||
|
||||
open F, ">$vcxproj" or die "Could not open $vcxproj for writing!\n";
|
||||
binmode F, ":crlf :utf8";
|
||||
print F chr(0xFEFF);
|
||||
print F << "EOM";
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>$uuid</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<VCPKGArch Condition="'\$(Platform)'=='Win32'">x86-windows</VCPKGArch>
|
||||
<VCPKGArch Condition="'\$(Platform)'!='Win32'">x64-windows</VCPKGArch>
|
||||
<VCPKGArchDirectory>$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)</VCPKGArchDirectory>
|
||||
<VCPKGBinDirectory Condition="'\$(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\bin</VCPKGBinDirectory>
|
||||
<VCPKGLibDirectory Condition="'\$(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\lib</VCPKGLibDirectory>
|
||||
<VCPKGBinDirectory Condition="'\$(Configuration)'!='Debug'">\$(VCPKGArchDirectory)\\bin</VCPKGBinDirectory>
|
||||
<VCPKGLibDirectory Condition="'\$(Configuration)'!='Debug'">\$(VCPKGArchDirectory)\\lib</VCPKGLibDirectory>
|
||||
<VCPKGIncludeDirectory>\$(VCPKGArchDirectory)\\include</VCPKGIncludeDirectory>
|
||||
<VCPKGLibs Condition="'\$(Configuration)'=='Debug'">$libs_debug</VCPKGLibs>
|
||||
<VCPKGLibs Condition="'\$(Configuration)'!='Debug'">$libs_release</VCPKGLibs>
|
||||
</PropertyGroup>
|
||||
<Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'\$(Configuration)'=='Debug'" Label="Configuration">
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'\$(Configuration)'=='Release'" Label="Configuration">
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ConfigurationType>$config_type</ConfigurationType>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<!-- <CharacterSet>UTF-8</CharacterSet> -->
|
||||
<OutDir>..\\</OutDir>
|
||||
<!-- <IntDir>\$(ProjectDir)\$(Configuration)\\</IntDir> -->
|
||||
</PropertyGroup>
|
||||
<Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props" Condition="exists('\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
<EnableManagedIncrementalBuild>true</EnableManagedIncrementalBuild>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>$cflags %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalIncludeDirectories>$cdup;$cdup\\compat;$cdup\\compat\\regex;$cdup\\compat\\win32;$cdup\\compat\\poll;$cdup\\compat\\vcbuild\\include;\$(VCPKGIncludeDirectory);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<EnableParallelCodeGeneration />
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<PrecompiledHeader />
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Lib>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</Lib>
|
||||
<Link>
|
||||
<AdditionalLibraryDirectories>\$(VCPKGLibDirectory);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>\$(VCPKGLibs);\$(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalOptions>invalidcontinue.obj %(AdditionalOptions)</AdditionalOptions>
|
||||
<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>
|
||||
<ManifestFile>$cdup\\compat\\win32\\git.manifest</ManifestFile>
|
||||
<SubSystem>Console</SubSystem>
|
||||
</Link>
|
||||
EOM
|
||||
if ($target eq 'libgit') {
|
||||
print F << "EOM";
|
||||
<PreBuildEvent Condition="!Exists('$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)\\include\\openssl\\ssl.h')">
|
||||
<Message>Initialize VCPKG</Message>
|
||||
<Command>del "$cdup\\compat\\vcbuild\\vcpkg"</Command>
|
||||
<Command>call "$cdup\\compat\\vcbuild\\vcpkg_install.bat"</Command>
|
||||
</PreBuildEvent>
|
||||
EOM
|
||||
}
|
||||
print F << "EOM";
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'\$(Platform)'=='Win32'">
|
||||
<Link>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'\$(Configuration)'=='Debug'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;$defines;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'\$(Configuration)'=='Release'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;$defines;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
EOM
|
||||
foreach(@sources) {
|
||||
print F << "EOM";
|
||||
<ClCompile Include="$_" />
|
||||
EOM
|
||||
}
|
||||
print F << "EOM";
|
||||
</ItemGroup>
|
||||
EOM
|
||||
if ((!$static_library || $target =~ 'vcs-svn' || $target =~ 'xdiff') && !($name =~ /headless-git/)) {
|
||||
my $uuid_libgit = $$build_structure{"LIBS_libgit_GUID"};
|
||||
my $uuid_libreftable = $$build_structure{"LIBS_reftable/libreftable_GUID"};
|
||||
my $uuid_xdiff_lib = $$build_structure{"LIBS_xdiff/lib_GUID"};
|
||||
|
||||
print F << "EOM";
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="$cdup\\libgit\\libgit.vcxproj">
|
||||
<Project>$uuid_libgit</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
EOM
|
||||
if (!($name =~ /xdiff|libreftable/)) {
|
||||
print F << "EOM";
|
||||
<ProjectReference Include="$cdup\\reftable\\libreftable\\libreftable.vcxproj">
|
||||
<Project>$uuid_libreftable</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
EOM
|
||||
}
|
||||
if (!($name =~ 'xdiff')) {
|
||||
print F << "EOM";
|
||||
<ProjectReference Include="$cdup\\xdiff\\lib\\xdiff_lib.vcxproj">
|
||||
<Project>$uuid_xdiff_lib</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
EOM
|
||||
}
|
||||
if ($name =~ /(test-(line-buffer|svn-fe)|^git-remote-testsvn)\.exe$/) {
|
||||
my $uuid_vcs_svn_lib = $$build_structure{"LIBS_vcs-svn/lib_GUID"};
|
||||
print F << "EOM";
|
||||
<ProjectReference Include="$cdup\\vcs-svn\\lib\\vcs-svn_lib.vcxproj">
|
||||
<Project>$uuid_vcs_svn_lib</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
EOM
|
||||
}
|
||||
print F << "EOM";
|
||||
</ItemGroup>
|
||||
EOM
|
||||
}
|
||||
print F << "EOM";
|
||||
<Import Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets" />
|
||||
EOM
|
||||
if (!$static_library) {
|
||||
print F << "EOM";
|
||||
<Target Name="${target}_AfterBuild" AfterTargets="AfterBuild">
|
||||
<ItemGroup>
|
||||
<DLLsAndPDBs Include="\$(VCPKGBinDirectory)\\*.dll;\$(VCPKGBinDirectory)\\*.pdb" />
|
||||
</ItemGroup>
|
||||
<Copy SourceFiles="@(DLLsAndPDBs)" DestinationFolder="\$(OutDir)" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />
|
||||
<MakeDir Directories="..\\templates\\blt\\branches" />
|
||||
</Target>
|
||||
EOM
|
||||
}
|
||||
if ($target eq 'git') {
|
||||
print F " <Import Project=\"LinkOrCopyBuiltins.targets\" />\n";
|
||||
}
|
||||
if ($target eq 'git-remote-http') {
|
||||
print F " <Import Project=\"LinkOrCopyRemoteHttp.targets\" />\n";
|
||||
}
|
||||
print F << "EOM";
|
||||
</Project>
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
sub createGlueProject {
|
||||
my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
|
||||
print "Generate solutions file\n";
|
||||
$rel_dir = "..\\$rel_dir";
|
||||
$rel_dir =~ s/\//\\/g;
|
||||
my $SLN_HEAD = "Microsoft Visual Studio Solution File, Format Version 11.00\n# Visual Studio 2010\n";
|
||||
my $SLN_PRE = "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = ";
|
||||
my $SLN_POST = "\nEndProject\n";
|
||||
|
||||
my @libs = @{$build_structure{"LIBS"}};
|
||||
my @tmp;
|
||||
foreach (@libs) {
|
||||
$_ =~ s/\.a//;
|
||||
push(@tmp, $_);
|
||||
}
|
||||
@libs = @tmp;
|
||||
|
||||
my @apps = @{$build_structure{"APPS"}};
|
||||
@tmp = ();
|
||||
foreach (@apps) {
|
||||
$_ =~ s/\.exe//;
|
||||
if ($_ eq "git" ) {
|
||||
unshift(@tmp, $_);
|
||||
} else {
|
||||
push(@tmp, $_);
|
||||
}
|
||||
}
|
||||
@apps = @tmp;
|
||||
|
||||
open F, ">git.sln" || die "Could not open git.sln for writing!\n";
|
||||
binmode F, ":crlf :utf8";
|
||||
print F chr(0xFEFF);
|
||||
print F "$SLN_HEAD";
|
||||
|
||||
foreach (@apps) {
|
||||
my $appname = $_;
|
||||
my $uuid = $build_structure{"APPS_${appname}_GUID"};
|
||||
print F "$SLN_PRE";
|
||||
my $vcxproj = $build_structure{"APPS_${appname}_VCXPROJ"};
|
||||
$vcxproj =~ s/\//\\/g;
|
||||
$appname =~ s/.*\///;
|
||||
print F "\"${appname}\", \"${vcxproj}\", \"${uuid}\"";
|
||||
print F "$SLN_POST";
|
||||
}
|
||||
foreach (@libs) {
|
||||
my $libname = $_;
|
||||
my $uuid = $build_structure{"LIBS_${libname}_GUID"};
|
||||
print F "$SLN_PRE";
|
||||
my $vcxproj = $build_structure{"LIBS_${libname}_VCXPROJ"};
|
||||
$vcxproj =~ s/\//\\/g;
|
||||
$libname =~ s/\//_/g;
|
||||
print F "\"${libname}\", \"${vcxproj}\", \"${uuid}\"";
|
||||
print F "$SLN_POST";
|
||||
}
|
||||
|
||||
print F << "EOM";
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
EOM
|
||||
print F << "EOM";
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
EOM
|
||||
foreach (@apps) {
|
||||
my $appname = $_;
|
||||
my $uuid = $build_structure{"APPS_${appname}_GUID"};
|
||||
print F "\t\t${uuid}.Debug|x64.ActiveCfg = Debug|x64\n";
|
||||
print F "\t\t${uuid}.Debug|x64.Build.0 = Debug|x64\n";
|
||||
print F "\t\t${uuid}.Debug|x86.ActiveCfg = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Debug|x86.Build.0 = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Release|x64.ActiveCfg = Release|x64\n";
|
||||
print F "\t\t${uuid}.Release|x64.Build.0 = Release|x64\n";
|
||||
print F "\t\t${uuid}.Release|x86.ActiveCfg = Release|Win32\n";
|
||||
print F "\t\t${uuid}.Release|x86.Build.0 = Release|Win32\n";
|
||||
}
|
||||
foreach (@libs) {
|
||||
my $libname = $_;
|
||||
my $uuid = $build_structure{"LIBS_${libname}_GUID"};
|
||||
print F "\t\t${uuid}.Debug|x64.ActiveCfg = Debug|x64\n";
|
||||
print F "\t\t${uuid}.Debug|x64.Build.0 = Debug|x64\n";
|
||||
print F "\t\t${uuid}.Debug|x86.ActiveCfg = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Debug|x86.Build.0 = Debug|Win32\n";
|
||||
print F "\t\t${uuid}.Release|x64.ActiveCfg = Release|x64\n";
|
||||
print F "\t\t${uuid}.Release|x64.Build.0 = Release|x64\n";
|
||||
print F "\t\t${uuid}.Release|x86.ActiveCfg = Release|Win32\n";
|
||||
print F "\t\t${uuid}.Release|x86.Build.0 = Release|Win32\n";
|
||||
}
|
||||
|
||||
print F << "EOM";
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
EOM
|
||||
close F;
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,395 +0,0 @@
|
|||
#!/usr/bin/perl -w
|
||||
######################################################################
|
||||
# Do not call this script directly!
|
||||
#
|
||||
# The generate script ensures that @INC is correct before the engine
|
||||
# is executed.
|
||||
#
|
||||
# Copyright (C) 2009 Marius Storm-Olsen <mstormo@gmail.com>
|
||||
######################################################################
|
||||
use strict;
|
||||
use File::Basename;
|
||||
use File::Spec;
|
||||
use Cwd;
|
||||
use Generators;
|
||||
use Text::ParseWords;
|
||||
|
||||
my (%build_structure, %compile_options, @makedry);
|
||||
my $out_dir = getcwd();
|
||||
my $git_dir = $out_dir;
|
||||
$git_dir =~ s=\\=/=g;
|
||||
$git_dir = dirname($git_dir) while (!-e "$git_dir/git.c" && "$git_dir" ne "");
|
||||
die "Couldn't find Git repo" if ("$git_dir" eq "");
|
||||
|
||||
my @gens = Generators::available();
|
||||
my $gen = "Vcproj";
|
||||
|
||||
sub showUsage
|
||||
{
|
||||
my $genlist = join(', ', @gens);
|
||||
print << "EOM";
|
||||
generate usage:
|
||||
-g <GENERATOR> --gen <GENERATOR> Specify the buildsystem generator (default: $gen)
|
||||
Available: $genlist
|
||||
-o <PATH> --out <PATH> Specify output directory generation (default: .)
|
||||
--make-out <PATH> Write the output of GNU Make into a file
|
||||
-i <FILE> --in <FILE> Specify input file, instead of running GNU Make
|
||||
-h,-? --help This help
|
||||
EOM
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Parse command-line options
|
||||
my $make_out;
|
||||
while (@ARGV) {
|
||||
my $arg = shift @ARGV;
|
||||
if ("$arg" eq "-h" || "$arg" eq "--help" || "$arg" eq "-?") {
|
||||
showUsage();
|
||||
exit(0);
|
||||
} elsif("$arg" eq "--out" || "$arg" eq "-o") {
|
||||
$out_dir = shift @ARGV;
|
||||
} elsif("$arg" eq "--make-out") {
|
||||
$make_out = shift @ARGV;
|
||||
} elsif("$arg" eq "--gen" || "$arg" eq "-g") {
|
||||
$gen = shift @ARGV;
|
||||
} elsif("$arg" eq "--in" || "$arg" eq "-i") {
|
||||
my $infile = shift @ARGV;
|
||||
open(F, "<$infile") || die "Couldn't open file $infile";
|
||||
@makedry = <F>;
|
||||
close(F);
|
||||
} else {
|
||||
die "Unknown option: " . $arg;
|
||||
}
|
||||
}
|
||||
|
||||
# NOT using File::Spec->rel2abs($path, $base) here, as
|
||||
# it fails badly for me in the msysgit environment
|
||||
$git_dir = File::Spec->rel2abs($git_dir);
|
||||
$out_dir = File::Spec->rel2abs($out_dir);
|
||||
my $rel_dir = makeOutRel2Git($git_dir, $out_dir);
|
||||
|
||||
# Print some information so the user feels informed
|
||||
print << "EOM";
|
||||
-----
|
||||
Generator: $gen
|
||||
Git dir: $git_dir
|
||||
Out dir: $out_dir
|
||||
-----
|
||||
Running GNU Make to figure out build structure...
|
||||
EOM
|
||||
|
||||
# Pipe a make --dry-run into a variable, if not already loaded from file
|
||||
# Capture the make dry stderr to file for review (will be empty for a release build).
|
||||
|
||||
my $ErrsFile = "msvc-build-makedryerrors.txt";
|
||||
@makedry = `make -C $git_dir -n MSVC=1 SKIP_VCPKG=1 V=1 2>$ErrsFile`
|
||||
if !@makedry;
|
||||
# test for an empty Errors file and remove it
|
||||
unlink $ErrsFile if -f -z $ErrsFile;
|
||||
|
||||
if (defined $make_out) {
|
||||
open OUT, ">" . $make_out;
|
||||
print OUT @makedry;
|
||||
close OUT;
|
||||
}
|
||||
|
||||
# Parse the make output into usable info
|
||||
parseMakeOutput();
|
||||
|
||||
# Finally, ask the generator to start generating..
|
||||
Generators::generate($gen, $git_dir, $out_dir, $rel_dir, %build_structure);
|
||||
|
||||
# main flow ends here
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# 1) path: /foo/bar/baz 2) path: /foo/bar/baz 3) path: /foo/bar/baz
|
||||
# base: /foo/bar/baz/temp base: /foo/bar base: /tmp
|
||||
# rel: .. rel: baz rel: ../foo/bar/baz
|
||||
sub makeOutRel2Git
|
||||
{
|
||||
my ($path, $base) = @_;
|
||||
my $rel;
|
||||
if ("$path" eq "$base") {
|
||||
return ".";
|
||||
} elsif ($base =~ /^$path/) {
|
||||
# case 1
|
||||
my $tmp = $base;
|
||||
$tmp =~ s/^$path//;
|
||||
foreach (split('/', $tmp)) {
|
||||
$rel .= "../" if ("$_" ne "");
|
||||
}
|
||||
} elsif ($path =~ /^$base/) {
|
||||
# case 2
|
||||
$rel = $path;
|
||||
$rel =~ s/^$base//;
|
||||
$rel = "./$rel";
|
||||
} else {
|
||||
my $tmp = $base;
|
||||
foreach (split('/', $tmp)) {
|
||||
$rel .= "../" if ("$_" ne "");
|
||||
}
|
||||
$rel .= $path;
|
||||
}
|
||||
$rel =~ s/\/\//\//g; # simplify
|
||||
$rel =~ s/\/$//; # don't end with /
|
||||
return $rel;
|
||||
}
|
||||
|
||||
sub parseMakeOutput
|
||||
{
|
||||
print "Parsing GNU Make output to figure out build structure...\n";
|
||||
my $line = 0;
|
||||
while (my $text = shift @makedry) {
|
||||
my $ate_next;
|
||||
do {
|
||||
$ate_next = 0;
|
||||
$line++;
|
||||
chomp $text;
|
||||
chop $text if ($text =~ /\r$/);
|
||||
if ($text =~ /\\$/) {
|
||||
$text =~ s/\\$//;
|
||||
$text .= shift @makedry;
|
||||
$ate_next = 1;
|
||||
}
|
||||
} while($ate_next);
|
||||
|
||||
if ($text =~ /^test /) {
|
||||
# options to test (eg -o) may be mistaken for linker options
|
||||
next;
|
||||
}
|
||||
|
||||
if ($text =~ /^(mkdir|msgfmt) /) {
|
||||
# options to the Portable Object translations
|
||||
# the line "mkdir ... && msgfmt ..." contains no linker options
|
||||
next;
|
||||
}
|
||||
|
||||
if($text =~ / -c /) {
|
||||
# compilation
|
||||
handleCompileLine($text, $line);
|
||||
|
||||
} elsif ($text =~ / -o /) {
|
||||
# linking executable
|
||||
handleLinkLine($text, $line);
|
||||
|
||||
} elsif ($text =~ /\.o / && $text =~ /\.a /) {
|
||||
# libifying
|
||||
handleLibLine($text, $line);
|
||||
#
|
||||
# } elsif ($text =~ /^cp /) {
|
||||
# # copy file around
|
||||
#
|
||||
# } elsif ($text =~ /^rm -f /) {
|
||||
# # shell command
|
||||
#
|
||||
# } elsif ($text =~ /^make[ \[]/) {
|
||||
# # make output
|
||||
#
|
||||
# } elsif ($text =~ /^echo /) {
|
||||
# # echo to file
|
||||
#
|
||||
# } elsif ($text =~ /^if /) {
|
||||
# # shell conditional
|
||||
#
|
||||
# } elsif ($text =~ /^tclsh /) {
|
||||
# # translation stuff
|
||||
#
|
||||
# } elsif ($text =~ /^umask /) {
|
||||
# # handling boilerplates
|
||||
#
|
||||
# } elsif ($text =~ /\$\(\:\)/) {
|
||||
# # ignore
|
||||
#
|
||||
# } elsif ($text =~ /^FLAGS=/) {
|
||||
# # flags check for dependencies
|
||||
#
|
||||
# } elsif ($text =~ /^'\/usr\/bin\/perl' -MError -e/) {
|
||||
# # perl commands for copying files
|
||||
#
|
||||
# } elsif ($text =~ /generate-cmdlist\.sh/) {
|
||||
# # command for generating list of commands
|
||||
#
|
||||
# } elsif ($text =~ /new locations or Tcl/) {
|
||||
# # command for detecting Tcl/Tk changes
|
||||
#
|
||||
# } elsif ($text =~ /mkdir -p/) {
|
||||
# # command creating path
|
||||
#
|
||||
# } elsif ($text =~ /: no custom templates yet/) {
|
||||
# # whatever
|
||||
#
|
||||
# } else {
|
||||
# print "Unhandled (line: $line): $text\n";
|
||||
}
|
||||
}
|
||||
|
||||
# use Data::Dumper;
|
||||
# print "Parsed build structure:\n";
|
||||
# print Dumper(%build_structure);
|
||||
}
|
||||
|
||||
# variables for the compilation part of each step
|
||||
my (@defines, @incpaths, @cflags, @sources);
|
||||
|
||||
sub clearCompileStep
|
||||
{
|
||||
@defines = ();
|
||||
@incpaths = ();
|
||||
@cflags = ();
|
||||
@sources = ();
|
||||
}
|
||||
|
||||
sub removeDuplicates
|
||||
{
|
||||
my (%dupHash, $entry);
|
||||
%dupHash = map { $_, 1 } @defines;
|
||||
@defines = keys %dupHash;
|
||||
|
||||
%dupHash = map { $_, 1 } @incpaths;
|
||||
@incpaths = keys %dupHash;
|
||||
|
||||
%dupHash = map { $_, 1 } @cflags;
|
||||
@cflags = keys %dupHash;
|
||||
}
|
||||
|
||||
sub handleCompileLine
|
||||
{
|
||||
my ($line, $lineno) = @_;
|
||||
my @parts = shellwords($line);
|
||||
my $sourcefile;
|
||||
shift(@parts); # ignore cmd
|
||||
while (my $part = shift @parts) {
|
||||
if ("$part" eq "-o") {
|
||||
# ignore object file
|
||||
shift @parts;
|
||||
} elsif ("$part" eq "-c") {
|
||||
# ignore compile flag
|
||||
} elsif ("$part" eq "-c") {
|
||||
} elsif ($part =~ /^.?-I/) {
|
||||
push(@incpaths, $part);
|
||||
} elsif ($part =~ /^.?-D/) {
|
||||
push(@defines, $part);
|
||||
} elsif ($part =~ /^-/) {
|
||||
push(@cflags, $part);
|
||||
} elsif ($part =~ /\.(c|cc|cpp)$/) {
|
||||
$sourcefile = $part;
|
||||
} else {
|
||||
die "Unhandled compiler option @ line $lineno: $part";
|
||||
}
|
||||
}
|
||||
@{$compile_options{"${sourcefile}_CFLAGS"}} = @cflags;
|
||||
@{$compile_options{"${sourcefile}_DEFINES"}} = @defines;
|
||||
@{$compile_options{"${sourcefile}_INCPATHS"}} = @incpaths;
|
||||
clearCompileStep();
|
||||
}
|
||||
|
||||
sub handleLibLine
|
||||
{
|
||||
my ($line, $lineno) = @_;
|
||||
my (@objfiles, @lflags, $libout, $part);
|
||||
# kill cmd and rm 'prefix'
|
||||
$line =~ s/^rm -f .* && .* rcs //;
|
||||
my @parts = shellwords($line);
|
||||
while ($part = shift @parts) {
|
||||
if ($part =~ /^-/) {
|
||||
push(@lflags, $part);
|
||||
} elsif ($part =~ /\.(o|obj)$/) {
|
||||
push(@objfiles, $part);
|
||||
} elsif ($part =~ /\.(a|lib)$/) {
|
||||
$libout = $part;
|
||||
$libout =~ s/\.a$//;
|
||||
} else {
|
||||
die "Unhandled lib option @ line $lineno: $part";
|
||||
}
|
||||
}
|
||||
# print "LibOut: '$libout'\nLFlags: @lflags\nOfiles: @objfiles\n";
|
||||
# exit(1);
|
||||
foreach (@objfiles) {
|
||||
my $sourcefile = $_;
|
||||
$sourcefile =~ s/\.o$/.c/;
|
||||
push(@sources, $sourcefile);
|
||||
push(@cflags, @{$compile_options{"${sourcefile}_CFLAGS"}});
|
||||
push(@defines, @{$compile_options{"${sourcefile}_DEFINES"}});
|
||||
push(@incpaths, @{$compile_options{"${sourcefile}_INCPATHS"}});
|
||||
}
|
||||
removeDuplicates();
|
||||
|
||||
push(@{$build_structure{"LIBS"}}, $libout);
|
||||
@{$build_structure{"LIBS_${libout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_SOURCES",
|
||||
"_OBJECTS");
|
||||
@{$build_structure{"LIBS_${libout}_DEFINES"}} = @defines;
|
||||
@{$build_structure{"LIBS_${libout}_INCLUDES"}} = @incpaths;
|
||||
@{$build_structure{"LIBS_${libout}_CFLAGS"}} = @cflags;
|
||||
@{$build_structure{"LIBS_${libout}_LFLAGS"}} = @lflags;
|
||||
@{$build_structure{"LIBS_${libout}_SOURCES"}} = @sources;
|
||||
@{$build_structure{"LIBS_${libout}_OBJECTS"}} = @objfiles;
|
||||
clearCompileStep();
|
||||
}
|
||||
|
||||
sub handleLinkLine
|
||||
{
|
||||
my ($line, $lineno) = @_;
|
||||
my (@objfiles, @lflags, @libs, $appout, $part);
|
||||
my @parts = shellwords($line);
|
||||
shift(@parts); # ignore cmd
|
||||
while ($part = shift @parts) {
|
||||
if ($part =~ /^-IGNORE/) {
|
||||
push(@lflags, $part);
|
||||
} elsif ($part =~ /^-[GRIMDO]/) {
|
||||
# eat compiler flags
|
||||
} elsif ("$part" eq "-o") {
|
||||
$appout = shift @parts;
|
||||
} elsif ("$part" eq "-lz") {
|
||||
push(@libs, "zlib.lib");
|
||||
} elsif ("$part" eq "-lcrypto") {
|
||||
push(@libs, "libcrypto.lib");
|
||||
} elsif ("$part" eq "-lssl") {
|
||||
push(@libs, "libssl.lib");
|
||||
} elsif ("$part" eq "-lcurl") {
|
||||
push(@libs, "libcurl.lib");
|
||||
} elsif ("$part" eq "-lexpat") {
|
||||
push(@libs, "libexpat.lib");
|
||||
} elsif ("$part" eq "-liconv") {
|
||||
push(@libs, "iconv.lib");
|
||||
} elsif ($part =~ /^[-\/]/) {
|
||||
push(@lflags, $part);
|
||||
} elsif ($part =~ /\.(a|lib)$/) {
|
||||
$part =~ s/\.a$/.lib/;
|
||||
push(@libs, $part);
|
||||
} elsif ($part eq 'invalidcontinue.obj') {
|
||||
# ignore - known to MSVC
|
||||
} elsif ($part =~ /\.o$/) {
|
||||
push(@objfiles, $part);
|
||||
} elsif ($part =~ /\.obj$/) {
|
||||
# do nothing, 'make' should not be producing .obj, only .o files
|
||||
} else {
|
||||
die "Unhandled link option @ line $lineno: $part";
|
||||
}
|
||||
}
|
||||
# print "AppOut: '$appout'\nLFlags: @lflags\nLibs : @libs\nOfiles: @objfiles\n";
|
||||
# exit(1);
|
||||
foreach (@objfiles) {
|
||||
my $sourcefile = $_;
|
||||
$sourcefile =~ s/^headless-git\.o$/compat\/win32\/headless.c/;
|
||||
$sourcefile =~ s/\.o$/.c/;
|
||||
push(@sources, $sourcefile);
|
||||
push(@cflags, @{$compile_options{"${sourcefile}_CFLAGS"}});
|
||||
push(@defines, @{$compile_options{"${sourcefile}_DEFINES"}});
|
||||
push(@incpaths, @{$compile_options{"${sourcefile}_INCPATHS"}});
|
||||
}
|
||||
removeDuplicates();
|
||||
|
||||
removeDuplicates();
|
||||
push(@{$build_structure{"APPS"}}, $appout);
|
||||
@{$build_structure{"APPS_${appout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_LFLAGS",
|
||||
"_SOURCES", "_OBJECTS", "_LIBS");
|
||||
@{$build_structure{"APPS_${appout}_DEFINES"}} = @defines;
|
||||
@{$build_structure{"APPS_${appout}_INCLUDES"}} = @incpaths;
|
||||
@{$build_structure{"APPS_${appout}_CFLAGS"}} = @cflags;
|
||||
@{$build_structure{"APPS_${appout}_LFLAGS"}} = @lflags;
|
||||
@{$build_structure{"APPS_${appout}_SOURCES"}} = @sources;
|
||||
@{$build_structure{"APPS_${appout}_OBJECTS"}} = @objfiles;
|
||||
@{$build_structure{"APPS_${appout}_LIBS"}} = @libs;
|
||||
clearCompileStep();
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
#!/usr/bin/perl -w
|
||||
######################################################################
|
||||
# Generate buildsystem files
|
||||
#
|
||||
# This script generate buildsystem files based on the output of a
|
||||
# GNU Make --dry-run, enabling Windows users to develop Git with their
|
||||
# trusted IDE with native projects.
|
||||
#
|
||||
# Note:
|
||||
# It is not meant as *the* way of building Git with MSVC, but merely a
|
||||
# convenience. The correct way of building Git with MSVC is to use the
|
||||
# GNU Make tool to build with the maintained Makefile in the root of
|
||||
# the project. If you have the msysgit environment installed and
|
||||
# available in your current console, together with the Visual Studio
|
||||
# environment you wish to build for, all you have to do is run the
|
||||
# command:
|
||||
# make MSVC=1
|
||||
#
|
||||
# Copyright (C) 2009 Marius Storm-Olsen <mstormo@gmail.com>
|
||||
######################################################################
|
||||
use strict;
|
||||
use File::Basename;
|
||||
use Cwd;
|
||||
|
||||
my $git_dir = getcwd();
|
||||
$git_dir =~ s=\\=/=g;
|
||||
$git_dir = dirname($git_dir) while (!-e "$git_dir/git.c" && "$git_dir" ne "");
|
||||
die "Couldn't find Git repo" if ("$git_dir" eq "");
|
||||
exec join(" ", ("PERL5LIB=${git_dir}/contrib/buildsystems ${git_dir}/contrib/buildsystems/engine.pl", @ARGV));
|
|
@ -1,228 +0,0 @@
|
|||
#!/usr/bin/perl -w
|
||||
######################################################################
|
||||
# Do not call this script directly!
|
||||
#
|
||||
# The generate script ensures that @INC is correct before the engine
|
||||
# is executed.
|
||||
#
|
||||
# Copyright (C) 2009 Marius Storm-Olsen <mstormo@gmail.com>
|
||||
######################################################################
|
||||
use strict;
|
||||
use File::Basename;
|
||||
use Cwd;
|
||||
|
||||
my $file = $ARGV[0];
|
||||
die "No file provided!" if !defined $file;
|
||||
|
||||
my ($cflags, $target, $type, $line);
|
||||
|
||||
open(F, "<$file") || die "Couldn't open file $file";
|
||||
my @data = <F>;
|
||||
close(F);
|
||||
|
||||
while (my $text = shift @data) {
|
||||
my $ate_next;
|
||||
do {
|
||||
$ate_next = 0;
|
||||
$line++;
|
||||
chomp $text;
|
||||
chop $text if ($text =~ /\r$/);
|
||||
if ($text =~ /\\$/) {
|
||||
$text =~ s/\\$//;
|
||||
$text .= shift @data;
|
||||
$ate_next = 1;
|
||||
}
|
||||
} while($ate_next);
|
||||
|
||||
if($text =~ / -c /) {
|
||||
# compilation
|
||||
handleCompileLine($text, $line);
|
||||
|
||||
} elsif ($text =~ / -o /) {
|
||||
# linking executable
|
||||
handleLinkLine($text, $line);
|
||||
|
||||
} elsif ($text =~ /\.o / && $text =~ /\.a /) {
|
||||
# libifying
|
||||
handleLibLine($text, $line);
|
||||
|
||||
# } elsif ($text =~ /^cp /) {
|
||||
# # copy file around
|
||||
#
|
||||
# } elsif ($text =~ /^rm -f /) {
|
||||
# # shell command
|
||||
#
|
||||
# } elsif ($text =~ /^make[ \[]/) {
|
||||
# # make output
|
||||
#
|
||||
# } elsif ($text =~ /^echo /) {
|
||||
# # echo to file
|
||||
#
|
||||
# } elsif ($text =~ /^if /) {
|
||||
# # shell conditional
|
||||
#
|
||||
# } elsif ($text =~ /^tclsh /) {
|
||||
# # translation stuff
|
||||
#
|
||||
# } elsif ($text =~ /^umask /) {
|
||||
# # handling boilerplates
|
||||
#
|
||||
# } elsif ($text =~ /\$\(\:\)/) {
|
||||
# # ignore
|
||||
#
|
||||
# } elsif ($text =~ /^FLAGS=/) {
|
||||
# # flags check for dependencies
|
||||
#
|
||||
# } elsif ($text =~ /^'\/usr\/bin\/perl' -MError -e/) {
|
||||
# # perl commands for copying files
|
||||
#
|
||||
# } elsif ($text =~ /generate-cmdlist\.sh/) {
|
||||
# # command for generating list of commands
|
||||
#
|
||||
# } elsif ($text =~ /^test / && $text =~ /|| rm -f /) {
|
||||
# # commands removing executables, if they exist
|
||||
#
|
||||
# } elsif ($text =~ /new locations or Tcl/) {
|
||||
# # command for detecting Tcl/Tk changes
|
||||
#
|
||||
# } elsif ($text =~ /mkdir -p/) {
|
||||
# # command creating path
|
||||
#
|
||||
# } elsif ($text =~ /: no custom templates yet/) {
|
||||
# # whatever
|
||||
|
||||
} else {
|
||||
# print "Unhandled (line: $line): $text\n";
|
||||
}
|
||||
}
|
||||
close(F);
|
||||
|
||||
# use Data::Dumper;
|
||||
# print "Parsed build structure:\n";
|
||||
# print Dumper(%build_structure);
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# Functions under here
|
||||
# -------------------------------------------------------------------
|
||||
my (%build_structure, @defines, @incpaths, @cflags, @sources);
|
||||
|
||||
sub clearCompileStep
|
||||
{
|
||||
@defines = ();
|
||||
@incpaths = ();
|
||||
@cflags = ();
|
||||
@sources = ();
|
||||
}
|
||||
|
||||
sub removeDuplicates
|
||||
{
|
||||
my (%dupHash, $entry);
|
||||
%dupHash = map { $_, 1 } @defines;
|
||||
@defines = keys %dupHash;
|
||||
|
||||
%dupHash = map { $_, 1 } @incpaths;
|
||||
@incpaths = keys %dupHash;
|
||||
|
||||
%dupHash = map { $_, 1 } @cflags;
|
||||
@cflags = keys %dupHash;
|
||||
|
||||
%dupHash = map { $_, 1 } @sources;
|
||||
@sources = keys %dupHash;
|
||||
}
|
||||
|
||||
sub handleCompileLine
|
||||
{
|
||||
my ($line, $lineno) = @_;
|
||||
my @parts = split(' ', $line);
|
||||
shift(@parts); # ignore cmd
|
||||
while (my $part = shift @parts) {
|
||||
if ("$part" eq "-o") {
|
||||
# ignore object file
|
||||
shift @parts;
|
||||
} elsif ("$part" eq "-c") {
|
||||
# ignore compile flag
|
||||
} elsif ("$part" eq "-c") {
|
||||
} elsif ($part =~ /^.?-I/) {
|
||||
push(@incpaths, $part);
|
||||
} elsif ($part =~ /^.?-D/) {
|
||||
push(@defines, $part);
|
||||
} elsif ($part =~ /^-/) {
|
||||
push(@cflags, $part);
|
||||
} elsif ($part =~ /\.(c|cc|cpp)$/) {
|
||||
push(@sources, $part);
|
||||
} else {
|
||||
die "Unhandled compiler option @ line $lineno: $part";
|
||||
}
|
||||
}
|
||||
#print "Sources: @sources\nCFlags: @cflags\nDefine: @defines\nIncpat: @incpaths\n";
|
||||
#exit(1);
|
||||
}
|
||||
|
||||
sub handleLibLine
|
||||
{
|
||||
my ($line, $lineno) = @_;
|
||||
my (@objfiles, @lflags, $libout, $part);
|
||||
# kill cmd and rm 'prefix'
|
||||
$line =~ s/^rm -f .* && .* rcs //;
|
||||
my @parts = split(' ', $line);
|
||||
while ($part = shift @parts) {
|
||||
if ($part =~ /^-/) {
|
||||
push(@lflags, $part);
|
||||
} elsif ($part =~ /\.(o|obj)$/) {
|
||||
push(@objfiles, $part);
|
||||
} elsif ($part =~ /\.(a|lib)$/) {
|
||||
$libout = $part;
|
||||
} else {
|
||||
die "Unhandled lib option @ line $lineno: $part";
|
||||
}
|
||||
}
|
||||
#print "LibOut: '$libout'\nLFlags: @lflags\nOfiles: @objfiles\n";
|
||||
#exit(1);
|
||||
removeDuplicates();
|
||||
push(@{$build_structure{"LIBS"}}, $libout);
|
||||
@{$build_structure{"LIBS_${libout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_SOURCES",
|
||||
"_OBJECTS");
|
||||
@{$build_structure{"LIBS_${libout}_DEFINES"}} = @defines;
|
||||
@{$build_structure{"LIBS_${libout}_INCLUDES"}} = @incpaths;
|
||||
@{$build_structure{"LIBS_${libout}_CFLAGS"}} = @cflags;
|
||||
@{$build_structure{"LIBS_${libout}_SOURCES"}} = @sources;
|
||||
@{$build_structure{"LIBS_${libout}_OBJECTS"}} = @objfiles;
|
||||
clearCompileStep();
|
||||
}
|
||||
|
||||
sub handleLinkLine
|
||||
{
|
||||
my ($line, $lineno) = @_;
|
||||
my (@objfiles, @lflags, @libs, $appout, $part);
|
||||
my @parts = split(' ', $line);
|
||||
shift(@parts); # ignore cmd
|
||||
while ($part = shift @parts) {
|
||||
if ($part =~ /^-[GRIDO]/) {
|
||||
# eat compiler flags
|
||||
} elsif ("$part" eq "-o") {
|
||||
$appout = shift @parts;
|
||||
} elsif ($part =~ /^-/) {
|
||||
push(@lflags, $part);
|
||||
} elsif ($part =~ /\.(a|lib)$/) {
|
||||
push(@libs, $part);
|
||||
} elsif ($part =~ /\.(o|obj)$/) {
|
||||
push(@objfiles, $part);
|
||||
} else {
|
||||
die "Unhandled lib option @ line $lineno: $part";
|
||||
}
|
||||
}
|
||||
#print "AppOut: '$appout'\nLFlags: @lflags\nLibs : @libs\nOfiles: @objfiles\n";
|
||||
#exit(1);
|
||||
removeDuplicates();
|
||||
push(@{$build_structure{"APPS"}}, $appout);
|
||||
@{$build_structure{"APPS_${appout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_LFLAGS",
|
||||
"_SOURCES", "_OBJECTS", "_LIBS");
|
||||
@{$build_structure{"APPS_${appout}_DEFINES"}} = @defines;
|
||||
@{$build_structure{"APPS_${appout}_INCLUDES"}} = @incpaths;
|
||||
@{$build_structure{"APPS_${appout}_CFLAGS"}} = @cflags;
|
||||
@{$build_structure{"APPS_${appout}_LFLAGS"}} = @lflags;
|
||||
@{$build_structure{"APPS_${appout}_SOURCES"}} = @sources;
|
||||
@{$build_structure{"APPS_${appout}_OBJECTS"}} = @objfiles;
|
||||
@{$build_structure{"APPS_${appout}_LIBS"}} = @libs;
|
||||
clearCompileStep();
|
||||
}
|
Loading…
Reference in New Issue