diff --git a/scripts/feature_lib.lua b/scripts/feature_lib.lua
index 4c575dd470dc16a80dda279c13a245550f45c193..a5197e0add13522733025e42d483b4bb5205b65c 100644
--- a/scripts/feature_lib.lua
+++ b/scripts/feature_lib.lua
@@ -16,7 +16,7 @@ local function collect_keys(t)
 	return ret
 end
 
-function M.get_packages(file, features)
+function M.get_packages(files, features)
 	local enabled_features = to_keys(features)
 	local handled_features = {}
 	local packages = {}
@@ -55,13 +55,15 @@ function M.get_packages(file, features)
 		end
 	end
 
-	-- Evaluate the feature definition file
-	local f, err = loadfile(file)
-	if not f then
-		error('Failed to parse feature definition: ' .. err)
+	-- Evaluate the feature definition files
+	for _, file in ipairs(files) do
+		local f, err = loadfile(file)
+		if not f then
+			error('Failed to parse feature definition: ' .. err)
+		end
+		setfenv(f, funcs)
+		f()
 	end
-	setfenv(f, funcs)
-	f()
 
 	-- Handle default packages
 	for _, feature in ipairs(features) do
diff --git a/scripts/target_config_lib.lua b/scripts/target_config_lib.lua
index e91dfb0c9bfa556f5f3871ec27aa17e95cf6aee8..4b107e2bd0c982ed785021dd9134685ec90d2329 100644
--- a/scripts/target_config_lib.lua
+++ b/scripts/target_config_lib.lua
@@ -91,21 +91,15 @@ local function site_packages(image)
 end
 
 local function feature_packages(features)
-	local pkgs = {}
-	local function handle_feature_file(file)
-		pkgs = concat_list(pkgs, feature_lib.get_packages(file, features))
-	end
-
-	handle_feature_file('package/features')
-
+	local files = {'package/features'}
 	for _, feed in ipairs(feeds) do
 		local path = string.format('packages/%s/features', feed)
 		if file_exists(path) then
-			handle_feature_file(path)
+			table.insert(files, path)
 		end
 	end
 
-	return pkgs
+	return feature_lib.get_packages(files, features)
 end
 
 -- This involves running a few processes to evaluate site.mk, so we add a simple cache