Michael Bradley, Jr ce7e6b8d51 chore: refactor Linux and macOS build/packaging steps
Replaces PR #105.

Implement a `pkg-macos` target that ultimately results in `Status.dmg` being
written to `pkg/`. Due to [limitations][limits] of the OpenSSL `.dylib`s in
`/usr/lib/` on macOS, `libssl.a` and `libcrypto.a` are statically linked into
`bin/nim_status_client` from a [Homebrew][brew] "bottle" that is compatible
with macOS 10.13 (the oldest macOS version compatible with Qt v5.14).

`pkg-macos` creates an `.app` bundle layout in `tmp/macos/dist` based partly on
information in a very helpful [StackOverflow answer][so-answer]. Note the part
of the answer (toward the end) that explains a problem with the working
directory and how to fix it. That's the reason for the `nim_status_client.sh`
script introduced in this commit (it gets copied into the bundle). It's also
the reason for having `Info.plist` copied into the bundle before `macdeployqt`
is run (see below) and then overwriting it with `Info.runner.plist` before
creating the `.dmg` file. The app icons file `status-icon.icns` was taken from
`deployment/macos/` in the [status-react][sr] repo.

The [`macdeployqt`][macdeployqt] tool is used to copy the needed portions of Qt
into the bundle; it automatically updates `rpath`, etc. so the
`nim_status_client` executable in the bundle can locate the libs within the
bundle.

`macdeployqt` is run twice, for the "outer" and "inner" `.app` bundles,
because of an apparent bug in `macdeployqt` that results in QtWebEngine related
resources not being processed correctly on the first pass. This results in some
bloat in the final bundle but it seems unavoidable at present.

The [create-dmg][cdmg] tool is used to package the bundle into a `.dmg`
file. There are two reasons for this:
1. It produces a nice looking icon for the `.dmg` that overlays the Status logo
on an external disk icon.
2. `Info.plist` needs to be overwritten after running `macdeployqt` (see
explanation above) but before creating the `.dmg` file. If we passed the `-dmg`
cli option to `macdeployqt` to have it generate the `.dmg` file then it
wouldn't be possible to overwrite `Info.plist`.

So there is a cosmetic reason and a practical reason for using another
tool. Probably the biggest downside is that `create-dmg` is implemented in
Node.js so it needs to be installed with `npm`; that's the reason this commit
introduces `package.json`, etc. Note that zero code from `node_modules` ends up
in the `.app` bundle or the `.dmg` file.

Code signing of the macOS `.app` bundle and `.dmg` is attempted if the
environment variable `MACOS_CODESIGN_IDENT` is defined. In that case, the
environment variable `MACOS_KEYCHAIN_OPT` may optionally be defined with the
path to a preferred keychain database file.

Refactor a number of sections in the Makefile for consistency's sake, e.g. the
`appimage` target becomes `pkg-linux` and ultimately results in
`NimStatusClient-x86_64.AppImage` being written to `pkg/`.

Make a number of changes to bring the Linux packaging steps up-to-date and use
the `-qmlimport` cli option of `linuxdeployqt` to simplify resolution of Qt
plugins.

Note that `make pkg` will correctly resolve to `make pkg-linux` or `make
pkg-macos` depending on the OS in use.

Consistently use lower-case "c" in the name of *components* directories and
imports.

[limits]: https://developer.apple.com/forums/thread/124782
[brew]: https://brew.sh/
[so-answer]: https://stackoverflow.com/a/3251285
[sr]: https://github.com/status-im/status-react/tree/develop/deployment/macos
[macdeployqt]: https://doc.qt.io/qt-5/macos-deployment.html
[cdmg]: https://github.com/sindresorhus/create-dmg
2020-06-22 10:53:57 -05:00

253 lines
5.4 KiB
QML

import QtQuick 2.13
import "../../../../imports"
import "../../../../shared"
import "./"
ModalPopup {
id: popup
title: qsTr("Transaction Details")
Item {
id: confirmations
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
anchors.top: parent.top
anchors.topMargin: Theme.smallPadding
anchors.right: parent.right
anchors.rightMargin: Theme.smallPadding
height: children[0].height + children[1].height + Theme.smallPadding
StyledText {
id: confirmationsCount
text: qsTr("9999 Confirmations")
font.pixelSize: 14
}
StyledText {
id: confirmationsInfo
text: qsTr("When the transaction has 12 confirmations you can consider it settled.")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
anchors.top: confirmationsCount.bottom
anchors.topMargin: Theme.smallPadding
}
}
Separator {
id: separator
anchors.top: confirmations.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: -Theme.padding
anchors.right: parent.right
anchors.rightMargin: -Theme.padding
}
Item {
id: block
anchors.top: separator.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelBlock
text: qsTr("Block")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueBlock
text: blockNumber
font.pixelSize: 14
anchors.left: labelBlock.right
anchors.leftMargin: Theme.padding
}
}
Item {
id: hash
anchors.top: block.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelHash
text: qsTr("Hash")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueHash
text: blockHash
width: 160
elide: Text.ElideMiddle
font.pixelSize: 14
anchors.left: labelHash.right
anchors.leftMargin: Theme.padding
}
}
Item {
id: from
anchors.top: hash.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelFrom
text: qsTr("From")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueFrom
text: fromAddress
width: 160
elide: Text.ElideMiddle
font.pixelSize: 14
anchors.left: labelFrom.right
anchors.leftMargin: Theme.padding
}
}
Item {
id: toItem
anchors.top: from.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelTo
text: qsTr("To")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueTo
text: to
width: 160
elide: Text.ElideMiddle
font.pixelSize: 14
anchors.left: labelTo.right
anchors.leftMargin: Theme.padding
}
}
Item {
id: gasLimitItem
anchors.top: toItem.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelGasLimit
text: qsTr("Gas limit")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueGasLimit
text: gasLimit
font.pixelSize: 14
anchors.left: labelGasLimit.right
anchors.leftMargin: Theme.padding
}
}
Item {
id: gasPriceItem
anchors.top: gasLimitItem.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelGasPrice
text: qsTr("Gas price")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueGasPrice
text: gasPrice
font.pixelSize: 14
anchors.left: labelGasPrice.right
anchors.leftMargin: Theme.padding
}
}
Item {
id: gasUsedItem
anchors.top: gasPriceItem.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelGasUsed
text: qsTr("Gas used")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueGasUsed
text: gasUsed
font.pixelSize: 14
anchors.left: labelGasUsed.right
anchors.leftMargin: Theme.padding
}
}
Item {
id: nonceItem
anchors.top: gasUsedItem.bottom
anchors.topMargin: Theme.padding
anchors.left: parent.left
anchors.leftMargin: Theme.smallPadding
height: children[0].height
StyledText {
id: labelNonce
text: qsTr("Nonce")
font.pixelSize: 14
font.weight: Font.Medium
color: Theme.darkGrey
}
StyledText {
id: valueNonce
text: nonce
font.pixelSize: 14
anchors.left: labelNonce.right
anchors.leftMargin: Theme.padding
}
}
}