nix setupHook和一些tips

之前已经写过一篇关于nix的配置相关的博客,这次是再一次遇到了新的问题,而对setupHook进一步理解后写出的。主要针对NIX_CFLAGS_COMPILEcc-wrapper等内建的hook进行了一次理解。问题首先为成两个主要部分。

  1. cc-wrapper是何时被调用的,在cc-wrapper的setup-hook里没有调用到cc-wrapper,且stdenv/setup.sh内也不存在setup-hook以外的特殊脚本调用。
  2. setup-hook内,以及各种build-support内,没有任何对NIX_CFLAGS_COMPILE进行配置的地方,在nixpkgs也是同样(除了部分configure等有兼容性问题的地方)。那么nix是如何使用这个变量,而又不去设置CFLAGS等变量的(其实有点剧透了,因为最初的想法应该是何时把NIX_CFLAGS_COMPILE传过去的)。

这两个问题其实是同样的,因为都是wrapper的内容。这两个问题之外,就是一些小细节了。

nixpkgs configre与build相关思考

问题主要在于nixpkgs的mkDerivate都干了些什么,为什么可以自动处理cmake等构建。以及在最近,nix使用placeholder "out"来代替了$out。不知道这里的原因。

最近突然想到nix的包一些原理,有点好奇就去看文档,但nix一套的manual太过于简单了,同时部分内容编写有点混乱,或者说比较难查到想查的东西。比如override和callPackage需要看pill才能理解,而pills里写的内容又非常有限。而setup-hook的选项和和一些内建的setup-hook是分放在不同的两个章节且没有跳转或说明。

类型类、逻辑与哲学

起因

之前因为作业,写一个多项式计算的实现(来自课《计算机代数基础》,教材料《Ideals, Varieties and Algorithms》)。其实遇到了些问题,在data构建中,传入了太多子类型的参数,又将操作类型类化,导致实例化时出现了编译不通过(主要为无法deduce),根本原因在于对于一个forall的返回值类型,在其它函数中调用时,如果存在约束条件,是无法duduce的。哪怕不是约束,只要存在一定的类型限制就是不行的。这其中查找了相当的内容,也有解决方案,但并没有直接去修正。这源于我对类型类的一些理解问题。