diff --git a/NEWS b/NEWS
index b27d38be770..911df9cabb2 100644
--- a/NEWS
+++ b/NEWS
@@ -357,6 +357,11 @@ CHANGES WITH 246 in spe:
The optional positional argument to "systemctl reboot" is now
being deprecated in favor of this option.
+ * Support for the .include syntax in unit files has been removed. The
+ concept has been obsolete for 6 years and we started warning about
+ its pending removal 2 years ago (also see NEWS file below). It's
+ finally gone now.
+
CHANGES WITH 245:
* A new tool "systemd-repart" has been added, that operates as an
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index cdd7572addb..8c0815488b1 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -226,9 +226,6 @@
foo-.service.d/10-override.conf would override
service.d/10-override.conf.
-
-
Note that while systemd offers a flexible dependency system
between units it is recommended to use this functionality only
sparingly and instead rely on techniques such as bus-based or
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 49fdcaff7e1..517813986b9 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -4864,7 +4864,7 @@ int unit_load_fragment(Unit *u) {
r = config_parse(u->id, fragment, f,
UNIT_VTABLE(u)->sections,
config_item_perf_lookup, load_fragment_gperf_lookup,
- CONFIG_PARSE_ALLOW_INCLUDE,
+ 0,
u,
NULL);
if (r == -ENOEXEC)
diff --git a/src/fuzz/fuzz-unit-file.c b/src/fuzz/fuzz-unit-file.c
index 34f59a44372..c0661433a31 100644
--- a/src/fuzz/fuzz-unit-file.c
+++ b/src/fuzz/fuzz-unit-file.c
@@ -74,7 +74,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
name, name, f,
UNIT_VTABLE(u)->sections,
config_item_perf_lookup, load_fragment_gperf_lookup,
- CONFIG_PARSE_ALLOW_INCLUDE,
+ 0,
u,
NULL);
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index 21226573428..0a59f19e2a6 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -159,7 +159,7 @@ static int parse_line(
char *l,
void *userdata) {
- char *e, *include;
+ char *e;
assert(filename);
assert(line > 0);
@@ -173,35 +173,6 @@ static int parse_line(
if (*l == '\n')
return 0;
- include = first_word(l, ".include");
- if (include) {
- _cleanup_free_ char *fn = NULL;
-
- /* .includes are a bad idea, we only support them here
- * for historical reasons. They create cyclic include
- * problems and make it difficult to detect
- * configuration file changes with an easy
- * stat(). Better approaches, such as .d/ drop-in
- * snippets exist.
- *
- * Support for them should be eventually removed. */
-
- if (!(flags & CONFIG_PARSE_ALLOW_INCLUDE)) {
- log_syntax(unit, LOG_ERR, filename, line, 0, ".include not allowed here. Ignoring.");
- return 0;
- }
-
- log_syntax(unit, LOG_WARNING, filename, line, 0,
- ".include directives are deprecated, and support for them will be removed in a future version of systemd. "
- "Please use drop-in files instead.");
-
- fn = file_in_same_dir(filename, strstrip(include));
- if (!fn)
- return -ENOMEM;
-
- return config_parse(unit, fn, NULL, sections, lookup, table, flags, userdata, NULL);
- }
-
if (!utf8_is_valid(l))
return log_syntax_invalid_utf8(unit, LOG_WARNING, filename, line, l);
diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h
index 6c8c1092ea5..0eaff0c0e0e 100644
--- a/src/shared/conf-parser.h
+++ b/src/shared/conf-parser.h
@@ -16,8 +16,7 @@
typedef enum ConfigParseFlags {
CONFIG_PARSE_RELAXED = 1 << 0, /* Do not warn about unknown non-extension fields */
- CONFIG_PARSE_ALLOW_INCLUDE = 1 << 1, /* Allow the deprecated .include stanza */
- CONFIG_PARSE_WARN = 1 << 2, /* Emit non-debug messages */
+ CONFIG_PARSE_WARN = 1 << 1, /* Emit non-debug messages */
} ConfigParseFlags;
/* Argument list for parsers of specific configuration settings. */
diff --git a/src/shared/install.c b/src/shared/install.c
index 5dd5d2aa9ae..bb2eff73879 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1304,7 +1304,7 @@ static int unit_file_load(
"-Target\0"
"-Timer\0",
config_item_table_lookup, items,
- CONFIG_PARSE_ALLOW_INCLUDE, info,
+ 0, info,
NULL);
if (r < 0)
return log_debug_errno(r, "Failed to parse %s: %m", info->name);