Как make-файл записывает пользовательские переменные в файл yaml для поддержки параметров выборки vagrantfile - PullRequest
1 голос
/ 30 сентября 2019

У меня есть проект, который использует makefile для управления vagrant, я хочу поместить параметр vagrant в make-файл, такой как cpu, memory, ip, hostname, forwarded_port и тому подобное. Я нашел способ , который vagrantfile читает файл yaml для параметризации vagrantfile. Поэтому makefile требуется target, чтобы прочитать все переменные пользовательских опций и записать их в config.yaml в виде key-value пар.

Пример выглядит следующим образом:

# === BEGIN USER OPTIONS ===
BOX_OS ?= fedora
# Box setup
#BOX_IMAGE
# Disk setup
DISK_COUNT ?= 1
DISK_SIZE_GB ?= 25
# VM Resources
MASTER_CPUS ?= 2
MASTER_MEMORY_SIZE_GB ?= 2
NODE_CPUS ?= 2
NODE_MEMORY_SIZE_GB ?= 2

NODE_COUNT ?= 2
# Network
MASTER_IP ?= 192.168.26.10
NODE_IP_NW ?= 192.168.26.
POD_NW_CIDR ?= 10.244.0.0/16

...
...
# === END USER OPTIONS ===

echo команда достигает этого

# Makefile
envInit:
    @echo "POD_NW_CIDR : \"$(POD_NW_CIDR)\"" > ${FILECWD}/configs.yaml

Но too many variables может быть слишком сложным.

Есть ли способ массового чтения переменных и их значений и записи их в файл yml

Буду очень признателен, если вы, ребята, расскажете, как этого добиться, массово читая переменные и их значения и записывая их в файл yml.

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Определите все пользовательские параметры (вместе со значениями по умолчанию) в виде списка, чтобы они могли повторяться:

# list of user options with default values
userOptions = \
  BOX_OS=2 \
  DISK_COUNT=1 \
  MASTER_IP=192.168.26.10

# replace each default value with the env value, if any
userOptionValues = $(foreach i, $(userOptions), \
  $(word 1, $(subst =, ,$i))=$(or \
      $($(word 1, $(subst =, ,$i))), $($(word 1, $(subst =, ,$i))), $(word 2, $(subst =, ,$i))))

# write the yaml file
envInit:
# empty the file
    @printf "" > configs.yaml
# write a line for each option
    @for i in $(userOptionValues); do \
        printf "%s : %s\n" "$$(printf $$i | cut -d= -f1)" "$$(printf $$i | cut -d= -f2)" >> configs.yaml; \
    done
0 голосов
/ 30 сентября 2019

Вы можете записать напрямую в файл с помощью функции GNUmake s $(file):

define newline :=
$(strip)
$(strip)
endef
space := $(strip) $(strip)#
-never-matching := ¥# character 165, this is used as a list element that should never appear as a real element

option-names = $(subst $(-never-matching),,$(filter $(-never-matching)%,$(subst $(-never-matching)$(space),$(-never-matching),$(-never-matching)$(strip $(subst $(newline), $(-never-matching),$1)))))


# define your user options in as many separate parts as you like, spaces and empty lines included:
define USER_OPTIONS +=
a = spaces are no problem

b = "neither nearly all 'other' characters: 8&)("
endef

define USER_OPTIONS +=

c = baz baf
d = foobar
endef

# make all definition make variables verbatim 
$(eval $(USER_OPTIONS))

YAML_FORMAT := $(foreach name,$(call option-names,$(USER_OPTIONS)),$(newline)$(name) : $($(name)))

# write the file. Warning: this happens before any rule is run!
$(file >test.yaml,$(YAML_FORMAT))

$(info $(foreach name,$(call option-names,$(USER_OPTIONS)),<$(name) : $($(name))> ))

Хитрость заключается в кластеризации всех соответствующих пользовательских опционных переменных в одну многострочную переменную make. Функция option-names вытягивает все идентификаторы из этой переменной в отдельный список.

Я взял newline и т. Д. Определения символов из набора инструментов таблицы GNUmake , который имеет много функций для "программных""сделать.

0 голосов
/ 30 сентября 2019

@ flyx Спасибо за ответ, ваш код работает отлично. Но я, кажется, нашел более удобный способ , и я частично его изменил.

printvars:
    @echo$(foreach V,$(sort $(.VARIABLES)), \
        $(if $(filter-out environment% default automatic,$(origin $V)),$(info $V: $($V))))

Но между достижением цели все еще есть разрыв.

* 1007Вывод *

make printvars содержит ряд других переменных

$ make printvars 
.DEFAULT_GOAL: printvars
CLOUD_IP: 192.168.79.222
CLOUD_MEMORY: 8
CLOUD_NAME: cloud
CURDIR: /testmakecreateyml0930
FILECWD: /testmakecreateyml0930
GNUMAKEFLAGS: 
MAKEFILE_LIST:  Makefile
MAKEFLAGS: 
SHELL: /bin/sh

И он может быть напечатан и не экспортирован в файл yaml. Это только один шаг от успеха.

Буду признателен, если вы поможете мне изменить его для достижения моей цели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...