158 lines
4.4 KiB
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...)
|
|
}
|