Skip to content

Commit a1fc1fa

Browse files
matt-aucklandalex v
authored andcommitted
OSX Build instruction updates (#406)
* Moved build isntruction improvements over from other branch * A few more readme tweaks * Update README.md * Update README.md * Update README.md * Removed NavTech instructions
1 parent aacbb3d commit a1fc1fa

File tree

4 files changed

+269
-93
lines changed

4 files changed

+269
-93
lines changed

README.md

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,29 @@
11
![NavCoin](./img/logo-extended.png)
22

3-
This is the working repository for NAV Coin 4.5.1, our fork of bitcoin-core 0.13.
3+
This is the working repository for NavCoin 4.5.1, our fork of bitcoin-core 0.13.
44

55
For more information please visit the website:
66

7-
https://navcoin.org/en/roadmap
7+
https://navcoin.org/en/roadmap
88

99
[![Build Status](https://travis-ci.org/NAVCoin/navcoin-core.svg?branch=master)](https://travis-ci.org/NAVCoin/navcoin-core)
1010

11+
## Building
12+
13+
For building the dependencies see [README.md](depends/README.md) in the [depends](depends) folder
14+
15+
For building the wallet see the markdown files in [doc](doc) folder
16+
1117
## Coin Specifications
1218

1319
| Specification | Value |
1420
|:-----------|:-----------|
1521
| Block Spacing | `30 seconds` |
1622
| Stake Minimum Age | `2 hours` |
17-
| Stake Reward | `2 NAV per block` |
23+
| Stake Reward | `2 NAV per block` |
1824
| Port | `44440` |
1925
| RPC Port | `44444` |
2026

21-
## Navtech Settings
22-
23-
| Specification | Value |
24-
|:-----------|:-----------|
25-
| addanonserver | `95.183.52.55:3000` |
26-
| addanonserver | `95.183.53.184:3000` |
27-
| addanonserver | `95.183.52.28:3000` |
28-
| addanonserver | `95.183.52.29:3000` |
29-
3027
## Social Channels
3128

3229
| Site | link |
@@ -43,10 +40,10 @@ https://navcoin.org/en/roadmap
4340

4441
## Community Resources
4542

46-
| Site | link |
47-
|:-----------|:-----------|
43+
| Site | link |
44+
| :----------- | :---------------------------------------------------------------------------------------------------------------------- |
4845
| Trello Board | [https://trello.com/nav-community](https://trello.com/invite/b/rPdvVVL4/ba5c40a885fd3c02cda2a8b406ff7124/nav-community) |
49-
| Nav Community | http://navcommunity.net |
46+
| NavHub | http://navhub.org |
5047

5148

5249

depends/README.md

Lines changed: 52 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,79 @@
1-
### Usage
1+
## Usage
22

3-
To build dependencies for the current arch+OS:
3+
### Step 1.
44

5-
make
5+
**(These commands should be run in the `depends` folder)**
66

7-
To build for another arch/OS:
7+
To build dependencies for the current arch+OS run this:
8+
9+
```bash
10+
make
11+
```
812

9-
make HOST=host-platform-triplet
13+
If you want to build for another arch/OS you need to run this command:
14+
```bash
15+
make HOST=[host-platform-triplet]
16+
```
1017

1118
For example:
1219

13-
make HOST=x86_64-w64-mingw32 -j4
20+
```bash
21+
make HOST=x86_64-w64-mingw32 -j4
22+
```
1423

15-
A prefix will be generated that's suitable for plugging into Bitcoin's
16-
configure. In the above example, a dir named x86_64-w64-mingw32 will be
17-
created. To use it for Bitcoin:
24+
### Step 2.
1825

19-
./configure --prefix=`pwd`/depends/x86_64-w64-mingw32
26+
- A folder will be generated inside the `depends` folder by whichever command you ran.
27+
- This folder's path needs to be plugged into the `configure` command.
28+
- Using the above example, `make HOST=x86_64-w64-mingw32 -j4
29+
`, a dir named `x86_64-w64-mingw32` is generated. We would plug it into the `depends` command like this:
30+
31+
```bash
32+
# This command is run in the project's root folder, not in /depends or in /src
33+
./configure --prefix=`pwd`/depends/x86_64-w64-mingw32 #this is in the root dir for the project, not in /depends
34+
```
2035

2136
Common `host-platform-triplets` for cross compilation are:
2237

23-
- `i686-w64-mingw32` for Win32
24-
- `x86_64-w64-mingw32` for Win64
25-
- `x86_64-apple-darwin11` for MacOSX
26-
- `arm-linux-gnueabihf` for Linux ARM 32 bit
27-
- `aarch64-linux-gnu` for Linux ARM 64 bit
38+
**These may differ depending on which version your operating system is on, for example the OSX folder generated will change depending on the exact OSX version**
39+
40+
| Operating System | Prefix |
41+
| ---------------- | --------------------------- |
42+
| Windows 32bit | `i686-w64-mingw32` |
43+
| Windows 64bit | `x86_64-w64-mingw32` |
44+
| Mac OSX | `x86_64-apple-darwin17.6.0` |
45+
| Linux ARM 32bit | `arm-linux-gnueabihf` |
46+
| Linux ARM 64bit | `aarch64-linux-gnu` |
47+
2848

2949
No other options are needed, the paths are automatically configured.
3050

31-
Dependency Options:
51+
### Dependency Options:
52+
3253
The following can be set when running make: make FOO=bar
3354

34-
SOURCES_PATH: downloaded sources will be placed here
35-
BASE_CACHE: built packages will be placed here
36-
SDK_PATH: Path where sdk's can be found (used by OSX)
37-
FALLBACK_DOWNLOAD_PATH: If a source file can't be fetched, try here before giving up
38-
NO_QT: Don't download/build/cache qt and its dependencies
39-
NO_WALLET: Don't download/build/cache libs needed to enable the wallet
40-
NO_UPNP: Don't download/build/cache packages needed for enabling upnp
41-
DEBUG: disable some optimizations and enable more runtime checking
42-
HOST_ID_SALT: Optional salt to use when generating host package ids
43-
BUILD_ID_SALT: Optional salt to use when generating build package ids
55+
`SOURCES_PATH`: downloaded sources will be placed here
56+
`BASE_CACHE`: built packages will be placed here
57+
`SDK_PATH`: Path where sdk's can be found (used by OSX)
58+
`FALLBACK_DOWNLOAD_PATH`: If a source file can't be fetched, try here before giving up
59+
`NO_QT`: Don't download/build/cache qt and its dependencies
60+
`NO_WALLET`: Don't download/build/cache libs needed to enable the wallet
61+
`NO_UPNP`: Don't download/build/cache packages needed for enabling upnp
62+
`DEBUG`: disable some optimizations and enable more runtime checking
63+
`HOST_ID_SALT`: Optional salt to use when generating host package ids
64+
`BUILD_ID_SALT`: Optional salt to use when generating build package ids
4465

4566
If some packages are not built, for example `make NO_WALLET=1`, the appropriate
4667
options will be passed to bitcoin's configure. In this case, `--disable-wallet`.
4768

48-
Additional targets:
69+
### Additional targets:
4970

50-
download: run 'make download' to fetch all sources without building them
51-
download-osx: run 'make download-osx' to fetch all sources needed for osx builds
52-
download-win: run 'make download-win' to fetch all sources needed for win builds
53-
download-linux: run 'make download-linux' to fetch all sources needed for linux builds
71+
`download`: run 'make download' to fetch all sources without building them
72+
`download-osx`: run 'make download-osx' to fetch all sources needed for osx builds
73+
`download-win`: run 'make download-win' to fetch all sources needed for win builds
74+
`download-linux`: run 'make download-linux' to fetch all sources needed for linux builds
5475

5576
### Other documentation
5677

5778
- [description.md](description.md): General description of the depends system
5879
- [packages.md](packages.md): Steps for adding packages
59-

doc/Creating_an_OSX_DMG.md

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
Deterministic / Gitian building Mac OSX
2+
=======================================
3+
4+
Working OS X DMGs are created in Linux by combining a recent clang,
5+
the Apple binutils (ld, ar, etc) and DMG authoring tools.
6+
7+
Apple uses clang extensively for development and has upstreamed the necessary
8+
functionality so that a vanilla clang can take advantage. It supports the use
9+
of -F, -target, -mmacosx-version-min, and --sysroot, which are all necessary
10+
when building for OS X.
11+
12+
Apple's version of binutils (called cctools) contains lots of functionality
13+
missing in the FSF's binutils. In addition to extra linker options for
14+
frameworks and sysroots, several other tools are needed as well such as
15+
install_name_tool, lipo, and nmedit. These do not build under linux, so they
16+
have been patched to do so. The work here was used as a starting point:
17+
[mingwandroid/toolchain4](https://github.com/mingwandroid/toolchain4).
18+
19+
In order to build a working toolchain, the following source packages are needed
20+
from Apple: cctools, dyld, and ld64.
21+
22+
These tools inject timestamps by default, which produce non-deterministic
23+
binaries. The ZERO_AR_DATE environment variable is used to disable that.
24+
25+
This version of cctools has been patched to use the current version of clang's
26+
headers and and its libLTO.so rather than those from llvmgcc, as it was
27+
originally done in toolchain4.
28+
29+
To complicate things further, all builds must target an Apple SDK. These SDKs
30+
are free to download, but not redistributable.
31+
To obtain it, register for a developer account, then download the [Xcode 7.3.1 dmg](https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg).
32+
33+
This file is several gigabytes in size, but only a single directory inside is
34+
needed:
35+
36+
```bash
37+
Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
38+
```
39+
40+
## How To:
41+
42+
On the host machine, register for a free Apple [developer account](https://developer.apple.com/register/), then download the SDK [here](https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg).
43+
44+
### MacOS host
45+
46+
Using Mac OS X, you can mount the dmg, and then extract the SDK with:
47+
48+
```bash
49+
hdiutil attach Xcode_7.3.1.dmg
50+
tar -C /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ -czf MacOSX10.11.sdk.tar.gz MacOSX10.11.sdk
51+
```
52+
53+
Clean up the files you don't need:
54+
55+
```bash
56+
diskutil unmount /Volumes/Xcode
57+
rm MacOSX10.11.sdk.tar.gz Xcode_7.3.1.dmg
58+
```
59+
60+
### Non-MacOS host:
61+
--------
62+
63+
Alternatively, you can use 7zip and SleuthKit to extract the files one by one.
64+
The script [extract-osx-sdk.sh](..//contrib/macdeploy/extract-osx-sdk.sh) automates this. First ensure
65+
the dmg file is in the current directory, and then run the script.
66+
67+
You may wish to delete the intermediate 5.hfs file and MacOSX10.11.sdk (the directory) when
68+
you've confirmed the extraction succeeded.
69+
70+
```bash
71+
apt-get install p7zip-full sleuthkit
72+
contrib/macdeploy/extract-osx-sdk.sh
73+
rm -rf 5.hfs MacOSX10.11.sdk
74+
```
75+
76+
77+
### Alternatively - Download it:
78+
79+
Alternatively you can download the SDK from `phracker` github, and create a tar.gz file
80+
using the following commands:
81+
82+
```bash
83+
wget https://github.com/phracker/MacOSX-SDKs/releases/download/MacOSX10.11.sdk/MacOSX10.11.sdk.tar.xz
84+
tar xvf MacOSX10.11.sdk.tar.xz
85+
tar -czf MacOSX10.11.sdk.tar.gz MacOSX10.11.sdk
86+
```
87+
88+
89+
90+
## (Gitian builder only) Copy SDK to Gitian VM :
91+
92+
Copy it to the Gitian VM, e.g.:
93+
94+
```bash
95+
scp MacOSX10.11.sdk.tar.gz gitian:
96+
```
97+
98+
Login to the VM and:
99+
100+
```bash
101+
mkdir gitian-builder/inputs
102+
mv MacOSX10.11.sdk.tar.gz gitian-builder/inputs
103+
```
104+
105+
106+
## Info
107+
The Gitian descriptors build 2 sets of files: Linux tools, then Apple binaries
108+
which are created using these tools. The build process has been designed to
109+
avoid including the SDK's files in Gitian's outputs. All interim tarballs are
110+
fully deterministic and may be freely redistributed.
111+
112+
genisoimage is used to create the initial DMG. It is not deterministic as-is,
113+
so it has been patched. A system genisoimage will work fine, but it will not
114+
be deterministic because the file-order will change between invocations.
115+
The patch can be seen here: [theuni/osx-cross-depends](https://raw.githubusercontent.com/theuni/osx-cross-depends/master/patches/cdrtools/genisoimage.diff).
116+
No effort was made to fix this cleanly, so it likely leaks memory badly. But
117+
it's only used for a single invocation, so that's no real concern.
118+
119+
genisoimage cannot compress DMGs, so afterwards, the 'dmg' tool from the
120+
libdmg-hfsplus project is used to compress it. There are several bugs in this
121+
tool and its maintainer has seemingly abandoned the project. It has been forked
122+
and is available (with fixes) here: [theuni/libdmg-hfsplus](https://github.com/theuni/libdmg-hfsplus).
123+
124+
The 'dmg' tool has the ability to create DMGs from scratch as well, but this
125+
functionality is broken. Only the compression feature is currently used.
126+
Ideally, the creation could be fixed and genisoimage would no longer be necessary.
127+
128+
Background images and other features can be added to DMG files by inserting a
129+
.DS_Store before creation. This is generated by the script
130+
contrib/macdeploy/custom_dsstore.py.
131+
132+
As of OS X Mavericks (10.9), using an Apple-blessed key to sign binaries is a
133+
requirement in order to satisfy the new Gatekeeper requirements. Because this
134+
private key cannot be shared, we'll have to be a bit creative in order for the
135+
build process to remain somewhat deterministic. Here's how it works:
136+
137+
- Builders use Gitian to create an unsigned release. This outputs an unsigned
138+
dmg which users may choose to bless and run. It also outputs an unsigned app
139+
structure in the form of a tarball, which also contains all of the tools
140+
that have been previously (deterministically) built in order to create a
141+
final dmg.
142+
- The Apple keyholder uses this unsigned app to create a detached signature,
143+
using the script that is also included there. Detached signatures are available from this [repository](https://github.com/navcoin-core/navcoin-detached-sigs).
144+
- Builders feed the unsigned app + detached signature back into Gitian. It
145+
uses the pre-built tools to recombine the pieces into a deterministic dmg.

0 commit comments

Comments
 (0)