<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>El hilo del laberinto (Publicaciones sobre ccache)</title><link>https://blog.jcea.es/</link><description></description><atom:link href="https://blog.jcea.es/categories/ccache.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><lastBuildDate>Fri, 26 Jun 2026 01:07:58 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Compilar una versión más moderna de "Bind" que la disponible en PkgSrc para SmartOS</title><link>https://blog.jcea.es/posts/20230317-pkgsrc_bind.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;En &lt;a class="reference external" href="https://blog.jcea.es/posts/20221111-pkgsrc_bind.html"&gt;Compilar "Bind" en PkgSrc para SmartOS con la opción de "dnstap"&lt;/a&gt; describo cómo &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilar&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/BIND"&gt;Bind&lt;/a&gt; en
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;  con soporte &lt;a class="reference external" href="https://dnstap.info/"&gt;dnstap&lt;/a&gt;, utilizando &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;. Por favor, lee
dicho artículo para entender qué estoy haciendo y por qué.&lt;/p&gt;
&lt;p&gt;El principal problema en ese artículo es que estoy utilizando la
versión &lt;em&gt;trunk&lt;/em&gt; de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; para beneficiarme de una versión más
moderna de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/BIND"&gt;Bind&lt;/a&gt;, pero eso implica que la versión &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilada&lt;/a&gt;
utiliza &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Biblioteca_(inform%C3%A1tica)"&gt;bibliotecas&lt;/a&gt; no disponibles en la
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Paquete_de_software"&gt;paquetería&lt;/a&gt; estándar de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; y tenemos que &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilarlas&lt;/a&gt;,
distribuirlas e instalarlas a mano.&lt;/p&gt;
&lt;p&gt;Si en vez de utilizar la versión &lt;em&gt;trunk&lt;/em&gt; de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; utilizamos la
versión que se corresponda a la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;Zona&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; en la que vamos a
instalar &lt;a class="reference external" href="https://es.wikipedia.org/wiki/BIND"&gt;Bind&lt;/a&gt;, no necesitaremos hacer nada especial con las
dependencias.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Nota&lt;/p&gt;
&lt;p class="last"&gt;Para lo que sigue nos conviente conocer la filosofía de
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;: En &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;, de forma automática, se descarga una
versión concreta del código fuente que queremos &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilar&lt;/a&gt;, se
verifica su &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Funci%C3%B3n_hash"&gt;hash&lt;/a&gt; para asegurarnos de que es la versión
correcta y no nos están colando gato por liebre, se le aplican
una serie de parches locales, que es lo que se mantiene en
realidad en &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;, se &lt;a class="reference external" href="https://blog.jcea.es/posts/compilador"&gt;compila&lt;/a&gt; y se genera un
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Paquete_de_software"&gt;paquete&lt;/a&gt;. Esta gestión separada del &lt;a class="reference external" href="https://es.wikipedia.org/wiki/C%C3%B3digo_fuente"&gt;código fuente&lt;/a&gt; original y
los parches locales que necesitamos en nuestro sistema es la
piedra angular de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;. Permite, por ejemplo, que no se
requiera colaboración por parte de los autores originales de
los programas para que soporten nuestro &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Sistema_operativo"&gt;sistema operativo&lt;/a&gt;.
Esto va como anillo al dedo con &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;, porque no podemos
contar con que nadie ajeno le de mimos y cuide de él.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Los cambios respecto a &lt;a class="reference external" href="https://blog.jcea.es/posts/20221111-pkgsrc_bind.html"&gt;Compilar "Bind" en PkgSrc para SmartOS con la opción de "dnstap"&lt;/a&gt;, serán:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Usamos una &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; nativa &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; con la versión del software
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; que se corresponda a las zonas nativas &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; donde
vamos a instalar el &lt;a class="reference external" href="https://es.wikipedia.org/wiki/BIND"&gt;Bind&lt;/a&gt; que &lt;a class="reference external" href="https://blog.jcea.es/posts/compilador"&gt;compilamos&lt;/a&gt;, en
vez de la versión &lt;em&gt;trunk&lt;/em&gt; de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_30d4c65f0fbb48f282aa559fce8ff6e3-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;[root@xXx ~]#&lt;/span&gt; imgadm avail&lt;span class="p"&gt;|&lt;/span&gt;grep -i pkgbuild-lts
&lt;a name="rest_code_30d4c65f0fbb48f282aa559fce8ff6e3-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;188ee9ce-540a-11eb-9cc1-2748cd10e5e2  pkgbuild-lts                    20.4.0        smartos  zone-dataset  2021-01-11&lt;/span&gt;
&lt;a name="rest_code_30d4c65f0fbb48f282aa559fce8ff6e3-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;bd5afd7a-7ec1-11ec-80ab-7b01241031f6  pkgbuild-lts                    21.4.0        smartos  zone-dataset  2022-01-26&lt;/span&gt;
&lt;a name="rest_code_30d4c65f0fbb48f282aa559fce8ff6e3-4"&gt;&lt;/a&gt;&lt;span class="go"&gt;758a4572-911d-11ed-b841-00151714048c  pkgbuild-lts                    22.4.0        smartos  zone-dataset  2023-01-10&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Queremos &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilar&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/BIND"&gt;Bind&lt;/a&gt; para utilizarlo en una zona
22.4.0, así que importamos esa versión de &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; y la
desplegamos en una &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; de nuestra máquina &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Entramos en la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; por &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Secure_Shell"&gt;SSH&lt;/a&gt; y le pedimos que cree un
entorno virtual de &lt;a class="reference external" href="https://blog.jcea.es/posts/compilador"&gt;compilación&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;[root@PkgSrc ~]#&lt;/span&gt; run-sandbox 2022Q4-x86_64
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;It looks like this is the first sandbox creation for this pkgbuild.  It&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-4"&gt;&lt;/a&gt;&lt;span class="go"&gt;will take longer than normal, as support packages need to be downloaded&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;first.  Subsequent runs will be much faster after they have been cached.&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-7"&gt;&lt;/a&gt;&lt;span class="go"&gt;[...]&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-9"&gt;&lt;/a&gt;&lt;span class="go"&gt;Unpacking bootstrap-2022Q4-x86_64 into /data/chroot/dev-2022Q4-x86_64...done.&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-10"&gt;&lt;/a&gt;&lt;span class="go"&gt;Setting up environment...done.&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-11"&gt;&lt;/a&gt;&lt;span class="go"&gt;Installing additional tools packages...done.&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-12"&gt;&lt;/a&gt;&lt;span class="go"&gt;Logging in.  WARNING: On logout the sandbox will be destroyed.&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-13"&gt;&lt;/a&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-14"&gt;&lt;/a&gt;&lt;span class="go"&gt;,---.                   |     ,---. ,---.&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-15"&gt;&lt;/a&gt;&lt;span class="go"&gt;`---. ,-.-. ,---. ,---. |---  |   | `---.  pkgbuild-lts&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-16"&gt;&lt;/a&gt;&lt;span class="go"&gt;    | | | | ,---| |     |     |   |     |  22.4.0&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-17"&gt;&lt;/a&gt;&lt;span class="go"&gt;`---' ` ' ' `---' `     `---' `---' `---'&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-18"&gt;&lt;/a&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-19"&gt;&lt;/a&gt;&lt;span class="go"&gt;--&amp;lt;root@PkgSrc&amp;gt;-(/data/chroot/dev-2022Q4-x86_64)-&amp;lt;~&amp;gt;--&lt;/span&gt;
&lt;a name="rest_code_cb769ffe105c4da6b3210b0f1d81e30f-20"&gt;&lt;/a&gt;&lt;span class="go"&gt;-&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Obsérvese que le estamos pidiendo un entorno de &lt;a class="reference external" href="https://blog.jcea.es/posts/compilador"&gt;compilación&lt;/a&gt;
&lt;span class="kbd"&gt;2022Q4-x86_64&lt;/span&gt;. En teoría las &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zonas&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; modernas
pueden compilar código para versiones más antiguas de las
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zonas&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;, solicitando la creación del entorno de
&lt;a class="reference external" href="https://blog.jcea.es/posts/compilador"&gt;compilación&lt;/a&gt; adecuado.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://blog.jcea.es/posts/20230317-pkgsrc_bind.html"&gt;Leer más…&lt;/a&gt; (quedan 4 minutos de lectura)&lt;/p&gt;&lt;/div&gt;</description><category>BIND</category><category>ccache</category><category>dnstap</category><category>pkgsrc</category><category>SmartOS</category><guid>https://blog.jcea.es/posts/20230317-pkgsrc_bind.html</guid><pubDate>Fri, 17 Mar 2023 22:52:00 GMT</pubDate></item><item><title>Cómo usar "ccache" para compilar en PkgSrc de SmartOS (II)</title><link>https://blog.jcea.es/posts/20230123-pkgsrc_ccache.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;En &lt;a class="reference external" href="https://blog.jcea.es/posts/20220721-pkgsrc_ccache.html"&gt;Cómo usar "ccache" para compilar en PkgSrc de SmartOS&lt;/a&gt; explico cómo utilizar &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; a
la hora de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilar&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Paquete_de_software"&gt;paquetes&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ahí propongo realizar un cambio en el fichero
&lt;span class="kbd"&gt;/data/pkgbuild/scripts/run-sandbox&lt;/span&gt; &lt;a class="footnote-reference" href="https://blog.jcea.es/posts/20230123-pkgsrc_ccache.html#ansible2" id="id1"&gt;[1]&lt;/a&gt; para añadir
lo siguiente al fichero &lt;span class="kbd"&gt;.bashrc&lt;/span&gt; del entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Ver el comentario en
# https://wiki.netbsd.org/tutorials/pkgsrc/build_ccache_distcc/
export CCACHE_DIR=/root/.ccache/
export PKGSRC_COMPILER=ccache gcc
&lt;/pre&gt;
&lt;p&gt;La segunda línea no funciona correctamente en &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; porque ahí
el fichero &lt;span class="kbd"&gt;/opt/local/etc/mk.conf&lt;/span&gt; dentro del entorno
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt; ignora la &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Variable_de_entorno"&gt;variable de entorno&lt;/a&gt; &lt;span class="kbd"&gt;PKGSRC_COMPILER&lt;/span&gt; y
fuerza un valor explícito de &lt;span class="kbd"&gt;PKGSRC_COMPILER=gcc&lt;/span&gt; a la hora
de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por tanto, lo mejor es cambiar el fichero
&lt;span class="kbd"&gt;/data/pkgbuild/scripts/run-sandbox&lt;/span&gt; &lt;a class="footnote-reference" href="https://blog.jcea.es/posts/20230123-pkgsrc_ccache.html#ansible2" id="id2"&gt;[1]&lt;/a&gt; para que
modifique ese fichero a la hora de crear el entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;. Sería
cuestión de añadirle una línea como esta poco antes del final del
fichero:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sed -i "s/^PKGSRC_COMPILER=/PKGSRC_COMPILER?=/g" ${chrootdir}${PKGBUILD_SYSCONFDIR}/mk.conf
&lt;/pre&gt;
&lt;p&gt;Ese cambio en el fichero &lt;span class="kbd"&gt;/opt/local/etc/mk.conf&lt;/span&gt; dentro del
entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt; mantiene la definición por defecto de
&lt;span class="kbd"&gt;PKGSRC_COMPILER&lt;/span&gt; cuando no le hemos puesto un valor concreto
por &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Variable_de_entorno"&gt;variable de entorno&lt;/a&gt;, pero la &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Variable_de_entorno"&gt;variable de entorno&lt;/a&gt; manda
si existe. Así debería venir de serie en &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;. Usando
expansiones &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Shell_de_Unix"&gt;shell&lt;/a&gt;, modificamos el fichero correcto sea cual sea
el &lt;em&gt;branch&lt;/em&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; que estamos utilizando para generar el entorno
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Además, el &lt;span class="kbd"&gt;export&lt;/span&gt; estaba mal. Hay que poner el valor entre
comillas. Por ejemplo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
export PKGSRC_COMPILER="ccache gcc"
&lt;/pre&gt;
&lt;table class="docutils footnote" frame="void" id="ansible2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;[1]&lt;/td&gt;&lt;td&gt;&lt;em&gt;(&lt;a class="fn-backref" href="https://blog.jcea.es/posts/20230123-pkgsrc_ccache.html#id1"&gt;1&lt;/a&gt;, &lt;a class="fn-backref" href="https://blog.jcea.es/posts/20230123-pkgsrc_ccache.html#id2"&gt;2&lt;/a&gt;)&lt;/em&gt; Para estos cambios utilizo &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Ansible"&gt;Ansible&lt;/a&gt;. No los hago a mano, que
sería un coñazo cada vez que reprovisiono la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;</description><category>ccache</category><category>pkgsrc</category><category>SmartOS</category><guid>https://blog.jcea.es/posts/20230123-pkgsrc_ccache.html</guid><pubDate>Mon, 23 Jan 2023 22:34:00 GMT</pubDate></item><item><title>"ccache" persistente en el PkgSrc de SmartOS</title><link>https://blog.jcea.es/posts/20220824-pkgsrc_ccache.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;En &lt;a class="reference external" href="https://blog.jcea.es/posts/20220721-pkgsrc_ccache.html"&gt;Cómo usar "ccache" para compilar en PkgSrc de SmartOS&lt;/a&gt; describo cómo configurar el
entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; para que utilice &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; y así
beneficiarnos de una mayor velocidad de recompilación.&lt;/p&gt;
&lt;p&gt;El problema que tenemos es que la &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)"&gt;caché&lt;/a&gt; de &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; se guarda
dentro del entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt; y esto tiene dos efectos:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;No podemos beneficiarnos del uso de &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; entre dos
&lt;em&gt;branches&lt;/em&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; diferentes, algo que uso con frecuencia en
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Cuando cerramos en entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;, este se destruye. Esto
elimina también la &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)"&gt;caché&lt;/a&gt; de &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cuando estoy trabajando en un proyecto largo, es común que lance
el entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt; de forma pesistente dentro de una sesión
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Screen"&gt;screen&lt;/a&gt;, por lo que puede sobrevivir a lo largo de varias jornadas
de trabajo, pero al terminar la tarea la cerraré y perderé la
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)"&gt;caché&lt;/a&gt; del &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lo ideal sería que la &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)"&gt;caché&lt;/a&gt; &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; se almacenase fuera del
entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;. Eso se puede hacer con facilidad de esta manera
&lt;a class="footnote-reference" href="https://blog.jcea.es/posts/20220824-pkgsrc_ccache.html#ansible2" id="id1"&gt;[1]&lt;/a&gt;:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Creamos un directorio &lt;span class="kbd"&gt;/root/.chroot/&lt;/span&gt; en la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt;
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Editamos los ficheros &lt;span class="kbd"&gt;/data/pkgbuild/scripts/mksandbox&lt;/span&gt; y
&lt;span class="kbd"&gt;/data/pkgbuild/scripts/rmsandbox&lt;/span&gt;, buscamos la línea que
pone &lt;span class="kbd"&gt;for mount in ${LOFS_RW_MOUNTS}; do&lt;/span&gt; y la cambiamos
por lo siguiente: &lt;span class="kbd"&gt;for mount in ${LOFS_RW_MOUNTS}
"/root/.ccache=/root/.ccache"; do&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Lo que estamos haciendo es añadir un &lt;em&gt;loopback&lt;/em&gt; hacia
&lt;span class="kbd"&gt;/root/.ccache&lt;/span&gt; a la hora de crear el entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt; y
desmontarlo a la hora de destruirlo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;De esta manera, los usos de &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; dentro de los diferentes
entornos &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt; utilizarán todos la misma &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)"&gt;caché&lt;/a&gt; y esta es
persistente e independiente de la existencia de dichos entornos
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;.&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="ansible2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="https://blog.jcea.es/posts/20220824-pkgsrc_ccache.html#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Para estos cambios utilizo &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Ansible"&gt;Ansible&lt;/a&gt;. No los hago a mano, que
sería un coñazo cada vez que reprovisiono la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;</description><category>ccache</category><category>pkgsrc</category><category>SmartOS</category><guid>https://blog.jcea.es/posts/20220824-pkgsrc_ccache.html</guid><pubDate>Wed, 24 Aug 2022 15:37:00 GMT</pubDate></item><item><title>Cómo usar "ccache" para compilar en PkgSrc de SmartOS</title><link>https://blog.jcea.es/posts/20220721-pkgsrc_ccache.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;Utilizo muy frecuentemente el entorno de compilación &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; para
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; y voy personalizándolo poco a poco para mejorar mi
experiencia y ajustarlo mejor a mi forma de trabajar.&lt;/p&gt;
&lt;p&gt;Estudiando la documentación de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;, me encuentro un capítulo
interesante: &lt;a class="reference external" href="https://wiki.netbsd.org/tutorials/pkgsrc/build_ccache_distcc/"&gt;Speeding up pkgsrc builds with ccache and distcc&lt;/a&gt;.
Yo utilizo &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; en muchos de mis entornos y poder utilizarlo
también en &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt; me resulta atractivo.&lt;/p&gt;
&lt;p&gt;Los pasos descritos en esa web son generales para &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Pkgsrc"&gt;PkgSrc&lt;/a&gt;, pero,
en el caso concreto de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;, sus actualizaciones trimestrales,
su entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;, etc, encuentro más fácil meter esos cambios
como variables de entorno que modificar ficheros de configuración
(tendría que cambiar un fichero en cada uno de los &lt;em&gt;branches&lt;/em&gt; que
utilizo). Una forma simple de hacerlo en &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt; es modificar el
fichero &lt;span class="kbd"&gt;/data/pkgbuild/scripts/run-sandbox&lt;/span&gt; &lt;a class="footnote-reference" href="https://blog.jcea.es/posts/20220721-pkgsrc_ccache.html#ansible2" id="id1"&gt;[1]&lt;/a&gt; y
añadirle lo siguiente en la creación del fichero &lt;span class="kbd"&gt;.bashrc&lt;/span&gt;
para el entorno &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Chroot"&gt;chroot&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Ver el comentario en
# https://wiki.netbsd.org/tutorials/pkgsrc/build_ccache_distcc/
export CCACHE_DIR=/root/.ccache/
export PKGSRC_COMPILER=ccache gcc
&lt;/pre&gt;
&lt;p&gt;Obsérvese el detalle de definir &lt;span class="kbd"&gt;CCACHE_DIR&lt;/span&gt; de forma
explícita. La razón se explica en el comentario de &lt;a class="reference external" href="https://wiki.netbsd.org/tutorials/pkgsrc/build_ccache_distcc/"&gt;Speeding up
pkgsrc builds with ccache and distcc&lt;/a&gt;
que, resumiendo, indica que si no se hace así, cada compilación
utiliza una &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)"&gt;caché&lt;/a&gt; separada y, por tanto, no se reutiliza y no
sirve de nada.&lt;/p&gt;
&lt;p&gt;Con estos cambios, cuando intentemos compilar algo, se instalará
&lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; y se utilizará automáticamente.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="first admonition-title"&gt;Advertencia&lt;/p&gt;
&lt;p&gt;Por algún motivo, la primera vez que compilamos algo con esta
configuración nos va a salir el siguiente error:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
checking for x86_64-sun-solaris2.11-gcc... gcc
checking whether the C compiler works... no
configure: error: C compiler cannot create executables
See `config.log' for more details
*** Error code 77
&lt;/pre&gt;
&lt;p&gt;Haciendo &lt;span class="kbd"&gt;bmake clean&lt;/span&gt; y volviéndolo a intentar, ya
funciona bien.&lt;/p&gt;
&lt;p class="last"&gt;Esto es algo a estudiar en el futuro.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;¿Cuánto ganamos utilizando &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt;? El efecto se nota más cuanto
más larga es la compilación:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="38%"&gt;
&lt;col width="31%"&gt;
&lt;col width="31%"&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;
&lt;td&gt;normal&lt;/td&gt;
&lt;td&gt;ccache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Apache&lt;/td&gt;
&lt;td&gt;1:29&lt;/td&gt;
&lt;td&gt;0:49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;tor&lt;/td&gt;
&lt;td&gt;3:25&lt;/td&gt;
&lt;td&gt;1:02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;python39&lt;/td&gt;
&lt;td&gt;6:02&lt;/td&gt;
&lt;td&gt;1:36&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="ansible2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="https://blog.jcea.es/posts/20220721-pkgsrc_ccache.html#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Para estos cambios utilizo &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Ansible"&gt;Ansible&lt;/a&gt;. No los hago a mano, que
sería un coñazo cada vez que reprovisiono la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; &lt;a class="reference external" href="https://es.wikipedia.org/wiki/SmartOS"&gt;SmartOS&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Actualización 20220824:&lt;/strong&gt; Tal vez te interese leer
&lt;a class="reference external" href="https://blog.jcea.es/posts/20220824-pkgsrc_ccache.html"&gt;"ccache" persistente en el PkgSrc de SmartOS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actualización 20230123:&lt;/strong&gt; Más sobre este tema en
&lt;a class="reference external" href="https://blog.jcea.es/posts/20230123-pkgsrc_ccache.html"&gt;Cómo usar "ccache" para compilar en PkgSrc de SmartOS (II)&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</description><category>ccache</category><category>pkgsrc</category><category>SmartOS</category><guid>https://blog.jcea.es/posts/20220721-pkgsrc_ccache.html</guid><pubDate>Thu, 21 Jul 2022 13:54:00 GMT</pubDate></item><item><title>Ccache o cómo recompilar rápido y sin dolor</title><link>https://blog.jcea.es/posts/20180811-ccache.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;En &lt;a class="reference external" href="https://blog.jcea.es/posts/20180716-compilar_kodi.html"&gt;Recompila tu propio Kodi&lt;/a&gt; explico de pasada que el proyecto
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Kodi"&gt;Kodi&lt;/a&gt; utiliza &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; &lt;a class="footnote-reference" href="https://blog.jcea.es/posts/20180811-ccache.html#meaning" id="id1"&gt;[1]&lt;/a&gt; si está disponible en el sistema.&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="meaning" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label"&gt;&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="https://blog.jcea.es/posts/20180811-ccache.html#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://ccache.dev/"&gt;Ccache&lt;/a&gt; significa &lt;em&gt;"Compiler Cache"&lt;/em&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a class="reference external" href="https://ccache.dev/"&gt;Ccache&lt;/a&gt; intercepta las llamadas al &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilador&lt;/a&gt; de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n)"&gt;C&lt;/a&gt; y &lt;a class="reference external" href="https://es.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;.
&lt;a class="reference external" href="https://ccache.dev/"&gt;Ccache&lt;/a&gt; comprueba sus ficheros de entrada expandidos (con las
sustituciones de macros, variables de entorno, &lt;em&gt;includes&lt;/em&gt; y demás
ya sustituidos) y comprueba si ya tiene en su &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cache"&gt;caché&lt;/a&gt; el fichero
resultante de aplicar ese comando a esos ficheros de entrada. Si
no es así, ejecuta el comando y se guarda una copia del resultado
en su &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cache"&gt;caché&lt;/a&gt;. Si ya teníamos el resultado en &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Cache"&gt;caché&lt;/a&gt;, nos ahorramos
ejecutar el comando y &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; proporciona el resultado
directamente.&lt;/p&gt;
&lt;p&gt;Dado que &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Compilador"&gt;compilar&lt;/a&gt; un fichero es un proceso costoso, poder
ahorrárselo si no hay cambios respecto a una compilación anterior
resulta muy conveniente.&lt;/p&gt;
&lt;p&gt;Por ejemplo, &lt;a class="reference external" href="https://blog.jcea.es/posts/20180716-compilar_kodi.html"&gt;compilar Kodi&lt;/a&gt;
entero, pero teniendo una compilación previa relativamente
cercana, necesita 36 minutos en mi portátil (viejo y cargado de
actividad, eso sí). Compilarlo desde cero sin &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; necesita
casi toda una jornada laboral.&lt;/p&gt;
&lt;p&gt;Las estadísticas de &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt; tras este proceso son interesantes:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.jcea.es/posts/20180811-ccache.html"&gt;Leer más…&lt;/a&gt; (quedan 6 minutos de lectura)&lt;/p&gt;&lt;/div&gt;</description><category>ccache</category><category>Herramientas</category><guid>https://blog.jcea.es/posts/20180811-ccache.html</guid><pubDate>Sat, 11 Aug 2018 18:18:00 GMT</pubDate></item><item><title>Recompila tu propio Kodi</title><link>https://blog.jcea.es/posts/20180716-compilar_kodi.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;Toco bastante el código, así que la distribución precompilada de
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Kodi"&gt;Kodi&lt;/a&gt; no me sirve. Para compilar &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Kodi"&gt;Kodi&lt;/a&gt; por mi cuenta, hago lo
siguiente:&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_704678bad6fc4d93a50c97ceebabf624-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt;  ~/hg/kodi/
&lt;a name="rest_code_704678bad6fc4d93a50c97ceebabf624-2"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; git fetch
&lt;a name="rest_code_704678bad6fc4d93a50c97ceebabf624-3"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; git checkout RAMA_QUE_NOS_INTERESA
&lt;a name="rest_code_704678bad6fc4d93a50c97ceebabf624-4"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; mkdir /tmp/kodi&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/kodi
&lt;a name="rest_code_704678bad6fc4d93a50c97ceebabf624-5"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; cmake ~/hg/kodi/ -DCMAKE_INSTALL_PREFIX&lt;span class="o"&gt;=&lt;/span&gt;/home/jcea/.kodi/
&lt;a name="rest_code_704678bad6fc4d93a50c97ceebabf624-6"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; cmake --build . -- &lt;span class="nv"&gt;VERBOSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; -j&lt;span class="k"&gt;$(&lt;/span&gt;getconf _NPROCESSORS_ONLN&lt;span class="k"&gt;)&lt;/span&gt;
&lt;a name="rest_code_704678bad6fc4d93a50c97ceebabf624-7"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; make install
&lt;/pre&gt;&lt;p&gt;Estas instrucciones descargan el código de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Kodi"&gt;Kodi&lt;/a&gt;, lo compilan y lo
instalan.&lt;/p&gt;
&lt;p&gt;Obsérvese el uso de &lt;span class="kbd"&gt;getconf _NPROCESSORS_ONLN&lt;/span&gt; para obtener
el número de procesadores en el ordenador y, de esta forma,
aprovecharlos todos.&lt;/p&gt;
&lt;p&gt;Un detalle muy interesante es que &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Kodi"&gt;Kodi&lt;/a&gt; utilizará &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt;, si lo
tenemos instalado. Esto permite reducir el tiempo de compilación
enormemente. Escribiré sobre esto en un artículo futuro.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actualización 20180811:&lt;/strong&gt; He escrito un artículo sobre &lt;a class="reference external" href="https://ccache.dev/"&gt;ccache&lt;/a&gt;:
&lt;a class="reference external" href="https://blog.jcea.es/posts/20180811-ccache.html"&gt;Ccache o cómo recompilar rápido y sin dolor&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</description><category>ccache</category><category>Kodi</category><guid>https://blog.jcea.es/posts/20180716-compilar_kodi.html</guid><pubDate>Mon, 16 Jul 2018 17:58:00 GMT</pubDate></item></channel></rss>