diff --git a/.nvmrc b/.nvmrc index a3597ecbd1..8b0beab16a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.11 +20.11.0 diff --git a/Makefile b/Makefile index 933a7fd459..dae7b53cec 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,12 @@ EXTENSIBLE_CLI_DIR = cliv2 BINARY_RELEASES_FOLDER_TS_CLI = binary-releases export BINARY_OUTPUT_FOLDER = binary-releases SHASUM_CMD = shasum -GOHOSTOS = $(shell go env GOHOSTOS) +export GOCMD = go +_GO_ENV_VARS := $(shell $(GOCMD) env GOOS GOARCH GOHOSTOS GOHOSTARCH) +export GOOS := $(word 1, $(_GO_ENV_VARS)) +export GOARCH := $(word 2, $(_GO_ENV_VARS)) +export GOHOSTOS := $(word 3, $(_GO_ENV_VARS)) +export GOHOSTARCH := $(word 4, $(_GO_ENV_VARS)) export PYTHON = python PYTHON_VERSION = $(shell python3 --version) @@ -34,6 +39,11 @@ help: @echo @echo 'This Makefile is currently only for building release artifacts.' @echo 'Use `npm run` for CLIv1 scripts.' + @echo + @echo 'Developer Targets:' + @echo ' build-ide-debug' + @echo ' Builds a debug binary with local dependencies.' + @echo ' Accepts optional args: GAF=true LS=true CLIENT=false DEST=/path/to/copy CLIP=false' $(BINARY_OUTPUT_FOLDER)/fips: $(BINARY_OUTPUT_FOLDER) @mkdir -p $(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)/fips @@ -237,40 +247,40 @@ pre-build: pre-build-binary-wrapper $(BINARY_RELEASES_FOLDER_TS_CLI) $(BINARY_RE .PHONY: build-fips build-fips: pre-build $(BINARY_OUTPUT_FOLDER)/fips/version - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) fips build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)/fips USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) fips build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)/fips USE_LEGACY_EXECUTABLE_NAME=1 @$(MAKE) clean-package-files .PHONY: build-experimental build-experimental: pre-build $(BINARY_OUTPUT_FOLDER)/experimental/version - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) experimental build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)/experimental USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) experimental build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)/experimental USE_LEGACY_EXECUTABLE_NAME=1 @$(MAKE) clean-package-files .PHONY: build build: pre-build - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER) USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER) USE_LEGACY_EXECUTABLE_NAME=1 @$(MAKE) clean-package-files .PHONY: build-debug build-debug: pre-build - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) debug build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER) USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) debug build-full install bindir=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER) USE_LEGACY_EXECUTABLE_NAME=1 @$(MAKE) clean-package-files .PHONY: sign sign: - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) sign BUILD_DIR=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER) USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) sign BUILD_DIR=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER) USE_LEGACY_EXECUTABLE_NAME=1 .PHONY: sign-fips sign-fips: - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) fips sign BUILD_DIR=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)/fips USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) fips sign BUILD_DIR=$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)/fips USE_LEGACY_EXECUTABLE_NAME=1 .PHONY: clean clean: - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) clean-full USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) clean-full USE_LEGACY_EXECUTABLE_NAME=1 @$(MAKE) clean-prepack .PHONY: clean-golang clean-golang: - @cd $(EXTENSIBLE_CLI_DIR); $(MAKE) clean USE_LEGACY_EXECUTABLE_NAME=1 + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) clean USE_LEGACY_EXECUTABLE_NAME=1 # targets responsible for the testing of CLI build .PHONY: acceptance-test-with-proxy @@ -305,12 +315,18 @@ release-mgt-create: @echo "-- Creating stable release" @./release-scripts/create-release.sh +.PHONY: build-ide-debug + +build-ide-debug: + $(MAKE) -C $(EXTENSIBLE_CLI_DIR) build-ide-debug IDE_BUILD=true bindir='$(WORKING_DIR)/$(BINARY_OUTPUT_FOLDER)' USE_LEGACY_EXECUTABLE_NAME=1 + .PHONY: format format: @echo "-- Formatting code" @npm run format @pushd $(EXTENSIBLE_CLI_DIR); $(MAKE) format; popd + .PHONY: ls-protocol-metadata ls-protocol-metadata: $(BINARY_RELEASES_FOLDER_TS_CLI)/version @echo "-- Generating protocol metadata" diff --git a/cliv2/Makefile b/cliv2/Makefile index 5b2a0fe4e2..d148676ca2 100644 --- a/cliv2/Makefile +++ b/cliv2/Makefile @@ -1,10 +1,4 @@ # Build system related variables -MAKE = make -GOCMD = go -GOOS = $(shell go env GOOS) -GOARCH = $(shell go env GOARCH) -GOHOSTOS = $(shell go env GOHOSTOS) -GOHOSTARCH = $(shell go env GOHOSTARCH) LS_COMMIT_HASH = $(shell cat go.mod | grep snyk-ls | cut -d "-" -f 4) FIPS_CRYPTO_BACKEND_DEFAULT = systemcrypto FIPS_CRYPTO_BACKEND = @@ -103,6 +97,7 @@ endif # some make file variables LOG_PREFIX = -- + $(BUILD_DIR): @mkdir $@ @@ -129,10 +124,6 @@ _validate_sha_v1: $(V1_DIRECTORY)/$(V1_EXECUTABLE_NAME).$(HASH_STRING) @echo "$(LOG_PREFIX) Validating checksum ( $(V1_DIRECTORY)/$(V1_EXECUTABLE_NAME).$(HASH_STRING) )" @cd $(V1_DIRECTORY) && $(SHASUM_CMD) -b -q -a $(HASH_ALGORITHM) -c $(V1_DIRECTORY)/$(V1_EXECUTABLE_NAME).$(HASH_STRING) -# separate dependency target -.PHONY: dependencies -dependencies: $(V1_DIRECTORY)/$(V1_EXECUTABLE_NAME) $(V1_DIRECTORY)/$(V1_EXECUTABLE_NAME).$(HASH_STRING) _validate_sha_v1 - .PHONY: summary summary: @echo "$(LOG_PREFIX) Build Summary" @@ -147,11 +138,25 @@ summary: echo "$(LOG_PREFIX) IAC_RULES_URL: $(IAC_RULES_URL)"; \ fi +# Optimization flag for local/IDE builds +IDE_BUILD ?= false + +# prepare the workspace and cache global parameters +# Base dependencies, common to all builds +CONFIGURE_DEPS := $(CACHE_DIR) $(CACHE_DIR)/variables.mk $(V1_DIRECTORY)/$(V1_EMBEDDED_FILE_OUTPUT) $(V1_DIRECTORY)/$(V1_EXECUTABLE_NAME) $(V1_DIRECTORY)/$(V1_EXECUTABLE_NAME).$(HASH_STRING) +BUILD_DEPS := $(BUILD_DIR) $(SRCS) + +# Add expensive dependencies only for standard (non-IDE) builds +ifneq ($(IDE_BUILD),true) +CONFIGURE_DEPS += summary $(CACHE_DIR)/prepare-3rd-party-licenses _validate_sha_v1 +BUILD_DEPS += generate-ls-protocol-metadata +endif + # prepare the workspace and cache global parameters .PHONY: configure -configure: summary $(CACHE_DIR) $(CACHE_DIR)/variables.mk $(V1_DIRECTORY)/$(V1_EMBEDDED_FILE_OUTPUT) dependencies $(CACHE_DIR)/prepare-3rd-party-licenses +configure: $(CONFIGURE_DEPS) -$(BUILD_DIR)/$(V2_EXECUTABLE_NAME): $(BUILD_DIR) $(SRCS) generate-ls-protocol-metadata +$(BUILD_DIR)/$(V2_EXECUTABLE_NAME): $(BUILD_DEPS) $(eval EXTRA_FLAGS := -X github.com/snyk/snyk-ls/application/config.Version=$(LS_COMMIT_HASH) -X github.com/snyk/snyk-ls/application/config.LsProtocolVersion=$(LS_PROTOCOL_VERSION) -X main.internalOS=$(GOOS) -X github.com/snyk/cli/cliv2/internal/embedded/cliv1.snykCLIVersion=$(CLI_V1_VERSION_TAG) -X github.com/snyk/cli-extension-iac/internal/commands/iactest.internalRulesClientURL=$(IAC_RULES_URL) -X github.com/snyk/cli/cliv2/pkg/basic_workflows.staticNodeJsBinary=$(STATIC_NODE_BINARY)) @echo "$(LOG_PREFIX) Building ( $(BUILD_DIR)/$(V2_EXECUTABLE_NAME) )" @echo "$(LOG_PREFIX) LDFLAGS: $(LDFLAGS)" @@ -298,6 +303,8 @@ help: @echo "\nFull local targets (Typescript + Golang):" @echo "$(LOG_PREFIX) build-full" @echo "$(LOG_PREFIX) clean-full" + @echo "\nDeveloper targets:" + @echo "$(LOG_PREFIX) build-ide-debug DEST=... CLIP=... GAF=... LS=... CLIENT=..." @echo "\nAvailable parameter:" @echo "$(LOG_PREFIX) GOOS Specify Operating System to compile for (see golang GOOS, default=$(GOOS))" @echo "$(LOG_PREFIX) GOARCH Specify Architecture to compile for (see golang GOARCH, default=$(GOARCH))" @@ -305,3 +312,51 @@ help: @echo "$(LOG_PREFIX) CLI_V1_LOCATION Filesystem location of CLIv1 binaries to bundle, if specified, CLI_V1_VERSION_TAG is also required" @echo "$(LOG_PREFIX) prefix Installation prefix (default=$(prefix))" @echo "$(LOG_PREFIX) DESTDIR For staged installations" + +.PHONY: ide-install +ide-install: + @FINAL_PATH="$(DESTDIR)$(bindir)/$(V2_EXECUTABLE_NAME)"; \ + if [ -n "$(DEST)" ]; then \ + echo "--- IDE Post-build: Copying binary to $(DEST) ---"; \ + cp "$(BUILD_DIR)/$(V2_EXECUTABLE_NAME)" "$(DEST)"; \ + FINAL_PATH="$(DEST)"; \ + fi; \ + if command -v realpath >/dev/null 2>&1; then \ + ABS_FINAL_PATH=$$(realpath "$$FINAL_PATH"); \ + else \ + ABS_FINAL_PATH=$$(cd "$$(dirname "$$FINAL_PATH")" && pwd)/$$(basename "$$FINAL_PATH"); \ + fi; \ + echo "Binary available at: $$ABS_FINAL_PATH"; \ + if [ "$(CLIP)" = "true" ]; then \ + echo "--- Copying path to clipboard ---"; \ + case "$(GOHOSTOS)" in \ + darwin) printf "%s" "$$ABS_FINAL_PATH" | pbcopy; echo "Path copied to clipboard."; ;; \ + linux) if command -v xclip >/dev/null 2>&1; then printf "%s" "$$ABS_FINAL_PATH" | xclip -selection clipboard; echo "Path copied to clipboard (xclip)."; elif command -v wl-copy >/dev/null 2>&1; then printf "%s" "$$ABS_FINAL_PATH" | wl-copy; echo "Path copied to clipboard (wl-copy)."; else echo "Warning: Could not find xclip or wl-copy. Path not copied to clipboard."; fi; ;; \ + windows) printf "%s" "$$ABS_FINAL_PATH" | clip.exe; echo "Path copied to clipboard (clip.exe)."; ;; \ + *) echo "Warning: Unsupported OS for clipboard copy: $(GOHOSTOS)"; ;; \ + esac; \ + fi + +# IDE build arguments +GAF ?= true +LS ?= true +CLIENT ?= false + +.PHONY: build-ide-debug +build-ide-debug: ide-setup debug build-full install ide-install + +.PHONY: ide-setup +ide-setup: + @echo "--- IDE Pre-build: Appending replace directives to go.mod ---"; \ + echo "" >> go.mod; \ + if [ "$(GAF)" = "true" ]; then \ + echo "replace github.com/snyk/go-application-framework => ../../go-application-framework" >> go.mod; \ + fi; \ + if [ "$(LS)" = "true" ]; then \ + echo "replace github.com/snyk/snyk-ls => ../../snyk-ls" >> go.mod; \ + fi; \ + if [ "$(CLIENT)" = "true" ]; then \ + echo "replace github.com/snyk/code-client-go => ../../code-client-go" >> go.mod; \ + fi; \ + echo "--- IDE Pre-build: Running go mod tidy ---"; \ + go mod tidy;