FreeBSD: “/usr/ports/Mk/bsd.sites.mk”, line 958: Malformed conditional

Автор: | 27/05/2014
 

freebsd_logoНа FreeBSD 9.0 при попытке очистки каталога с портами – вдруг оказалось, что утилита make уже не работает:

# portsclean -C
Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

Unknown modifier 't'

"/usr/ports/Mk/bsd.sites.mk", line 958: Malformed conditional (!empty(_PERL_CPAN_ID) && ${_PERL_CPAN_FLAG:tl} == "cpan")
Unknown modifier 't'

"Mk/bsd.port.mk", line 2929: Unclosed conditional/for loop
"Mk/bsd.port.mk", line 2929: Unexpected end of file in for loop.

"Mk/bsd.port.mk", line 6711: Unclosed conditional/for loop
"Mk/bsd.port.mk", line 6711: Unexpected end of file in for loop.

1 open conditional:
         at line 1179 (evaluated to true)
make: fatal errors encountered -- cannot continue
/usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:237:in `join': can't convert nil into String (TypeError)
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:237:in `index_file'
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:247:in `db_dir='
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:167:in `setup'
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/pkgtools.rb:242:in `init_pkgtools_global'
        from /usr/local/sbin/portsclean:134:in `block in main'
        from /usr/local/lib/ruby/1.9/optparse.rb:882:in `initialize'
        from /usr/local/sbin/portsclean:70:in `new'
        from /usr/local/sbin/portsclean:70:in `main'
        from /usr/local/sbin/portsclean:727:in `<main>'

Одно из решений – установка утилиты bmake – не помогло, но стоит озвучить и его.

Устанавливаем пакет (т.к. из портов ничего установить нельзя):

# pkg_add -r bmake

В случае возникновения ошибки при поиске пакета – решение в статье Error: Unable to get ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-9.0-release/.

Делаем резервную копию старого make:

# mv /usr/bin/make /usr/bin/make.old

И создаём линк с утилиты bmake на make:

# ln /usr/local/bin/bmake /usr/bin/make

Но тут тоже получилась ошибка:

# portsclean -C
/usr/bin/make: Undefined symbol "_ThreadRuneLocale"/usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:237:in `join': can't convert nil into String (TypeError)
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:237:in `index_file'
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:247:in `db_dir='
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/portsdb.rb:167:in `setup'
        from /usr/local/lib/ruby/site_ruby/1.9/pkgtools/pkgtools.rb:242:in `init_pkgtools_global'
        from /usr/local/sbin/portsclean:134:in `block in main'
        from /usr/local/lib/ruby/1.9/optparse.rb:882:in `initialize'
        from /usr/local/sbin/portsclean:70:in `new'
        from /usr/local/sbin/portsclean:70:in `main'
        from /usr/local/sbin/portsclean:727:in `<main>'

Решение которое действительно помогло – установка на другой машине FreeBSD 9.2 (или использовать имеющуюся, в данном случае она была), и копирование с неё новой make.

Удаляем симлинк:

# unlink /usr/bin/make

Со второй машины копируем:

# scp /usr/bin/make [email protected]:/home/setevoy
Password:
make                                                                                                                                                                                                       100%  397KB 396.9KB/s   00:00

Копируем её в каталог /usr/bin:

#  mv /home/setevoy/make /usr/bin/make

После этого – всё заработало:

# portsclean -C
Cleaning out /usr/ports/*/*/work...
done.

Но вообще – конечно, надо обновлять систему: FreeBSD: обновление 8.2 RELEASE до 8.3 RELEASE