Marcel Telka
2024-04-03 94c2aee55118bccd5c7d8705af55972b97493628
make-rules/environment.mk
@@ -21,81 +21,138 @@
#
# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2020, Adam Stevko
#
SUDO =      /usr/bin/sudo
PFEXEC =   /usr/bin/pfexec
ZONE =   $(WS_TOOLS)/userland-zone
define separator-line
   @$(PYTHON) -c 'l="="*(40-len("$1")/2); print("%s%s%s" % (l, "$1", l))'
       @$(PYTHON) -c 'l="="*int(40-len("$1")/2); print("%s%s%s" % (l, "$1", l))'
endef
component-environment-check::
   $(call separator-line,Workspace)
   @echo " Path:        $(WS_TOP)"
   @echo " Branch:      $$(hg identify -b)"
   @echo " Changeset:   $$(hg identify -n)($$(hg identify -i))"
   @echo " Branch:      $$(git rev-parse --abbrev-ref HEAD)"
   @echo " Changeset:   $$(git rev-parse HEAD)"
   $(call separator-line,System)
   @/usr/bin/uname -a
   @echo "Zone:  $$(/usr/sbin/zonename)"
   @echo "Zone: $$(/usr/bin/zonename)"
   @echo "Zone IP type: $$(/usr/bin/zonename -t)"
   @/usr/sbin/psrinfo -vp
   @/usr/sbin/ipadm show-addr
   $(call separator-line,Required Packages)
   @/usr/bin/pkg list -vH $(REQUIRED_PACKAGES:%=/%)
   @/usr/bin/pkg list -vH $(USERLAND_REQUIRED_PACKAGES:%=/%) $(REQUIRED_PACKAGES:%=/%)
   $(call separator-line)
component-environment-prep::
   @echo "Adding required packages to build environment..."
   @-echo $(REQUIRED_PACKAGES:%=/%) | xargs \
      $(SUDO) /usr/bin/pkg install --accept -v
   @/usr/bin/pkg list -vH $(USERLAND_REQUIRED_PACKAGES:%=/%) $(REQUIRED_PACKAGES:%=/%) >/dev/null || \
      { echo "Adding required packages to build environment..."; \
      while true ; do \
        $(PFEXEC) /usr/bin/pkg install --accept -v $(USERLAND_REQUIRED_PACKAGES:%=/%) $(REQUIRED_PACKAGES:%=/%) ; \
        RETVAL=$$? ; \
        [ $$RETVAL -eq 0 ] && break; \
        [ $$RETVAL -eq 4 ] && break; \
        [ $$RETVAL -ne 7 ] && echo "pkg install returned $$RETVAL" && exit 1; \
        sleep 10; \
      done; }
component-test-environment-check:: component-environment-check
   $(call separator-line,Required Additional Packages Needed for Testing Only)
   @[ -z "$(strip $(USERLAND_TEST_REQUIRED_PACKAGES))$(strip $(TEST_REQUIRED_PACKAGES))" ] || \
      /usr/bin/pkg list -vH $(USERLAND_TEST_REQUIRED_PACKAGES:%=/%) $(TEST_REQUIRED_PACKAGES:%=/%)
   @C=0 ; \
      for p in $(TEST_CONFLICTING_PACKAGES) ; do \
         /usr/bin/pkg list -q /$$p && echo "Conflicting package $$p found" && C=1 ; \
      done ; \
      exit $$C
   $(call separator-line)
#
# For building in a constructed zone.  Currently this assumes a template zone
# with /ws (tools mountpoint) and /builds (workspace mountpoint) mounted
# in the same place as in the global zone.  It also assumes the current
# $USER account is replicated in the template zone.
#
ZONENAME=bz-$(shell echo "$(WS_TOP)" | md5sum | cut -c0-7)-$(COMPONENT_NAME)
component-test-environment-prep::
   @[ -z "$(strip $(USERLAND_TEST_REQUIRED_PACKAGES))$(strip $(TEST_REQUIRED_PACKAGES))" ] || \
      /usr/bin/pkg list -vH $(USERLAND_TEST_REQUIRED_PACKAGES:%=/%) $(TEST_REQUIRED_PACKAGES:%=/%) >/dev/null || \
      { echo "Adding required packages to testing environment..."; \
      while true ; do \
        $(PFEXEC) /usr/bin/pkg install --accept -v $(USERLAND_TEST_REQUIRED_PACKAGES:%=/%) $(TEST_REQUIRED_PACKAGES:%=/%) ; \
        RETVAL=$$? ; \
        [ $$RETVAL -eq 0 ] && break; \
        [ $$RETVAL -eq 4 ] && break; \
        [ $$RETVAL -ne 7 ] && echo "pkg install returned $$RETVAL" && exit 1; \
        sleep 10; \
      done; }
   @for p in $(TEST_CONFLICTING_PACKAGES) ; do \
      /usr/bin/pkg list -q /$$p || continue ; \
      echo "Removing conflicting packages from testing environment..." ; \
      while true ; do \
        $(PFEXEC) /usr/bin/pkg uninstall -v --deny-new-be --ignore-missing $(TEST_CONFLICTING_PACKAGES:%=/%) ; \
        RETVAL=$$? ; \
        [ $$RETVAL -eq 0 ] && exit 0 ; \
        [ $$RETVAL -ne 7 ] && echo "pkg uninstall returned $$RETVAL" && exit 1 ; \
        sleep 10 ; \
      done ; \
   done
$(BUILD_DIR)/packages.xml:   Makefile   $(BUILD_DIR)
   @echo "$(REQUIRED_PACKAGES:%=\t\t<name>pkg:/%</name>\n)" >$(@)
ZONENAME_PREFIX = bz
ZONENAME_ID = $(shell echo "$(WS_TOP)" | sha1sum | cut -c0-7)-$(COMPONENT_NAME)
ZONENAME = $(ZONENAME_PREFIX)-$(ZONENAME_ID)
$(BUILD_DIR)/ai_manifest.xml:   $(WS_TOOLS)/zone_default.xml $(BUILD_DIR)
   $(CP) $< $(@)
component-zone-template:
   $(call separator-line)
   $(call separator-line,Create template zone)
   USER_ID=$$(id -u) && \
   $(PFEXEC) $(ZONE) --prefix $(ZONENAME_PREFIX) create-template -u $${USER} -i $${USER_ID}
$(BUILD_DIR)/sc_profile.xml:   $(WS_TOOLS)/sc_profile.xml $(BUILD_DIR)
   $(GSED) -e "s/XXX_USER_XXX/$${USER}/g" -e "s/XXX_UID_XXX/$$(id -u)/g" $< >$(@)
component-zone-build:   $(BUILD_DIR)/ai_manifest.xml $(BUILD_DIR)/packages.xml \
         $(BUILD_DIR)/sc_profile.xml download
component-zone-build:
   $(call separator-line)
   $(call separator-line,Create $(ZONENAME))
   $(SUDO) /usr/sbin/zonecfg -z $(ZONENAME) create -t template
   #@$(SUDO) /usr/sbin/zoneadm -z $(ZONENAME) clone template
   $(SUDO) /usr/sbin/zoneadm -z $(ZONENAME) install \
      -m $(BUILD_DIR)/ai_manifest.xml \
      -c $(BUILD_DIR)/sc_profile.xml
   $(PFEXEC) $(ZONE) --prefix $(ZONENAME_PREFIX) spawn-zone --id $(ZONENAME_ID)
   $(call separator-line,Boot $(ZONENAME))
   $(SUDO) /usr/sbin/zoneadm -z $(ZONENAME) boot
   @while $$(true) ; do \
      echo "waiting for zone ..." ; \
      $(SUDO) /usr/sbin/zlogin -l $${USER} $(ZONENAME) \
            /bin/true >/dev/null 2>&1 && break ; \
      sleep 10 ; \
   @while $$(true); do \
      echo "Waiting for zone $(ZONENAME) to boot..."; \
      $(PFEXEC) /usr/sbin/zlogin -l $${USER} $(ZONENAME) \
            /bin/true >/dev/null 2>&1 && break; \
      sleep 10; \
   done
   #$(call separator-line,Prep $(ZONENAME))
   #@$(SUDO) /usr/sbin/zlogin -S $(ZONENAME) \
   #   "cd $(COMPONENT_DIR) ; gmake component-be-prep"
   # FIXME:
   # - remove once we figure out a better way how to enable zoneproxy-client inside the nlipkg brand
   @while $$(true); do \
        echo "Waiting for $(ZONENAME) config repository.."; \
        $(PFEXEC) /usr/bin/svcs -z $(ZONENAME) -a >/dev/null 2>&1 && break; \
        sleep 10; \
     done
   # We need to create door inside  after zone-proxy-client is running
   $(call separator-line,Configure IPS for $(ZONENAME))
   $(PFEXEC) /usr/lib/zones/zoneproxy-adm $(ZONENAME)
   @while $$(true); do \
        echo "Waiting for zoneproxyd to be ready.."; \
        PROXY_PID=$$(/usr/bin/svcs -p svc:/application/pkg/zones-proxyd:default | \
           nawk '$$0 ~ /zoneproxyd/ {print $$2}') && \
           $(PFEXEC) /usr/bin/pfiles $${PROXY_PID} | \
           $(GNU_GREP) $(ZONENAME) >/dev/null 2>&1 && break; \
        sleep 10; \
     done
   $(PFEXEC) /usr/sbin/svcadm -z $(ZONENAME) \
      enable svc:/application/pkg/zones-proxy-client:default
   ZONEROOT="$$(/usr/sbin/zoneadm -z $(ZONENAME) list -p | cut -d: -f4)/root" && \
      $(PFEXEC) /usr/bin/pkg -R $${ZONEROOT} set-property use-system-repo True && \
   while $$(true); do \
      echo "Waiting for sysrepo to be ready..." && \
      $(PFEXEC) /usr/bin/pkg -R $${ZONEROOT} publisher | \
      $(GNU_GREP) syspub >/dev/null 2>&1 && break; \
      sleep 10; \
   done
   $(call separator-line,Build in $(ZONENAME))
   $(SUDO) /usr/sbin/zlogin -l $${USER} $(ZONENAME) \
      "cd $(COMPONENT_DIR) ; gmake component-be-check install"
   #   "cd $(COMPONENT_DIR) ; gmake component-be-check publish PKGLINT=/bin/true"
   $(call separator-line,Halt $(ZONENAME))
   $(SUDO) /usr/sbin/zoneadm -z $(ZONENAME) halt
   $(SUDO) /usr/sbin/zoneadm -z $(ZONENAME) uninstall -F
   $(SUDO) /usr/sbin/zonecfg -z $(ZONENAME) delete -F
   $(PFEXEC) /usr/sbin/zlogin -l $${USER} $(ZONENAME) \
      "cd $(COMPONENT_DIR); gmake install"
   $(call separator-line)
component-zone-cleanup::
   -$(SUDO) /usr/sbin/zoneadm -z $(ZONENAME) halt
   -$(SUDO) /usr/sbin/zoneadm -z $(ZONENAME) uninstall -F
   -$(SUDO) /usr/sbin/zonecfg -z $(ZONENAME) delete -F
component-zone-cleanup:
   $(PFEXEC) $(ZONE) destroy-zone --id $(ZONENAME_ID)
# Short aliases for user convenience
env-check:: component-environment-check
env-prep:: component-environment-prep
test-env-check:: component-test-environment-check
test-env-prep:: component-test-environment-prep