[PATCH 4/5] mkfs: emit config file from builtin defaults

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Darrick J. Wong <darrick.wong@xxxxxxxxxx>

Create a build-time helper program to generate a config file from the
built-in defaults.

Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
---
 mkfs/Makefile   |   14 ++++-
 mkfs/mkconfig.c |  163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 176 insertions(+), 1 deletion(-)
 create mode 100644 mkfs/mkconfig.c


diff --git a/mkfs/Makefile b/mkfs/Makefile
index 102f5214..44ddbd30 100644
--- a/mkfs/Makefile
+++ b/mkfs/Makefile
@@ -12,13 +12,24 @@ CFILES = proto.c xfs_mkfs.c config.c defaults.c
 
 CFGFILE_CFLAGS = -DMKFS_XFS_CONF_DIR=\"$(PKG_MKFS_CFG_DIR)\" \
 		 -DMKFS_XFS_DEFAULT_CONFIG=\"$(PKG_MKFS_DEFAULT_CFGFILE)\"
+CFGFILE_TEMPLATE = $(PKG_MKFS_DEFAULT_CFGFILE).template
+
 LCFLAGS += $(CFGFILE_CFLAGS)
 LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBFROG) $(LIBRT) $(LIBPTHREAD) $(LIBBLKID) \
 	$(LIBUUID)
 LTDEPENDENCIES += $(LIBXFS) $(LIBXCMD) $(LIBFROG)
 LLDFLAGS = -static-libtool-libs
+LDIRT = $(CFGFILE_TEMPLATE)
+
+default: depend $(CFGFILE_TEMPLATE) $(LTCOMMAND)
+
+mkconfig: mkconfig.c defaults.c
+	@echo "    [CC]     mkconfig"
+	$(Q) $(BUILD_CC) $(BUILD_CFLAGS) $(CFGFILE_CFLAGS) -o $@ $^
 
-default: depend $(LTCOMMAND)
+$(CFGFILE_TEMPLATE): mkconfig
+	@echo "    [GENERATE] $@"
+	$(Q) ./mkconfig > $@
 
 include $(BUILDRULES)
 
@@ -27,6 +38,7 @@ install: default
 	$(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_ROOT_SBIN_DIR)
 	$(INSTALL) -m 755 -d $(PKG_CFG_DIR)
 	$(INSTALL) -m 755 -d $(PKG_MKFS_CFG_DIR)
+	$(INSTALL) -m 644 $(CFGFILE_TEMPLATE) $(PKG_MKFS_CFG_DIR)
 install-dev:
 
 -include .dep
diff --git a/mkfs/mkconfig.c b/mkfs/mkconfig.c
new file mode 100644
index 00000000..3826b0bf
--- /dev/null
+++ b/mkfs/mkconfig.c
@@ -0,0 +1,163 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
+ */
+#include "libxfs.h"
+#include "config.h"
+
+enum cfgfile_var_type {
+	FV_BOOL = 0
+};
+
+struct subopt_map {
+	const char		*suboptname;
+	const void		*ptr;
+	enum cfgfile_var_type	type;
+};
+
+/* Map all the config file options to their default_features equivalents. */
+struct confopts {
+	const char		*name;
+	struct subopt_map	subopts[CFG_MAX_SUBOPTS];
+} confopts_tab[] = {
+	{
+		.name = "data",
+		.subopts = {
+			[CFG_D_NOALIGN] = {
+				.suboptname	= "noalign",
+				.ptr		= &default_features.nodalign,
+				.type		= FV_BOOL,
+			},
+			{NULL}
+		},
+	},
+	{
+		.name = "inode",
+		.subopts = {
+			[CFG_I_ALIGN] = {
+				.suboptname	= "align",
+				.ptr		= &default_features.inode_align,
+				.type		= FV_BOOL,
+			},
+			[CFG_I_PROJID32BIT] = {
+				.suboptname	= "projid32bit",
+				.ptr		= &default_features.projid32bit,
+				.type		= FV_BOOL,
+			},
+			[CFG_I_SPINODES] = {
+				.suboptname	= "sparse",
+				.ptr		= &default_features.spinodes,
+				.type		= FV_BOOL,
+			},
+			{NULL}
+		},
+	},
+	{
+		.name = "log",
+		.subopts = {
+			[CFG_L_LAZYSBCNTR] = {
+				.suboptname	= "lazy-count",
+				.ptr		= &default_features.lazy_sb_counters,
+				.type		= FV_BOOL,
+			},
+			{NULL}
+		},
+	},
+	{
+		.name = "metadata",
+		.subopts = {
+			[CFG_M_CRC] = {
+				.suboptname	= "crc",
+				.ptr		= &default_features.crcs_enabled,
+				.type		= FV_BOOL,
+			},
+			[CFG_M_FINOBT] = {
+				.suboptname	= "finobt",
+				.ptr		= &default_features.finobt,
+				.type		= FV_BOOL,
+			},
+			[CFG_M_RMAPBT] = {
+				.suboptname	= "rmapbt",
+				.ptr		= &default_features.rmapbt,
+				.type		= FV_BOOL,
+			},
+			[CFG_M_REFLINK] = {
+				.suboptname	= "reflink",
+				.ptr		= &default_features.reflink,
+				.type		= FV_BOOL,
+			},
+			{NULL}
+		},
+	},
+	{
+		.name = "naming",
+		.subopts = {
+			[CFG_N_FTYPE] = {
+				.suboptname	= "ftype",
+				.ptr		= &default_features.dirftype,
+				.type		= FV_BOOL,
+			},
+			{NULL}
+		},
+	},
+	{
+		.name = "rtdev",
+		.subopts = {
+			[CFG_R_NOALIGN] = {
+				.suboptname	= "noalign",
+				.ptr		= &default_features.nortalign,
+				.type		= FV_BOOL,
+			},
+			{NULL}
+		},
+	},
+};
+
+/* Spit out a config file template. */
+int
+main(
+	int			argc,
+	char			*argv[])
+{
+	struct confopts		*opts = confopts_tab;
+	struct subopt_map	*submap;
+	int			c;
+	unsigned int		i, j;
+
+	while ((c = getopt(argc, argv, "")) != EOF) {
+		switch (c) {
+		case '?':
+			fprintf(stderr, "Unknown option %c.\n", optopt);
+			return 1;
+		}
+	}
+	if (argc - optind != 0) {
+		fprintf(stderr, "extra arguments\n");
+		return 1;
+	}
+
+	printf("# mkfs.xfs configuration file to collect settings.\n");
+	printf("# See the mkfs.xfs(8) manpage for details.\n");
+	printf("# Copy this file to %s/%s to override the built-in defaults.\n",
+			MKFS_XFS_CONF_DIR, MKFS_XFS_DEFAULT_CONFIG);
+
+	for (i = 0; i < ARRAY_SIZE(confopts_tab); i++, opts++) {
+		if (i > 0)
+			printf("\n");
+		printf("[%s]\n", opts->name);
+		submap = opts->subopts;
+		for (j = 0;
+		     j < ARRAY_SIZE(opts->subopts) && submap->suboptname;
+		     j++, submap++) {
+			printf("%s = ", submap->suboptname);
+			switch (submap->type) {
+			case FV_BOOL:
+				printf("%d\n", *((bool *)submap->ptr));
+				break;
+			}
+		}
+	}
+
+	return 0;
+}

--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux