Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
make[1]: *** [kernel/timeconst.h] Error 255
環境:Fedora 23 (64位),編譯 Linux 2.6.38 內核。
Perl 版本不兼容。Perl 5.22+ 移除了 defined(@array) 和 defined(%hash) 的支援,直接使用數組/雜湊在布爾上下文中即可判斷是否為空。
if (defined(@array))if (@array)Linux 2.6.38 (2011 年發布) 的腳本使用了已棄用語法,而 Fedora 23 預裝 Perl 5.22+。
# 1. 備份原文件
cp kernel/timeconst.pl kernel/timeconst.pl.bak
# 2. 修改第 373 行及類似行
sed -i 's/defined(@\([a-zA-Z_][a-zA-Z0-9_]*\))/@\1/g' kernel/timeconst.pl
# 或手動編輯:
# 第 373 行:if (defined(@vals)) → if (@vals)
# 搜尋所有 defined(@xxx) 替換為 @xxx
# 安裝舊版 Perl(如 5.20)
# 使用 perlbrew 或從源碼編譯安裝到 /opt/perl-5.20
# 編譯內核時指定:make PERL=/opt/perl-5.20/bin/perl
Linux 2.6.38 過於古老(EOL 2011),建議編譯**長期支援版**(LTS):
# 測試腳本語法
perl -c kernel/timeconst.pl
# 應輸出:kernel/timeconst.pl syntax OK
# 繼續編譯
make -j$(nproc)
defined(@array) 錯誤是 **Perl 5.22+ 棄用語法**導致。快速修補:sed -i 's/defined(@\([a-zA-Z_][a-zA-Z0-9_]*\))/@\1/g' kernel/timeconst.pl。長期建議:**升級至現代 LTS 內核**,除非嵌入式 BSP 強綁定舊版本。內核編譯首選 make defconfig 產生默認配置,再 make menuconfig 微調,避免手動改動配置導致依賴缺失。