Skip to content

Allow custom DLL names #17

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 17, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
Native Binaries NuGet Package for LibGit2Sharp
==============================================

[Libgit2Sharp](https://github.com/libgit2/libgit2sharp) is a managed
wrapper around [libgit2](https://github.com/libgit2/libgit2), and as
such requires compilation of libgit2 for your platform. LibGit2Sharp
makes this easy by distributing NuGet packages that include precompiled
versions of these native binaries.

If you need to build your own native binaries for some reason, you can
do so easily with the scripts in this repository:

1. Clone the `LibGit2Sharp.NativeBinaries` repository. Do so recursively
to ensure that the `libgit2` submodule is initialized automatically:

`git clone --recursive https://github.com/libgit2/libgit2sharp.nativebinaries`

(If you have already cloned this repository (which seems quite
likely since you are reading this file!) then you can simply run
`git submodule init` followed by `git submodule update`.)

2. Update the included libgit2 sources and configuration files to the
version of libgit2 you want to build. For example, to build
commit `1a2b3c4`:

`UpdateLibgit2ToSha.ps1 1a2b3c4`

Or you can specify references. To build the remote's `master` branch:

`UpdateLibgit2ToSha.ps1 master`

3. Build the libgit2 binaries. For Windows, this requires a Visual Studio
installation, and will compile both x86 and amd64 variants. (See
"Notes on Visual Studio", below). Run the build PowerShell script,
specifying the version number of Visual Studio as the first argument.
For example, to build with Visual Studio 2013 (aka "Visual Studio 12.0"):

`build.libgit2.ps1 12`

For Linux, this will build only the architecture that you're running
(x86 or amd64). For Mac OS X, this will build a fat library that
includes both x86 and amd64. Run the shell script:

`build.libgit2.sh`

4. Create the NuGet package from the built binaries. You will need to
specify the version number of the resultant NuGet package that you
want to generate. Note that you may wish to provide a suffix to
disambiguate your custom package from the official, published NuGet
packages. For example, if you are building a product called
`fooproduct` then that may be a helpful suffix.

To build a NuGet package at version `1.2.3-foo`:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-foo will still be seen as a pre-release package in the eyes of NuGet. However, I cannot see a better approach.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I can't either. Would you like me to make a note of that in this file for clarification?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would you like me to make a note of that in this file for clarification?

That'd be great

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added some notes in the paragraph below.


`buildpackage.ps1 1.2.3-foo`

And the result will be a NuGet package in the current directory:

`LibGit2Sharp.NativeBinaries.1.2.3-foo.nupkg`

Note that the `-foo` suffix technically makes this a "prerelease"
package, according to NuGet, which may be further help in avoiding
any mixups with the official packages, but may also require you to
opt-in to prerelease packages in your NuGet package manager.

Specifying custom DLL names
---------------------------
If you want to redistribute a LibGit2Sharp that uses a custom libgit2,
you may want to change the name of the libgit2 shared library file to
disambiguate it from other installations. This may be useful if you
are running as a plugin inside a larger process and wish to avoid
conflicting with other plugins who may wish to use LibGit2Sharp and
want to ensure that *your* version of libgit2 is loaded into memory
and available to you.

For example, if your plugin names if `fooplugin`, you may wish to
distribute a DLL named `git2-fooplugin.dll`. You can specify the
custom DLL name as the second argument to the update and build scripts:

UpdateLibgit2ToSha.ps1 1a2b3c4 git2-fooplugin
build.libgit2.sh 14 git2-fooplugin

Then build the NuGet package as described above, making sure to provide
a helpful suffix to ensure that your NuGet package will not be confused
with the official packages.

Notes on Visual Studio
----------------------
Visual Studio is required to build the native binaries, however you
do not need to install a *paid* version of Visual Studio. libgit2
can be compiled using [Visual Studio Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs),
which is free for building open source applications.

You need to specify the actual version number (not the marketing name)
of Visual Studio. (For example, "Visual Studio 2013" is the name of the
product, but its actual version number is "12.0".) A handy guide:

| Marketing Name | Version Number
|--------------------|---------------
| Visual Studio 2010 | 10
| Visual Studio 2012 | 11
| Visual Studio 2013 | 12
| Visual Studio 2015 | 14

13 changes: 10 additions & 3 deletions UpdateLibgit2ToSha.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
#>

Param(
[string]$sha = 'HEAD'
[string]$sha = 'HEAD',
[string]$libgit2Name = ''
)

Set-StrictMode -Version Latest
Expand Down Expand Up @@ -81,15 +82,21 @@ Push-Location $libgit2Directory

Pop-Location

if (![string]::IsNullOrEmpty($libgit2Name)) {
$binaryFilename = $libgit2Name
} else {
$binaryFilename = "git2-" + $sha.Substring(0,7)
}

sc -Encoding ASCII (Join-Path $projectDirectory "nuget.package\libgit2\libgit2_hash.txt") $sha

$binaryFilename = "git2-" + $sha.Substring(0,7)
sc -Encoding ASCII (Join-Path $projectDirectory "nuget.package\libgit2\libgit2_filename.txt") $binaryFilename

$buildProperties = @"
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<EmbeddedResource Include="`$(MSBuildThisFileDirectory)\..\libgit2\libgit2_hash.txt" />
<EmbeddedResource Include="`$(MSBuildThisFileDirectory)\..\libgit2\libgit2_filename.txt" />
</ItemGroup>
<ItemGroup>
<None Condition="Exists('`$(MSBuildThisFileDirectory)\..\libgit2\windows\amd64\$binaryFilename.dll')" Include="`$(MSBuildThisFileDirectory)\..\libgit2\windows\amd64\$binaryFilename.dll">
Expand Down
8 changes: 7 additions & 1 deletion build.libgit2.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

Param(
[string]$vs = '10',
[string]$libgit2Name = '',
[switch]$test,
[switch]$debug
)
Expand All @@ -23,7 +24,12 @@ $x86Directory = Join-Path $projectDirectory "nuget.package\libgit2\windows\x86"
$x64Directory = Join-Path $projectDirectory "nuget.package\libgit2\windows\amd64"
$hashFile = Join-Path $projectDirectory "nuget.package\libgit2\libgit2_hash.txt"
$sha = Get-Content $hashFile
$binaryFilename = "git2-" + $sha.Substring(0,7)

if (![string]::IsNullOrEmpty($libgit2Name)) {
$binaryFilename = $libgit2Name
} else {
$binaryFilename = "git2-" + $sha.Substring(0,7)
}

$build_clar = 'OFF'
if ($test.IsPresent) { $build_clar = 'ON' }
Expand Down
2 changes: 1 addition & 1 deletion buildpackage.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ if ( -Not (Test-Path $linuxDirectory\*.so) )
Set-Content $linuxDirectory\addbinaries.here $null
}

Nuget.exe Pack nuget.package\NativeBinaries.nuspec -Version $version$versionSuffix -NoPackageAnalysis
.\Nuget.exe Pack nuget.package\NativeBinaries.nuspec -Version $version$versionSuffix -NoPackageAnalysis
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Disclaimer: I'm not a PowerShell wizard. But doesn't the dot-slash notation notation means "here"? Would that be the case, how can we ensure that there's always a NuGet next to this file?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Drop this. I forgot that we actually embed NuGet.exe.

1 change: 1 addition & 0 deletions nuget.package/libgit2/libgit2_filename.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
git2-4d6362b