# --------------------------------------------------------------------- # 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) 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) endif ifeq ($(RELEASE_TYPE),snapshot) CURRENT_COMMIT_HASH = $(shell git log -1 --format="%h") APPLICATION_VERSION = $(PACKAGE_JSON_VERSION)+$(CURRENT_COMMIT_HASH) 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 -p),x86_64) HOST_ARCH = x64 endif ifneq ($(filter %86,$(shell uname -p)),) HOST_ARCH = x86 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 # --------------------------------------------------------------------- # Extra variables # --------------------------------------------------------------------- ifeq ($(TARGET_ARCH),x86) TARGET_ARCH_DEBIAN = i386 endif ifeq ($(TARGET_ARCH),x64) TARGET_ARCH_DEBIAN = amd64 endif ifeq ($(RELEASE_TYPE),production) PRODUCT_NAME = etcher endif ifeq ($(RELEASE_TYPE),snapshot) PRODUCT_NAME = etcher-snapshots endif 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_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)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies/bower_components: bower.json \ | $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies ./scripts/build/dependencies-bower.sh -p -x $| $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app: \ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies/node_modules \ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(TARGET_ARCH)-dependencies/bower_components \ | $(BUILD_DIRECTORY) ./scripts/build/electron-create-resources-app.sh -s . -o $@ \ -v $(APPLICATION_VERSION) \ -f "$(APPLICATION_FILES)" $(foreach prerequisite,$^,$(call execute-command,cp -rf $(prerequisite) $@)) $(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)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH): \ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app.asar \ $(BUILD_DIRECTORY)/electron-$(ELECTRON_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH).zip \ | $(BUILD_DIRECTORY) ifeq ($(TARGET_PLATFORM),darwin) ./scripts/build/electron-configure-package-darwin.sh -p $(word 2,$^) -a $< \ -n "$(APPLICATION_NAME)" \ -v "$(APPLICATION_VERSION)" \ -b "$(APPLICATION_BUNDLE_ID)" \ -c "$(APPLICATION_COPYRIGHT)" \ -t "$(APPLICATION_CATEGORY)" \ -i assets/icon.icns \ -o $@ endif ifeq ($(TARGET_PLATFORM),linux) ./scripts/build/electron-configure-package-linux.sh -p $(word 2,$^) -a $< \ -n "$(APPLICATION_NAME)" \ -v "$(APPLICATION_VERSION)" \ -l LICENSE \ -o $@ endif ifeq ($(TARGET_PLATFORM),win32) ./scripts/build/electron-configure-package-win32.sh -p $(word 2,$^) -a $< \ -n "$(APPLICATION_NAME)" \ -d "$(APPLICATION_DESCRIPTION)" \ -v "$(APPLICATION_VERSION)" \ -l LICENSE \ -c "$(APPLICATION_COPYRIGHT)" \ -m "$(COMPANY_NAME)" \ -i assets/icon.ico \ -w $(TEMPORARY_DIRECTORY) \ -o $@ ifdef CODE_SIGN_CERTIFICATE ifdef CODE_SIGN_CERTIFICATE_PASSWORD ./scripts/build/electron-sign-exe.sh -f $@/$(APPLICATION_NAME).exe \ -d "$(APPLICATION_NAME) - $(APPLICATION_VERSION)" -c $(CODE_SIGN_CERTIFICATE) \ -p $(CODE_SIGN_CERTIFICATE_PASSWORD) endif endif endif $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-$(TARGET_PLATFORM)-$(TARGET_ARCH)-rw.dmg: \ $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-darwin-$(TARGET_ARCH) \ | $(BUILD_DIRECTORY) ./scripts/build/electron-create-readwrite-dmg-darwin.sh -p $< -o $@ \ -n "$(APPLICATION_NAME)" \ -i assets/icon.icns \ -b assets/osx/installer.png $(BUILD_OUTPUT_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-darwin-$(TARGET_ARCH).zip: \ $(BUILD_DIRECTORY)/$(APPLICATION_NAME)-$(APPLICATION_VERSION)-darwin-$(TARGET_ARCH) \ | $(BUILD_OUTPUT_DIRECTORY) ifdef CODE_SIGN_IDENTITY ./scripts/build/electron-sign-app-darwin.sh -a $