TL;DR:
# pkg change-facet \
version-lock.system/library/gcc/gcc-c-runtime=false \
version-lock.system/library/gcc/gcc-c++-runtime=false
и повторите попытку.
Итак, проблема в том, что gcc-5
— это то, что известно как «групповой» пакет. То есть он состоит (по крайней мере преимущественно )из кучи group
зависимостей.Зависимость group
— это зависимость, которая будет установлена, если это возможно, но проигнорирована, если нет. В этом случае не удалось установить одну или несколько зависимостей gcc-5
, поэтому они были проигнорированы, и вы получили меньше, чем ожидали.
Когда это происходит (, будь то меньшее количество пакетов или пакеты другой версии ), первое, что вы должны сделать, это сообщить pkg
, что вы на самом деле ожидаете. (Теперь разъединение здесь заключается в том, как узнать, чего ожидать; не зная, как проверить gcc-5
эту информацию, или даже не зная, что вам это может понадобиться, я не знаю, как на это ответить. )В этом случае выберите одну из ее зависимостей, чтобы посмотреть, поможет ли она; скажем,gcc-c-5
(вы выполнили этот шаг для gcc-c++-5
, что дало вам ту же проблему, что и я здесь, но я хотел собрать все это вместе в одном ответе ). Это говорит pkg
не игнорировать невозможность установить gcc-c-5
, а действительно подробно пожаловаться на то, почему его не удалось установить. Надеюсь, в выводе будет что-то, что даст нам представление о том, что делать дальше:
# pkg install -nv gcc-5 gcc-c-5
Creating Plan (Solver setup): |
pkg install: No matching version of developer/gcc-5 can be installed:
Reject: pkg://solaris/developer/gcc-5@5.4.0-5.12.0.0.0.115.0
Reason: No version matching 'group' dependency developer/gcc/gcc-c++-5 can be installed
----------------------------------------
Reject: pkg://solaris/developer/gcc/gcc-c++-5@5.4.0-5.12.0.0.0.115.0
Reason: No version matching 'require' dependency developer/gcc/gcc-c-5 can be installed
----------------------------------------
Reject: pkg://solaris/developer/gcc/gcc-c-5@5.4.0-5.12.0.0.0.115.0
Reason: No version matching 'require' dependency system/library/gcc/gcc-c++-runtime@5.4.0,5.11-5.12.0.0.0.115.0 can be installed
----------------------------------------
Reject: pkg://solaris/system/library/gcc/gcc-c++-runtime@5.4.0-5.12.0.0.0.115.0
Reason: No version matching 'require' dependency system/library/gcc/gcc-c-runtime@5.4.0,5.11-5.12.0.0.0.115.0 can be installed
----------------------------------------
Reject: pkg://solaris/system/library/gcc/gcc-c-runtime@5.4.0-5.12.0.0.0.115.0
Reason: This version is excluded by installed incorporation consolidation/userland/userland-incorporation@0.5.11-0.175.3.19.0.2.0
----------------------------------------
Reason: This version is excluded by installed incorporation consolidation/userland/userland-incorporation@0.5.11-0.175.3.19.0.2.0
----------------------------------------
----------------------------------------
----------------------------------------
No matching version of developer/gcc/gcc-c-5 can be installed:
Reject: pkg://solaris/developer/gcc/gcc-c-5@5.4.0-5.12.0.0.0.115.0
Reason: [already rejected; see above]
Когда вы получаете подобный беспорядок в выводе решателя, вы, как правило, хотите найти самую глубокую -проблему с отступом и посмотреть, сможете ли вы ее исправить. В этом случае вы видите, что он не может установить gcc-c-runtime@5.4.0-5.12.0.0.0.115.0
, потому что он исключен установленным включением.
Может быть, нужно отступление. :что такое включение? Как и групповой пакет, это пакет, который в первую очередь предоставляет зависимости, в данном случае зависимости incorporate
. Эти зависимости никогда не приводят к установке пакетов; они просто накладывают ограничения на пакеты, которые могут быть установлены. В частности, включение foo@1.2
означает, что если foo
установлен, он должен быть в диапазоне версий [1.2, 1.3)
; то есть минимум1.2
(включительно )и максимум1.3
(исключая )или все, что соответствует 1.2.x.y.z....
.
В этом случаевключение userland-incorporation
, которое уже установлено в системе, наложило ограничение на gcc-c-runtime
, несовместимое с версией gcc-c-runtime
, которая требуется для установки gcc-c-5
.
Здесь мы сталкиваемся с одной из странностей оценочной программы Solaris FOSS. Доступные там пакеты плохо интегрированы с остальной системой; они предназначены для установки в более новой версии Solaris. Но они были построены таким образом, что система может, по крайней мере, разумно настроиться на их установку. В этом случае вам придется изменить несколько граней.
Большинство пакетов СОПО в Solaris встроены таким образом, что ограничение, налагаемое этой incorporate
зависимостью, может быть ослаблено. Вы можете сделать это, изменив фасет с именем version-lock.<pkg-name>
на false
. В этом случае gcc-c-runtime
и gcc-c++-runtime
— это два пакета, блокирующие установку, которую вы хотите установить, поэтому (, как указано выше ):
# pkg change-facet \
version-lock.system/library/gcc/gcc-c-runtime=false \
version-lock.system/library/gcc/gcc-c++-runtime=false
Это даст немного результата, но, по-видимому, мало что даст. Однако, как только это будет сделано, мы можем попробовать еще раз:
# pkg install -nv gcc-5 gcc-c-5
Packages to install: 20
Packages to update: 2
Mediators to change: 1
Services to change: 1
Estimated space available: 8.54 GB
Estimated space to be consumed: 1.49 GB
Create boot environment: No
Create backup boot environment: Yes
Rebuild boot archive: No
Changed mediators:
mediator gcc:
version: None -> 5 (system default)
Changed packages:
solaris
developer/assembler
None -> 0.5.11,5.11-0.175.3.9.0.2.0:20160528T012706Z
developer/gcc-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T170530Z
developer/gcc/gcc-c++-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T164822Z
developer/gcc/gcc-c-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165027Z
developer/gcc/gcc-common-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165220Z
developer/gcc/gcc-gfortran-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165431Z
developer/gcc/gcc-gobjc-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165624Z
developer/gnu-binutils
None -> 2.23.1,5.11-0.175.3.0.0.30.0:20150821T164528Z
library/gmp
None -> 4.3.2,5.11-0.175.3.0.0.30.0:20150821T165358Z
library/isl
None -> 0.12.2,5.12-5.12.0.0.0.115.0:20170111T171737Z
library/mpc
None -> 0.9,5.11-0.175.3.0.0.30.0:20150821T165558Z
library/mpfr
None -> 2.4.2,5.11-0.175.3.0.0.30.0:20150821T165559Z
release/evaluation
None -> 1.0,5.12-5.12.0.0.0.115.0:20170111T175931Z
system/header
None -> 0.5.11,5.11-0.175.3.19.0.2.0:20170328T014052Z
system/library/gcc/gcc-c++-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181800Z
system/library/gcc/gcc-c-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181840Z
system/library/gcc/gcc-gfortran-runtime
None -> 4.8.2,5.11-0.175.3.0.0.30.0:20150821T172507Z
system/library/gcc/gcc-gfortran-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181902Z
system/library/gcc/gcc-gobjc-runtime
None -> 4.8.2,5.11-0.175.3.0.0.30.0:20150821T172513Z
system/library/gcc/gcc-gobjc-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181919Z
system/library/gcc/gcc-c++-runtime
4.8.2,5.11-0.175.3.0.0.30.0:20150821T172447Z -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181825Z
system/library/gcc/gcc-c-runtime
4.8.2,5.11-0.175.3.0.0.30.0:20150821T172458Z -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181848Z
И вуаля, мы получаем кучу установленных пакетов, которые на самом деле что-то содержат. Теперь вы сможете набрать gcc --version
и увидеть, что это действительно 5.4.0. Также обратите внимание, что два пакета, аспекты которых мы разблокировали, были обновлены, и эта возможность доступна после разблокировки.
Вы можете спросить, почему нам не нужно было открывать какие-либо другие грани. Причина этого в том, что в Solaris 11.3 не было GCC 5, а значит, не было никаких ограничений на версии его пакетов. Таким образом, все пакеты gcc-*-5
уже не ограничены, и их не нужно разблокировать, чтобы ослабить ограничения.
Вы могли заметить, что пакеты gcc-gfortran-runtime
и gcc-gobjc-runtime
были установлены в их версиях 4.8. Это потому, что они все еще ограничены, но ничто из того, что мы делали, не противоречило этим ограничениям. Для согласованности вам, вероятно, также следует разблокировать их, а затем обновить до версии 5.x (или,если вы зашли так далеко, прежде чем пытаться что-либо сделать, просто разблокируйте их с самого начала ).
Если ошибка OSError полностью возвращается к вашему коду, перехватите ее и повторите попытку. Если нет, убедитесь, что файл существует непосредственно перед вызовом Matlab. Если Matlab работает часами, не возвращаясь к вам, рассмотрите возможность исправления этого файла с помощью цикла повторных попыток. Источник тут же, вы можете редактировать его, если у вас есть достаточные права.