mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
From: Ladislav Michl <oss-lists@triops.cz>
To: ptxdist@pengutronix.de
Subject: [ptxdist] [PATCH 6/6] ptxdist: let new project raise from template
Date: Tue, 13 Oct 2026 13:18:50 +0200	[thread overview]
Message-ID: <as4TmoiSmMLjKuuM@lenoch> (raw)
In-Reply-To: <as4S9kELLgKY9wdR@lenoch>

From: Ladislav Michl <ladis@triops.cz>

Let PTXdist offer to create the project from template when BSP
directory it is running from appears unconfigured.

Nothing is written before all questions are answered, so declining or
Ctrl-C leaves the directory untouched.

Without a terminal or for configs given with --ptxconfig/--platformconfig,
the error is shown as before. The toolchain check is disabled in the new
platformconfig, as there is no toolchain yet.

The host tools prepared in ~/.cache before the project existed are
copied into it, so they are not built twice.

Signed-off-by: Ladislav Michl <ladis@triops.cz>
---
 README                                 |   3 +
 bin/ptxdist                            | 146 ++++++++++++++++++++++++-
 doc/ref_parameter.rst                  |   4 +
 rules/templates/project/gitignore      |   9 ++
 rules/templates/project/platformconfig |  10 ++
 rules/templates/project/ptxconfig      |   6 +
 6 files changed, 174 insertions(+), 4 deletions(-)
 create mode 100644 rules/templates/project/gitignore
 create mode 100644 rules/templates/project/platformconfig
 create mode 100644 rules/templates/project/ptxconfig

diff --git a/README b/README
index 5774e046a..5ac1c6468 100644
--- a/README
+++ b/README
@@ -31,6 +31,9 @@ all missing tools at once, and builds kconfig in .ptxdist/<version>/
 (.ptxdist/git/ for git checkouts) inside the BSP. The PTXdist tree
 itself is never written to.
 
+In case the BSP directory appears uninitialized, PTXdist offers to
+create the project from template.
+
 Idea
 ----
 
diff --git a/bin/ptxdist b/bin/ptxdist
index 3c86aa225..65bc70ce8 100755
--- a/bin/ptxdist
+++ b/bin/ptxdist
@@ -264,11 +264,18 @@ check_version() {
 
 
 
+_init_hint() {
+	if [ -z "${ptxd_init_asked}" -a ! -t 0 ]; then
+		echo "	or run ptxdist in a terminal to create a new ${1}"
+	fi
+}
+
 _get_config_ptx() {
-	if [ ! -e "${PTXDIST_PTXCONFIG}" ]; then
+	if [ ! -e "${PTXDIST_PTXCONFIG}" ] && ! do_init ptx; then
 		ptxd_dialog_msgbox \
 			"error:	'${PTXDIST_PTXCONFIG#${PTXDIST_WORKSPACE}/}' file is missing\n" \
-			"	try 'ptxdist select <ptxconfig>'\n"
+			"	try 'ptxdist select <ptxconfig>'\n" \
+			"$(_init_hint project)\n"
 		return 1
 	fi
 
@@ -321,10 +328,11 @@ _check_config_platform() {
 	#
 	ptxd_get_ptxconf PTXCONF_NO_PLATFORM >/dev/null && return || true
 
-	if [ ! -e "${PTXDIST_PLATFORMCONFIG}" ]; then
+	if [ ! -e "${PTXDIST_PLATFORMCONFIG}" ] && ! do_init platform; then
 		ptxd_dialog_msgbox \
 			"error:	'${PTXDIST_PLATFORMCONFIG#${PTXDIST_WORKSPACE}/}' is missing\n" \
-			"	try 'ptxdist platform <platformconfig>'"
+			"	try 'ptxdist platform <platformconfig>'\n" \
+			"$(_init_hint platform)"
 		return 1
 	fi
 
@@ -1507,6 +1515,136 @@ do_select()
 }
 
 
+#
+# create what is missing for a new project on demand:
+# the ptxconfig and, if not selected either, the platformconfig,
+# or just the platformconfig; returns 1 if nothing was created.
+#
+# $1: what is missing: 'ptx' or 'platform'
+#
+do_init()
+{
+	local part="${1}"
+	local project platform arch answer
+	local -a archs
+	local templates="${PTXDIST_TOPDIR}/rules/templates/project"
+	local ptxconfig="configs/ptxconfig"
+	local platformconfig
+
+	# only interactive and only for the default locations
+	if [ ! -t 0 -o ! -t 1 -o -n "${PTX_MENU}" ]; then
+		return 1
+	fi
+	if [ "${part}" = ptx -a "${PTX_ptxconfig_SET}" = true ]; then
+		return 1
+	fi
+	if [ "${PTX_platformconfig_SET}" = true ]; then
+		[ "${part}" = platform ] && return 1
+	elif [ ! -e "${PTXDIST_PLATFORMCONFIG}" ]; then
+		platformconfig=new
+	fi
+
+	if [ "${part}" = ptx -a -e "${ptxconfig}" ]; then
+		return 1
+	fi
+
+	ptxd_init_asked=true
+	echo
+	if [ "${part}" = ptx ]; then
+		echo "${PTXDIST_LOG_PROMPT}there is no PTXdist project in '${PTXDIST_WORKSPACE}'"
+		read -e -p "${PTXDIST_LOG_PROMPT}create a new one? [y/N] " answer || return 1
+	else
+		echo "${PTXDIST_LOG_PROMPT}no platform is selected"
+		read -e -p "${PTXDIST_LOG_PROMPT}create a new one? [y/N] " answer || return 1
+	fi
+	case "${answer}" in
+	y|Y|yes) ;;
+	*) return 1 ;;
+	esac
+	echo
+
+	if [ "${part}" = ptx ]; then
+		project="$(basename "${PTXDIST_WORKSPACE}")"
+		ptxd_template_read "project name" project "${project}" || return 1
+		if [ -z "${project}" ]; then
+			ptxd_bailout "the project name must not be empty"
+		fi
+	fi
+	if [ -n "${platformconfig}" ]; then
+		# the architectures from the main choice in architecture.in
+		archs=( $(awk '/^choice/ { c++ } c == 1 && /^\tconfig ARCH_/ { print $2 } /^endchoice/ && c == 1 { exit }' \
+			"${PTXDIST_TOPDIR}/platforms/architecture.in") ) &&
+		ptxd_template_read_options "architecture" arch "${archs[@]#ARCH_}" || return 1
+		platform="${arch,,}"
+		while :; do
+			ptxd_template_read "platform name" platform "${platform}" || return 1
+			platformconfig="configs/platform-${platform}/platformconfig"
+			if [ -z "${platform}" ]; then
+				echo "${PTXDIST_LOG_PROMPT}the platform name must not be empty"
+			elif [ -e "${platformconfig}" ]; then
+				echo "${PTXDIST_LOG_PROMPT}'${platformconfig}' already exists"
+			else
+				break
+			fi
+		done
+	fi
+
+	# create everything after all questions answered
+	echo
+	if [ -n "${project}" ]; then
+		echo "${PTXDIST_LOG_PROMPT}creating project '${project}'"
+		mkdir -p configs rules projectroot &&
+		if [ ! -e .gitignore ]; then
+			ptxd_replace_magic "${templates}/gitignore" > .gitignore
+		fi &&
+		PROJECT="${project}" \
+			ptxd_replace_magic "${templates}/ptxconfig" > "${ptxconfig}" &&
+		ln -sf "${ptxconfig}" "${PTXDIST_PTXCONFIG_DEFAULT}" || return
+		PTXDIST_PTXCONFIG="${PTXDIST_PTXCONFIG_DEFAULT}"
+	fi
+	if [ -n "${platform}" ]; then
+		echo "${PTXDIST_LOG_PROMPT}creating platform '${platform}' (${arch,,})"
+		mkdir -p "$(dirname "${platformconfig}")" &&
+		PLATFORM="${platform}" ARCH="ARCH_${arch}" \
+			ptxd_replace_magic "${templates}/platformconfig" > "${platformconfig}" &&
+		ln -sf "${platformconfig}" "${PTXDIST_PLATFORMCONFIG_DEFAULT}" || return
+		PTXDIST_PLATFORMCONFIG="${PTXDIST_PLATFORMCONFIG_DEFAULT}"
+	fi
+
+	# this is a project now, keep the host tools with it
+	case "${PTXDIST_HOSTTOOLS_DIR}" in
+	"${PTXDIST_TOPDIR}"|"${PTXDIST_WORKSPACE}/.ptxdist/"*)
+		;;
+	*)
+		if [ ! -e ".ptxdist/${PTXDIST_HOSTTOOLS_DIR##*/}" ]; then
+			mkdir -p .ptxdist &&
+			cp -a "${PTXDIST_HOSTTOOLS_DIR}" ".ptxdist/" || return
+		fi
+		;;
+	esac
+
+	unset PTXDIST_PLATFORMDIR
+	setup_platform &&
+	setup_path &&
+	setup_export || return
+
+	# fill in the defaults for everything else
+	if [ -n "${project}" ]; then
+		KCONFIG_ALLCONFIG="${PTXDIST_WORKSPACE}/${ptxconfig}" \
+			do_config alldefconfig ptx > /dev/null || return
+	fi
+	if [ -n "${platform}" ]; then
+		KCONFIG_ALLCONFIG="${PTXDIST_WORKSPACE}/${platformconfig}" \
+			do_config alldefconfig platform > /dev/null || return
+	fi
+
+	echo
+	echo "${PTXDIST_LOG_PROMPT}done. There is no toolchain yet, select one with"
+	echo "${PTXDIST_LOG_PROMPT}'ptxdist toolchain <path>'. 'ptxdist platformconfig' refines"
+	echo "${PTXDIST_LOG_PROMPT}the platform, 'ptxdist newpackage <type>' adds own packages."
+	echo
+}
+
 
 #
 # guess and find the toolchain
diff --git a/doc/ref_parameter.rst b/doc/ref_parameter.rst
index e167f28fe..52d470304 100644
--- a/doc/ref_parameter.rst
+++ b/doc/ref_parameter.rst
@@ -28,6 +28,8 @@ Setup and Project Actions
   the same project. The default location for the configuration file is
   ``configs/ptxconfig``. PTXdist will use this if no other configuration is
   selected.
+  If there is no configuration at all and PTXdist runs in a terminal, it
+  offers to create a new project instead, see ``rules/templates/project/``.
 
 ``platform <config>``
   this action will select a platform
@@ -38,6 +40,8 @@ Setup and Project Actions
   The default location for the configuration file is
   ``configs/*/platformconfig``. PTXdist will use that if the pattern matches
   exactly one file and no other configuration is selected.
+  If no platform is selected and PTXdist runs in a terminal, it offers to
+  create a new one instead.
 
 ``toolchain [<path>]``
   this action will select the toolchain to use. If no path is specified
diff --git a/rules/templates/project/gitignore b/rules/templates/project/gitignore
new file mode 100644
index 000000000..20ede9441
--- /dev/null
+++ b/rules/templates/project/gitignore
@@ -0,0 +1,9 @@
+/.ptxdist/
+/configs/*.old
+/configs/platform-*/*.old
+/platform-*
+/selected_collectionconfig
+/selected_platformconfig
+/selected_ptxconfig
+/selected_toolchain*
+/src
diff --git a/rules/templates/project/platformconfig b/rules/templates/project/platformconfig
new file mode 100644
index 000000000..165143199
--- /dev/null
+++ b/rules/templates/project/platformconfig
@@ -0,0 +1,10 @@
+#
+# template for a new project, everything not set here gets its default
+#
+PTXCONF__platformconfig_MAGIC__=y
+PTXCONF_PLATFORMCONFIG_VERSION="@PTXDIST_VERSION_FULL@"
+PTXCONF_PLATFORM="@PLATFORM@"
+PTXCONF_@ARCH@=y
+# no toolchain yet, select one with 'ptxdist toolchain <path>'
+PTXCONF_CROSSCHAIN_VENDOR=""
+PTXCONF_CROSSCHAIN_CHECK=""
diff --git a/rules/templates/project/ptxconfig b/rules/templates/project/ptxconfig
new file mode 100644
index 000000000..2b4b71024
--- /dev/null
+++ b/rules/templates/project/ptxconfig
@@ -0,0 +1,6 @@
+#
+# template for a new project, everything not set here gets its default
+#
+PTXCONF__ptxconfig_MAGIC__=y
+PTXCONF_CONFIGFILE_VERSION="@PTXDIST_VERSION_FULL@"
+PTXCONF_PROJECT="@PROJECT@"
-- 
2.47.3




      parent reply	other threads:[~2026-10-13 11:19 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-13 11:16 [ptxdist] [PATCH 0/6] New BSP " Ladislav Michl
2026-10-13 11:16 ` [ptxdist] [PATCH 1/6] scripts: add ptxdist_bootstrap.sh with out-of-tree build support Ladislav Michl
2026-10-13 11:17 ` [ptxdist] [PATCH 2/6] ptxdist: introduce PTXDIST_HOSTTOOLS_DIR Ladislav Michl
2026-10-13 11:17 ` [ptxdist] [PATCH 3/6] ptxdist: prepare host tools on demand Ladislav Michl
2026-10-13 11:18 ` [ptxdist] [PATCH 4/6] ptxdist: don't depend on bash being /bin/bash Ladislav Michl
2026-10-13 11:18 ` [ptxdist] [PATCH 5/6] configure: use ptxdist_bootstrap.sh to check the host Ladislav Michl
2026-10-13 11:18 ` Ladislav Michl [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=as4TmoiSmMLjKuuM@lenoch \
    --to=oss-lists@triops.cz \
    --cc=ptxdist@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox