diff --git a/tix/tix-build.8 b/tix/tix-build.8
index 72513f0d..34496a25 100644
--- a/tix/tix-build.8
+++ b/tix/tix-build.8
@@ -15,6 +15,9 @@
 .Op Fl \-make Ns = Ns Ar path
 .Op Fl \-makeflags Ns = Ns Ar makeflags
 .Op Fl \-prefix Ns = Ns Ar prefix
+.Op Fl \-print-build
+.Op Fl \-print-host
+.Op Fl \-print-target
 .Op Fl \-source-package Ns = Ns Ar source-package
 .Op Fl \-source-port Ns = Ns Ar source-port
 .Op Fl \-start Ns = Ns Ar step
@@ -112,6 +115,18 @@ Build the port into this
 .Ar prefix .
 (Default: The empty prefix designating the root directory)
 .\" After releasing Sortix 1.1, remove this option.
+.It Fl \-print-build
+Output the effective
+.Fl \-build
+triplet and exit.
+.It Fl \-print-host
+Output the effective
+.Fl \-host
+triplet and exit.
+.It Fl \-print-target
+Output the effective
+.Fl \-target
+triplet and exit.
 .It Fl \-source-package Ns = Ns Ar source-port
 Deprecated alias for
 .Fl \-source-port
diff --git a/tix/tix-build.c b/tix/tix-build.c
index 88355ba5..96928b90 100644
--- a/tix/tix-build.c
+++ b/tix/tix-build.c
@@ -1217,6 +1217,10 @@ int main(int argc, char* argv[])
 {
 	PurifyMakeflags();
 
+	bool print_build = false;
+	bool print_host = false;
+	bool print_target = false;
+
 	struct metainfo minfo;
 	memset(&minfo, 0, sizeof(minfo));
 	minfo.build = NULL;
@@ -1253,6 +1257,12 @@ int main(int argc, char* argv[])
 				errx(1, "unknown option -- '%c'", c);
 			}
 		}
+		else if ( !strcmp("--print-build", arg) )
+			print_build = true;
+		else if ( !strcmp("--print-host", arg) )
+			print_host = true;
+		else if ( !strcmp("--print-target", arg) )
+			print_target = true;
 		else if ( GET_OPTION_VARIABLE("--build", &minfo.build) ) { }
 		else if ( GET_OPTION_VARIABLE("--destination", &minfo.destination) ) { }
 		else if ( GET_OPTION_VARIABLE("--end", &end_step_string) ) { }
@@ -1274,6 +1284,8 @@ int main(int argc, char* argv[])
 			errx(1, "unknown option: %s", arg);
 	}
 
+	compact_arguments(&argc, &argv);
+
 	minfo.generation = atoi(generation_string);
 	free(generation_string);
 	// TODO: After releasing Sortix 1.1, remove generation 2 compatibility.
@@ -1292,11 +1304,41 @@ int main(int argc, char* argv[])
 		exit(1);
 	}
 
-	compact_arguments(&argc, &argv);
+	if ( minfo.build && !minfo.build[0] )
+		free(minfo.build), minfo.build = NULL;
+	if ( minfo.host && !minfo.host[0] )
+		free(minfo.host), minfo.host = NULL;
+	if ( minfo.target && !minfo.target[0] )
+		free(minfo.target), minfo.target = NULL;
+
+	if ( !minfo.build && !(minfo.build = GetBuildTriplet()) )
+		err(1, "unable to determine build, use --build");
+	if ( !minfo.host )
+		minfo.host = strdup(minfo.build);
+	if ( !minfo.target )
+		minfo.target = strdup(minfo.host);
+
+	minfo.cross = strcmp(minfo.build, minfo.host) != 0 || minfo.sysroot;
+
+	if ( print_build || print_host || print_target )
+	{
+		if ( print_build )
+			printf("%s\n", minfo.build);
+		if ( print_host )
+			printf("%s\n", minfo.host);
+		if ( print_target )
+			printf("%s\n", minfo.target);
+		if ( ferror(stdout) || fflush(stdout) == EOF )
+			err(1, "stdout");
+		return 0;
+	}
 
 	if ( minfo.prefix && !strcmp(minfo.prefix, "/") )
 		minfo.prefix[0] = '\0';
 
+	if ( minfo.prefix && !minfo.exec_prefix )
+		minfo.exec_prefix = strdup(minfo.prefix);
+
 	if ( argc < 2 )
 	{
 		fprintf(stderr, "%s: no package specified\n", argv0);
@@ -1316,25 +1358,6 @@ int main(int argc, char* argv[])
 	if ( !minfo.package_dir )
 		err(1, "%s", srctix);
 
-	if ( minfo.build && !minfo.build[0] )
-		free(minfo.build), minfo.build = NULL;
-	if ( minfo.host && !minfo.host[0] )
-		free(minfo.host), minfo.host = NULL;
-	if ( minfo.target && !minfo.target[0] )
-		free(minfo.target), minfo.target = NULL;
-
-	if ( !minfo.build && !(minfo.build = GetBuildTriplet()) )
-		err(1, "unable to determine build, use --build");
-	if ( !minfo.host )
-		minfo.host = strdup(minfo.build);
-	if ( !minfo.target )
-		minfo.target = strdup(minfo.host);
-
-	minfo.cross = strcmp(minfo.build, minfo.host) != 0 || minfo.sysroot;
-
-	if ( minfo.prefix && !minfo.exec_prefix )
-		minfo.exec_prefix = strdup(minfo.prefix);
-
 	if ( !IsDirectory(minfo.package_dir) )
 		err(1, "`%s'", minfo.package_dir);