youtubebeat/vendor/github.com/elastic/beats/dev-tools/packaging/preference-pane/magefile.go

158 lines
4.4 KiB
Go

// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// +build mage
package main
import (
"fmt"
"os"
"path/filepath"
"github.com/magefile/mage/mg"
"github.com/magefile/mage/sh"
"github.com/pkg/errors"
"github.com/elastic/beats/dev-tools/mage"
)
var builder = preferencePaneBuilder{
Project: "beats-preference-pane.xcodeproj",
Configuration: mage.EnvOr("XCODE_CONFIGURATION", "Release"),
PackageName: "BeatsPrefPane.pkg",
InstallDir: "/Library/PreferencePanes",
Identifier: "co.elastic.beats.preference-pane",
Version: "1.0.0",
}
// Default specifies the default build target for mage.
var Default = All
// All build, sign, and package the Beats Preference Pane.
func All() { mg.SerialDeps(Build, Package) }
// Build builds the preference pane source using xcodebuild.
func Build() error { return builder.Build() }
// Package packages the pref pane into BeatsPrefPane.pkg.
func Package() error { return builder.Package() }
// Clean cleans the build artifacts.
func Clean() error { return sh.Rm("build") }
// --- preferencePaneBuilder
type preferencePaneBuilder struct {
Project string
Configuration string
PackageName string
InstallDir string
Identifier string
Version string
}
func (b preferencePaneBuilder) SigningInfo() *mage.AppleSigningInfo {
info, err := mage.GetAppleSigningInfo()
if err != nil {
panic(err)
}
return info
}
func (b preferencePaneBuilder) Build() error {
if mage.IsUpToDate("build/Release/Beats.prefPane/Contents/MacOS/Beats",
"helper", "beats-preference-pane", "beats-preference-pane.xcodeproj") {
fmt.Println(">> Building MacOS Preference Pane (UP-TO-DATE)")
return nil
}
fmt.Println(">> Building MacOS Preference Pane")
err := sh.Run("xcodebuild", "build",
"-project", b.Project,
"-alltargets",
"-configuration", b.Configuration,
// This disables xcodebuild from attempting to codesign.
// We do that in its own build step.
"CODE_SIGN_IDENTITY=",
"CODE_SIGNING_REQUIRED=NO")
if err != nil {
return err
}
return b.Sign()
}
func (b preferencePaneBuilder) Sign() error {
if !b.SigningInfo().Sign {
fmt.Println("Skipping signing of MacOS Preference Pane " +
"(APPLE_SIGNING_ENABLED not set to true)")
return nil
}
codesign := sh.RunCmd("codesign", "-s", b.SigningInfo().App.ID, "--timestamp")
targets := []string{
filepath.Join("build", b.Configuration, "Beats.prefPane/Contents/MacOS/helper"),
filepath.Join("build", b.Configuration, "Beats.prefPane"),
}
fmt.Println(">> Signing MacOS Preference Pane")
for _, target := range targets {
if err := codesign(target); err != nil {
return errors.Wrapf(err, "failed to codesign %v", target)
}
}
return nil
}
func (b preferencePaneBuilder) Package() error {
output := filepath.Join("build", b.PackageName)
input := filepath.Join("build", b.Configuration, "Beats.prefPane")
if mage.IsUpToDate(output, input) {
fmt.Println(">> Packaging MacOS Preference Pane (UP-TO-DATE)")
return nil
}
fmt.Println(">> Packaging MacOS Preference Pane")
const pkgroot = "build/pkgroot"
installDir := filepath.Join(pkgroot, b.InstallDir, filepath.Base(input))
if err := os.MkdirAll(installDir, 0755); err != nil {
return err
}
if err := mage.Copy(input, installDir); err != nil {
return err
}
pkgbuild := sh.RunCmd("pkgbuild")
args := []string{
"--root", pkgroot,
"--identifier", b.Identifier,
"--version", b.Version,
}
if b.SigningInfo().Sign {
args = append(args, "--sign", b.SigningInfo().Installer.ID, "--timestamp")
} else {
fmt.Println("Skipping signing of MacOS " + b.PackageName +
" (APPLE_SIGNING_ENABLED not set to true)")
}
args = append(args, output)
return pkgbuild(args...)
}