# --------------------------------------------------------------------- # Build configuration # --------------------------------------------------------------------- # This directory will be completely deleted by the `clean` rule BUILD_DIRECTORY ?= release # See http://stackoverflow.com/a/20763842/1641422 BUILD_DIRECTORY_PARENT = $(dir $(BUILD_DIRECTORY)) ifeq ($(wildcard $(BUILD_DIRECTORY_PARENT).),) $(error $(BUILD_DIRECTORY_PARENT) does not exist) endif BUILD_TEMPORARY_DIRECTORY = $(BUILD_DIRECTORY)/.tmp BUILD_OUTPUT_DIRECTORY = $(BUILD_DIRECTORY)/out # --------------------------------------------------------------------- # Application configuration # --------------------------------------------------------------------- ELECTRON_VERSION = $(shell jq -r '.devDependencies["electron-prebuilt"]' package.json) NODE_VERSION = 6.1.0 COMPANY_NAME = $(shell jq -r '.companyName' package.json) APPLICATION_NAME = $(shell jq -r '.displayName' package.json) APPLICATION_DESCRIPTION = $(shell jq -r '.description' package.json) APPLICATION_COPYRIGHT = $(shell jq -r '.copyright' package.json) APPLICATION_CATEGORY = public.app-category.developer-tools APPLICATION_BUNDLE_ID = io.resin.etcher APPLICATION_FILES = lib,assets # Add the current commit to the version if release type is "snapshot" RELEASE_TYPE ?= snapshot PACKAGE_JSON_VERSION = $(shell jq -r '.version' package.json) ifeq ($(RELEASE_TYPE),production) APPLICATION_VERSION = $(PACKAGE_JSON_VERSION) S3_BUCKET = resin-production-downloads endif ifeq ($(RELEASE_TYPE),snapshot) CURRENT_COMMIT_HASH = $(shell git log -1 --format="%h") APPLICATION_VERSION = $(PACKAGE_JSON_VERSION)+$(CURRENT_COMMIT_HASH) S3_BUCKET = resin-nightly-downloads endif ifndef APPLICATION_VERSION $(error Invalid release type: $(RELEASE_TYPE)) endif # --------------------------------------------------------------------- # Operating system and architecture detection # --------------------------------------------------------------------- # http://stackoverflow.com/a/12099167 ifeq ($(OS),Windows_NT) HOST_PLATFORM = win32 ifeq ($(PROCESSOR_ARCHITEW6432),AMD64) HOST_ARCH = x64 else ifeq ($(PROCESSOR_ARCHITECTURE),AMD64) HOST_ARCH = x64 endif ifeq ($(PROCESSOR_ARCHITECTURE),x86) HOST_ARCH = x86 endif endif else ifeq ($(shell uname -s),Linux) HOST_PLATFORM = linux ifeq ($(shell uname -m),x86_64) HOST_ARCH = x64 endif ifneq ($(filter %86,$(shell uname -m)),) HOST_ARCH = x86 endif ifeq ($(shell uname -m),armv7l) HOST_ARCH = armv7l endif endif ifeq ($(shell uname -s),Darwin) HOST_PLATFORM = darwin ifeq ($(shell uname -m),x86_64) HOST_ARCH = x64 endif endif endif ifndef HOST_PLATFORM $(error We couldn't detect your host platform) endif ifndef HOST_ARCH $(error We couldn't detect your host architecture) endif TARGET_PLATFORM = $(HOST_PLATFORM) ifneq ($(TARGET_PLATFORM),$(HOST_PLATFORM)) $(error We don't support cross-platform builds yet) endif # Default to host architecture. You can override by doing: # # make TARGET_ARCH= # TARGET_ARCH ?= $(HOST_ARCH) # Support x86 builds from x64 in GNU/Linux # See https://github.com/addaleax/lzma-native/issues/27 ifeq ($(TARGET_PLATFORM),linux) ifneq ($(HOST_ARCH),$(TARGET_ARCH)) ifeq ($(TARGET_ARCH),x86) export CFLAGS += -m32 else $(error Can't build $(TARGET_ARCH) binaries on a $(HOST_ARCH) host) endif endif endif # --------------------------------------------------------------------- # Code signing # --------------------------------------------------------------------- ifeq ($(TARGET_PLATFORM),darwin) ifndef CODE_SIGN_IDENTITY $(warning No code-sign identity found (CODE_SIGN_IDENTITY is not set)) endif endif ifeq ($(TARGET_PLATFORM),win32) ifndef CODE_SIGN_CERTIFICATE $(warning No code-sign certificate found (CODE_SIGN_CERTIFICATE is not set)) ifndef CODE_SIGN_CERTIFICATE_PASSWORD $(warning No code-sign certificate password found (CODE_SIGN_CERTIFICATE_PASSWORD is not set)) endif endif endif # --------------------------------------------------------------------- # Analytics # --------------------------------------------------------------------- ifndef ANALYTICS_SENTRY_TOKEN $(warning No Sentry token found (ANALYTICS_SENTRY_TOKEN is not set)) endif ifndef ANALYTICS_MIXPANEL_TOKEN $(warning No Mixpanel token found (ANALYTICS_MIXPANEL_TOKEN is not set)) endif # --------------------------------------------------------------------- # Extra variables # --------------------------------------------------------------------- TARGET_ARCH_DEBIAN = $(shell ./scripts/build/architecture-convert.sh -r $(TARGET_ARCH) -t debian) PRODUCT_NAME = etcher APPLICATION_NAME_LOWERCASE = $(shell echo $(APPLICATION_NAME) | tr A-Z a-z) APPLICATION_VERSION_DEBIAN = $(shell echo $(APPLICATION_VERSION) | tr "-" "~") # --------------------------------------------------------------------- # Rules # --------------------------------------------------------------------- # See http://stackoverflow.com/a/12528721 # Note that the blank line before 'endef' is actually important - don't delete it define execute-command $(1) endef $(BUILD_DIRECTORY): mkdir $@ $(BUILD_TEMPORARY_DIRECTORY): | $(BUILD_DIRECTORY) mkdir $@ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies: | $(BUILD_DIRECTORY) mkdir $@ $(BUILD_DIRECTORY)/node-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies: | $(BUILD_DIRECTORY) mkdir $@ $(BUILD_OUTPUT_DIRECTORY): | $(BUILD_DIRECTORY) mkdir $@ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies/node_modules: package.json npm-shrinkwrap.json \ | $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies ./scripts/build/dependencies-npm.sh -p \ -r "$(TARGET_ARCH)" \ -v "$(ELECTRON_VERSION)" \ -x $| \ -t electron \ -s "$(TARGET_PLATFORM)" $(BUILD_DIRECTORY)/node-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies/node_modules: package.json npm-shrinkwrap.json \ | $(BUILD_DIRECTORY)/node-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies ./scripts/build/dependencies-npm.sh -p -f \ -r "$(TARGET_ARCH)" \ -v "$(NODE_VERSION)" \ -x $| \ -t node \ -s "$(TARGET_PLATFORM)" $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app: \ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies/node_modules \ | $(BUILD_DIRECTORY) $(BUILD_TEMPORARY_DIRECTORY) ./scripts/build/electron-create-resources-app.sh -s . -o $@ \ -v $(APPLICATION_VERSION) \ -f "$(APPLICATION_FILES)" cp -RLf $< $@ ifdef ANALYTICS_SENTRY_TOKEN ./scripts/build/jq-insert.sh \ -p ".analytics.sentry.token" \ -v "$(ANALYTICS_SENTRY_TOKEN)" \ -f $@/package.json \ -t $(BUILD_TEMPORARY_DIRECTORY) endif ifdef ANALYTICS_MIXPANEL_TOKEN ./scripts/build/jq-insert.sh \ -p ".analytics.mixpanel.token" \ -v "$(ANALYTICS_MIXPANEL_TOKEN)" \ -f $@/package.json \ -t $(BUILD_TEMPORARY_DIRECTORY) endif $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app.asar: \ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app \ | $(BUILD_DIRECTORY) ./scripts/build/electron-create-asar.sh -d $< -o $@ $(BUILD_DIRECTORY)/electron-$(ELECTRON_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip: \ | $(BUILD_DIRECTORY) ./scripts/build/electron-download-package.sh \ -r "$(TARGET_ARCH)" \ -v "$(ELECTRON_VERSION)" \ -s "$(TARGET_PLATFORM)" \ -o $@ $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-cli-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app: \ package.json lib \ $(BUILD_DIRECTORY)/node-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies/node_modules \ | $(BUILD_DIRECTORY) mkdir $@ $(foreach prerequisite,$^,$(call execute-command,cp -rf $(prerequisite) $@)) $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-cli-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH).js: \ $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-cli-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app \ | $(BUILD_DIRECTORY) ./scripts/build/concatenate-javascript.sh -e $