<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Desert Zarzamora &#187; Linux</title>
	<atom:link href="http://zarzamora.com.mx/tags/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://zarzamora.com.mx</link>
	<description>However, there is no real definition of a desert.</description>
	<lastBuildDate>Mon, 21 Jun 2010 18:08:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Firewire: calientito del infierno a tu escritorio [1/2]</title>
		<link>http://zarzamora.com.mx/archivo-historico/1003</link>
		<comments>http://zarzamora.com.mx/archivo-historico/1003#comments</comments>
		<pubDate>Sat, 06 Mar 2010 03:48:04 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[capture]]></category>
		<category><![CDATA[dc1394]]></category>
		<category><![CDATA[dc1394-22]]></category>
		<category><![CDATA[firewire]]></category>
		<category><![CDATA[framegrabber]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=1003</guid>
		<description><![CDATA[He aqui, un mortal que pretende pasar de modo amateur a modo profesional intentando hacer un framegrabber firewire usando libdc1394 version 2 (libdc1394-22) en Linux. Todo funciona maravillosamente al principio &#8212; si es que asi se le puede llamar a este calvario &#8211;, se hace con penurias un grabber para la camara que está conectada [...]]]></description>
			<content:encoded><![CDATA[<p>He aqui, un mortal que pretende pasar de modo amateur a modo profesional intentando hacer un framegrabber firewire usando libdc1394 version 2 (libdc1394-22) en Linux. Todo funciona maravillosamente al principio &#8212; si es que asi se le puede llamar a este calvario &#8211;, se hace con penurias un grabber para la camara que está conectada con un cable de 1.5m a la PC. Y funciona. De hecho una vez que funciona funciona maravillosamente, te entrega frames sin compresión a alta velocidad.</p>
<p>Pero como dije, debo pasar del modo amateur, al modo PRO (pro-fe-sio-nal). Lo cual implica dejarse de tonterias y comenzar a usar <a href="http://www.ptgrey.com/index.asp">cámaras decentes</a>. Y poner todo el <a href="http://en.wikipedia.org/wiki/Industrial_PC">equipo</a> de procesamiento de <a href="http://en.wikipedia.org/wiki/Bayer_filter">imágenes</a> en un <a href="http://en.wikipedia.org/wiki/19-inch_rack">server-room</a>, a una distancia prudente. En una instalación profesional lo único que queda expuesto es lo estrictamente necesario, el resto está profesionalmente instalado en un rack, en un cuarto seguro y con aire acondicionado.</p>
<p>Lo anterior choca directamente con los 4.5 metros de distancia máxima de una cámara Firewire (USB tiene el mismo problema). Entonces se comienza a usar equipo para extensión firewire. Se adquiere equipo extensor firewire de alta calidad, como los que hace Kramer. Y repentinamente la aplicacion hace <em>segfaults</em>, simplemente no se puede abrir la cámara.</p>
<ul>
<li>¿El extender esta dañado?  No porque es nuevo, y los otros 4 pares de extenders nuevos tampoco sirven.</li>
<li>¿El cable es de baja calidad?  Compramos una bobina de CAT6 blindado, y aún no funciona.</li>
<li>¿Los cables firewire estan mal?  Los 10 cables probados son nuevos, y con recubrimiento de oro, asi que no.</li>
<li>¿Las cámaras estan dañadas? TODAS camaras funcionan directo, pero no con extenders</li>
<li>¿Alguna otra cámara sirve? Sospechosamente las cámaras baratas no-pro sí sirven.</li>
</ul>
<p>¿Que sucede?</p>
<p><em>Continuará&#8230;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/1003/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desktop Linux en el banco, una realidad</title>
		<link>http://zarzamora.com.mx/archivo-historico/735</link>
		<comments>http://zarzamora.com.mx/archivo-historico/735#comments</comments>
		<pubDate>Fri, 03 Apr 2009 20:47:42 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[banco]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[os]]></category>
		<category><![CDATA[xfce]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=735</guid>
		<description><![CDATA[Hoy me toco ir a abrir una cuenta bancaria, asi que estuve forzado a salir e interactuar con la gente, principalmente la monita que me atendió en el banco y que era la encargada de apertura de nuevas cuentas relacionadas con partidas gubernamentales. Noté que la interfaz habia cambiado desde la ultima vez que fui [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy me toco ir a abrir una cuenta bancaria, asi que estuve forzado a salir e interactuar con la gente, principalmente la monita que me atendió en el banco y que era la encargada de apertura de nuevas cuentas relacionadas con partidas gubernamentales.</p>
<p>Noté que la interfaz habia cambiado desde la ultima vez que fui a ese banco a hacer algun movimiento. En una vez que volteo el monitor para que yo certificara ciertos datos noté el theme de su OS un tanto familiar. Era <span id="more-735"></span>el theme Crux que a continuacion se ve. Es un theme clasico y muy viejo recuerdo haberlo visto desde hace muchos años en los escritorios de Gnome, aun en estos dias viene en casi todas las distros de Linux.</p>
<p><img class="alignnone size-full wp-image-736" title="crux" src="http://zarzamora.com.mx/wp-content/uploads/2009/04/crux.png" alt="crux" width="669" height="539" /></p>
<p>Se me hizo raro ver un OS con theme, pero ya que el theme es software libre, pensé que podrian haberlo puesto en su Windows.También noté que su Ambiente de Escritorio sospechosamente se parecia a XFCE, aunque un tanto modificado y bloqueado en ciertos aspectos.</p>
<p>Minutos despues, se activó el screensaver, que era la pura pantalla negra. Luego cuando la fulana regresó y movio el ratón se vio la clásica pantalla de XScreensaver:</p>
<p><img class="alignnone" src="http://www.jwz.org/xscreensaver/screenshots/xanalogtv.jpg" alt="" width="382" height="286" /></p>
<p>Algo es seguro, esa compu ya no usaba Windows. Y a pesar que pudo haber usado Solaris, o algun otro clon de Unix, sospecho que usaba alguna distribucion de Linux ya que es el mejor soportado por empresas privadas y el mas popular (mas que los BSD, y Solaris). Pienso que la eleccion de Linux con XFCE pudo haberse hecho para lograr ahorros en equipo, ya que XFCE es un escritorio muy ligero. Y ahora que recuerdo, la compu que estaba usando no se veia muy nueva que digamos (CRT, floppy, eeek!!).</p>
<p>En definitiva, la ejecutiva no usaba windows  y por lo que vi, no se extrañaba de usar ese OS que le dieron y seguramente ella ni cuenta se daba que usaba Linux en lugar de Windows. Lo que si seguramente sabia era que con ese nuevo sistema ya no tiene que instalar antivirus, antispam, antispyware, antimalware, anti rootkits, anti adware, ni ninguno de esos miles de programitas que se instalan para mantener relativamente &#8220;seguro&#8221; a Windows.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/735/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CUDA + CMake para Kdevelop3 en Ubuntu 8.10</title>
		<link>http://zarzamora.com.mx/archivo-historico/719</link>
		<comments>http://zarzamora.com.mx/archivo-historico/719#comments</comments>
		<pubDate>Fri, 30 Jan 2009 00:03:00 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[cmake]]></category>
		<category><![CDATA[cuda]]></category>
		<category><![CDATA[nvidia]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=719</guid>
		<description><![CDATA[Un luego de varios meses ya con una tarjeta NVidia GTX280 que soporta CUDA, finalmente llegó el momento de usar CUDA, y la forma mas fácil para mi fue seguir usando KDevelop, (KDevelop3 + CUDA) usando el mismo procedmiento de siempre: CMake. CUDA puede compilarse de manera muy facil usando el addon de CMake llamado [...]]]></description>
			<content:encoded><![CDATA[<p>Un luego de <a href="http://zarzamora.com.mx/archivo-historico/453">varios meses ya con una tarjeta NVidia GTX280</a> que soporta CUDA, finalmente llegó el momento de usar CUDA, y la forma mas fácil para mi fue seguir usando KDevelop, (KDevelop3 + CUDA) usando el mismo procedmiento de siempre: CMake. CUDA puede compilarse de manera muy facil usando el addon de CMake llamado <a href="http://www.sci.utah.edu/~abe/FindCuda.html">Find.Cuda</a>. Sin embargo uno puede entrar en complicaciones si usa GCC 4.3. Nvidia no soporta CUDA + GCC4.3. Y ya que tengo que usar una maquina con Ubuntu 8.10 (Intrepid) y el Ubuntu trae GCC 4.3 la forma mas fácil es usar la version 4.1 que sí funciona. Hay que reemplazar el GCC:</p>
<pre>
<pre class="brush: bash">
# sudo apt-get install gcc-4.1
# sudo apt-get install g++-4.1
# cd /usr/bin
# sudo rm cpp gcc g++
# sudo ln -s cpp-4.1 cpp
# sudo ln -s gcc-4.1 gcc
# sudo ln -s g++-4.1 g++
</pre>
</pre>
<p>Y listo, ya compila todo lo del nvcc, yo usé la version de CUDA 2.1 para Ubuntu 8.04 porque la de 8.10 aún no sale. Y al final lo más facil es hacer lo siguiente para generar el proyecto de KDevelop3:</p>
<pre>
<pre class="brush: bash">
# cd build/
# cmake ../ -G KDevelop3
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/719/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webcam y eMeSeNe; reemplazando a aMSN y a Pidgin</title>
		<link>http://zarzamora.com.mx/archivo-historico/631</link>
		<comments>http://zarzamora.com.mx/archivo-historico/631#comments</comments>
		<pubDate>Mon, 15 Dec 2008 21:08:11 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[emesene]]></category>
		<category><![CDATA[messenger]]></category>
		<category><![CDATA[msn]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=631</guid>
		<description><![CDATA[Emesene tiene soporte de Webcam en el repositorio SVN desde hace mucho. Reemplaza al viejo (y feo)  aMSN y a Pidgin, la forma rápida es: $ svn co https://emesene.svn.sourceforge.net/svnroot/emesene/trunk/emesene emesene $ cd emesene $ ./emesene Y la forma larga, pero que deja instalado todo bien es: $ svn co https://emesene.svn.sourceforge.net/svnroot/emesene/trunk/emesene emesene $ cd emesene $ [...]]]></description>
			<content:encoded><![CDATA[<p>Emesene tiene soporte de Webcam en el repositorio SVN desde hace mucho. Reemplaza al viejo (y feo)  aMSN y a Pidgin, la forma rápida es:</p>
<p><code>
<pre class="brush: bash">$ svn co https://emesene.svn.sourceforge.net/svnroot/emesene/trunk/emesene emesene
$ cd emesene
$ ./emesene
</pre>
<p></code></p>
<p>Y la forma larga, pero que deja instalado todo bien es:</p>
<p><code>
<pre class="brush: bash">$ svn co https://emesene.svn.sourceforge.net/svnroot/emesene/trunk/emesene emesene
$ cd emesene
$ python setup.py build
$ sudo python setup.py install
$ exit
$ emesene
</pre>
<p></code></p>
<p>Emesene se integra mejor con Gnome pues está programado con Python GTK, a diferencia de aMSN que está programado con un toolkit viejo (Tcl/tk). Emesene tiene soporte de emoticons, emoticons personalizados, pizarra, zumbidos, MSN Plus y hasta Winks. La versión del Subversion ya tiene soporte de Webcam.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/631/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Enlazar una libreria con GCC</title>
		<link>http://zarzamora.com.mx/archivo-historico/622</link>
		<comments>http://zarzamora.com.mx/archivo-historico/622#comments</comments>
		<pubDate>Sun, 09 Nov 2008 22:51:04 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[enlazar]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[libreria]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=622</guid>
		<description><![CDATA[El problema: Tienes librerias personales que tú mismo creaste, o bien librerías sin instalar que no estan en /usr/lib sino en otros directorios raros y quieres enlazar con gcc. La solución: Se debe indicar a gcc en donde estan las librerias usando -L&#60;dir&#62;, luego enlazarlas como librerías normales usando -l&#60;name&#62;. Por ejemplo para enlazar la [...]]]></description>
			<content:encoded><![CDATA[<p>El problema: Tienes librerias personales que tú mismo creaste, o bien librerías sin instalar que no estan en /usr/lib sino en otros directorios raros y quieres enlazar con gcc.</p>
<p>La solución: Se debe indicar a gcc en donde estan las librerias usando <strong>-L&lt;dir&gt;</strong>, luego enlazarlas como librerías normales usando <strong>-l&lt;name&gt;</strong>. Por ejemplo para enlazar la librería /home/user/tmp/libtrompete.a:</p>
<pre>gcc -L/home/user/tmp/ -ltrompete main.cpp</pre>
<p>Nota que solo se le indica el nombre <strong>trompete</strong>, porque gcc le agrega <strong>lib+trompete = libtrompete</strong>. GCC también busca automáticamente si es <strong>.o</strong>, <strong>.so</strong> o si es una AR <strong>.a</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/622/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Merge del trunk a una branch</title>
		<link>http://zarzamora.com.mx/archivo-historico/597</link>
		<comments>http://zarzamora.com.mx/archivo-historico/597#comments</comments>
		<pubDate>Wed, 29 Oct 2008 19:38:08 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=597</guid>
		<description><![CDATA[Hay dos formas, directo del repositorio y usando una copia local del trunk. Directo del repositorio $ svn merge -r START:END http://repo/svn/trunk /directorio/branch De una copia local: $ svn up /directorio/trunk $ svn merge -r START:END /directorio/trunk   /directorio/branch Cualquiera de las dos anteriores te hace un merge a la copia local que está en /directorio/branch. [...]]]></description>
			<content:encoded><![CDATA[<p>Hay dos formas, directo del repositorio y usando una copia local del trunk.</p>
<p>Directo del repositorio</p>
<pre>$ svn merge -r START:END http://repo/svn/trunk /directorio/branch</pre>
<p>De una copia local:</p>
<pre>$ svn up /directorio/trunk
$ svn merge -r START:END /directorio/trunk   /directorio/branch</pre>
<p>Cualquiera de las dos anteriores te hace un merge a la copia local que está en /directorio/branch.</p>
<p>Para finalmente subir (a la branch) los cambios obtenidos</p>
<pre>$ svn ci -m "Merge del trunk a mi branch START:END"  /directorio/branch</pre>
<p>Si no se pusieron de acuerdo tus programadores, probablemente salgan conflictos, arreglalos.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/597/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion: cómo hacer un merge de una branch al trunk</title>
		<link>http://zarzamora.com.mx/archivo-historico/580</link>
		<comments>http://zarzamora.com.mx/archivo-historico/580#comments</comments>
		<pubDate>Tue, 21 Oct 2008 23:27:28 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=580</guid>
		<description><![CDATA[Hacer un check out del trunk: svn co svn+ssh://server/path/to/trunk Hacer check out de la rama (branch) que vamos a fusionar (merge): svn co svn+ssh://server/path/to/branch/myBranch Entrar a &#8220;myBranch&#8221; Encontrar la Revision donde nació &#8220;myBranch&#8221;: svn log --stop-on-copy Tomar nota de la revisión rXXXX donde nació la branch. Entrar al directorio del trunk. SVN update: svn up [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Hacer un check out del trunk:
<div><code class="block">svn co svn+ssh://server/path/to/trunk</code></div>
</li>
<li>Hacer check out de la rama (branch) que vamos a fusionar (merge):
<div><code class="block">svn co svn+ssh://server/path/to/branch/myBranch</code></div>
</li>
<li>Entrar a &#8220;myBranch&#8221;</li>
<li>Encontrar la Revision donde nació &#8220;myBranch&#8221;:
<div><code class="block">svn log --stop-on-copy</code></div>
<p>Tomar nota de la revisión rXXXX donde nació la branch.</li>
<li>Entrar al directorio del trunk.</li>
<li>SVN update:
<div><code class="block">svn up</code></div>
<p>Lo cual actualizará los ultimos datos del trunk, tomar nota de la revisión &#8220;At revision YYYY&#8221; (debería ser mas grande que rXXXX).</li>
<li>Hacer un SVN merge:
<div><code class="block">svn merge -r XXXX:YYYY svn+ssh://server/path/to/branch/myBranch</code></div>
<p>Lo cual hace un merge de la branch en el trunk (la copia local)</li>
<li>Arreglar conflictos de archivos en caso de haberlos</li>
<li>Check in para subir el trunk actualizado (merged) al server:
<div><code class="block">svn ci -m "Hice un MERGE de la branch myBranch [XXXX]:[YYYY] al trunk"</code></div>
</li>
</ol>
<p>Listo.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/580/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El maléfico blog del Lhuerta</title>
		<link>http://zarzamora.com.mx/archivo-historico/560</link>
		<comments>http://zarzamora.com.mx/archivo-historico/560#comments</comments>
		<pubDate>Fri, 26 Sep 2008 03:57:17 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[nvidia]]></category>
		<category><![CDATA[xorg]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=560</guid>
		<description><![CDATA[Lo sabía, algo maléfico tiene el Lhuerta. Algo evil debe de moverse bajo el greñero. Y finalmente lo descubrí: Lhuerta es un asesino de Zorras de Fuego y de Xorg&#8217;s. La verdad es que esto es culpa del driver beta de nVidia que aun no soporta bien mi 280 GTX. Y cada vez que entro [...]]]></description>
			<content:encoded><![CDATA[<p style="padding-left: 30px;"><strong>Lo sabía, algo maléfico tiene el Lhuerta. Algo <em>evil</em> debe de moverse bajo el greñero. Y finalmente lo descubrí: Lhuerta es un asesino de Zorras de Fuego y de Xorg&#8217;s.</strong></p>
<p>La verdad es que esto es culpa del driver beta de nVidia que aun no soporta bien mi 280 GTX. Y cada vez que entro a ver el blog del Lhuerta mi Firefox simplemente muere y se lleva consigo al servidor Xorg. El resultado es que me regresa a la pantalla de login.</p>
<blockquote><p>Querido Nvidia:</p>
<p>Me estas provocando dolores de cabeza horribles ¡¡¡arregla ya el driver de Linux!!!!</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/560/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CMake para tus projectos II: Kdevelop</title>
		<link>http://zarzamora.com.mx/archivo-historico/527</link>
		<comments>http://zarzamora.com.mx/archivo-historico/527#comments</comments>
		<pubDate>Mon, 08 Sep 2008 18:54:27 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[cmake]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[kdevelop]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=527</guid>
		<description><![CDATA[En el post anterior expliqué como hacer un par de CMakeLists.txt para generación automática de Makefiles. Pero CMake es mucho mas potente, tanto que puede generar proyectos de KDevelop, Visual Studio (C++), Code::Blocks, Dev C++, X-code, etc, etc&#8230; Creación automática de un proyecto de KDevelop con CMake Usaré exactamente lo que se describe en el [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://zarzamora.com.mx/archivo-historico/501">post anterior</a> expliqué como hacer un par de CMakeLists.txt para generación automática de Makefiles. Pero <a href="http://www.cmake.org/HTML/Documentation.html">CMake</a> es mucho mas potente, tanto que puede <a href="http://www.cmake.org/HTML/cmake-2.6.html#section_Generators">generar proyectos</a> de KDevelop, Visual Studio (C++), Code::Blocks, Dev C++, X-code, etc, etc&#8230;</p>
<h3>Creación automática de un proyecto de KDevelop con CMake</h3>
<p>Usaré exactamente lo que se describe en el <a href="http://zarzamora.com.mx/archivo-historico/501">post anterior</a>. Lo único que debe tenerse precaución es en eliminar todo lo que pudiera quedar dentro del directorio <strong>build/</strong> de generaciones pasadas. El directorio <strong>build/</strong> debe estar vacío.</p>
<pre>$ <strong>cd build/</strong>
$ <strong>cmake -G KDevelop3 ../</strong>
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ariel/Documentos/holaMundoCMake/build</pre>
<p>Y listo. Nota la opcion &#8220;<strong>-G KDevelop3</strong>&#8220;. En el directorio <strong>build/</strong> se auto genera un proyecto de KDevelop llamado <strong>HELLO.kdevelop</strong> pues HELLO es el nombre del proyecto que definimos en CMakeLists.txt. Ahora se puede abrir con KDevelop (C/C++). <strong>Project-&gt;Open Project</strong> y elegimos <strong>HELLO.kdevelop</strong>.</p>
<p><a rel="lightbox" href="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake.jpg"><img title="kdevelop-cmake" src="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake-300x236.jpg" alt="Abrir un projecto KDevelop generado por CMake" width="180" height="142" /></a><a rel="lightbox" href="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake-ejecuta.jpg"><img class="alignnone size-medium wp-image-534" title="kdevelop-cmake-ejecuta" src="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake-ejecuta-300x179.jpg" alt="" width="237" height="141" /></a></p>
<p>El proyecto compila, ejecuta y tenemos el arbol de inclusiones. Tambien podemos usar el debugger y el completador de código. Todo lo de KDevelop funciona porque es un proyecto nativo.</p>
<p>Ah, para que el completador de código funcione, debes tener KDevelop 3.5.2 al menos.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/527/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMake para tus proyectos</title>
		<link>http://zarzamora.com.mx/archivo-historico/501</link>
		<comments>http://zarzamora.com.mx/archivo-historico/501#comments</comments>
		<pubDate>Sun, 07 Sep 2008 18:25:08 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[cmake]]></category>
		<category><![CDATA[codeblocks]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[kdevelop]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[multiplataforma]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=501</guid>
		<description><![CDATA[Yo era de los que en algun día de la newbie-esca vida me atemorizaban los Makefiles. Temía que en la oscuridad de la noche saliera un Makefile del ropero, o que por debajo de la cama un Makefile me jalara los pies. Pues no mas. CMake es una excelente herramienta para generar Makefiles, y no [...]]]></description>
			<content:encoded><![CDATA[<p>Yo era de los que en algun día de la <em>newbie-esca</em> vida me atemorizaban los Makefiles. Temía que en la oscuridad de la noche saliera un Makefile del ropero, o que por debajo de la cama un Makefile me jalara los pies. Pues no mas.</p>
<p>CMake es una excelente herramienta para generar Makefiles, y no solo eso tambien genera soluciones de Visual Studio, Code::Blocks, Kdevelop entre muchas otras. Así que me puse a investigar y resulta que CMake es trivial de usar, hasta un newbie como yo lo puede usar (por lo tanto <a href="http://ubaldolnx.blogspot.com/">otros newbies</a> también podrían usarlo).</p>
<h3>1. Hello World: El código fuente</h3>
<p>Usaremos este código que muestra CMake para compilar y enlazar un programa principal con una librería extra generada por nosotros mismos. La siguiente estructura de directorios es la que hay que crear:</p>
<pre><span style="color: #0000ff;">holaMundoCMake</span>
|-- CMakeLists.txt
|-- <span style="color: #0000ff;">build</span>
`-- <span style="color: #0000ff;">src</span>
    |-- hola.cpp
    `-- <span style="color: #0000ff;">milib</span>
        |-- CMakeLists.txt
        |-- milib.cpp
        `-- milib.h</pre>
<p>La idea aqui es que vamos a generar un pequeño programita a partir del codigo en <strong>hola.cpp</strong> y de la libreria <strong>milib.cpp</strong>, el código de hola.cpp es muy sencillo:</p>
<p><strong>hola.cpp:</strong></p>
<pre>#include "milib.h"
int main(int argc, char* argv){
printf("\n Hola mundo desde main");
hola(2);
printf("\n");
}</pre>
<p>Y lo que hace es cargar el header milib.h que es donde está definida la función hola().</p>
<p><strong>milib.h</strong>:</p>
<pre>#include &lt;stdio.h&gt;
//Prototipo de funcion
void hola(int);</pre>
<p><strong>milib.c:</strong></p>
<pre>#include "milib.h"
// Implementacion de la funcion
void hola(int veces){
  int i=0;
  while (i&lt;veces){
    printf("\n [%u] Hola Mundo, desde 'milib'" , i);
    i++;
  }
}</pre>
<p>El código es realmente trivial (si no lo comprendes mejor ni sigas leyendo). Hasta este punto no hemos usado nada de CMake ni hemos creado Makefiles ni nada. El código bien podríamos compilarlo a mano.</p>
<h3>2. Hello World: Las CMakeLists.txt para CMake</h3>
<p>Hay un archivo de CMake en <strong>holaMundoCMake/CMakeLists.txt</strong> y hay otro en <strong>holaMundoCMake/src/milib</strong><strong>/CMakeLists.txt</strong>, éstos son los archivos clave para CMake. Con los comentarios se explican solos.</p>
<p><strong>holaMundoCMake/CMakeLists.txt:</strong></p>
<pre># El nombre del proyecto "HELLO".
# CMake genera automaticamente una variable llamada
# HELLO_SOURCE_DIR que puede llamarse usando
# ${HELLO_SOURCE_DIR} con la ruta del codigo
# lo mismo con ${HELLO_BINARY_DIR} para binarios

project (HELLO)

# Le decimos donde poner los binarios de librerias y ejecutables
# CMake admite instrucciones partidas en varias lineas
SET (LIBRARY_OUTPUT_PATH    ${HELLO_BINARY_DIR}/bin
	CACHE PATH "Directory for Libraries")
SET (EXECUTABLE_OUTPUT_PATH ${HELLO_BINARY_DIR}/bin
	CACHE PATH "Directory for Executables")

# Decimos a CMake que haga recursion a los siguientes directorios
# en orden de aparicion
add_subdirectory (src/milib)

# Directorios que debe incluir, ademas de los estandar.
include_directories (${HELLO_SOURCE_DIR}/src/milib/)

# Directorios para el enlazador, ademas de los estandar
# Para este ejemplo no los necesitamos ya que la unica libreria
# adicional es 'milib' y ya sabe donde encontrarla pues el mismo
# la genera
#link_directories (aqui pones mas rutas separadas por espacios)

# Decirle que queremos un ejecutable llamado holaMundo
# y le decimos el source para que lo compile
add_executable (holaMundo src/hola.cpp)

# Tenemos una libreria adicional llamada milib, enlazarla
target_link_libraries (holaMundo milib)</pre>
<p>El segundo CMakeLists sirve para compilar la libreria &#8220;milib&#8221; y es mucho mas corto:</p>
<p><strong>holaMundoCMake/src/milib</strong><strong>/CMakeLists.txt</strong></p>
<pre># Agregar una libreria llamada milib generada poru un cpp
# se pueden agregar muchas librerias con varios add_library
# Se deben listar todos los archivos fuente
add_library (milib milib.cpp milib.h)</pre>
<h3>3. Hello World: Generar Makefiles con CMake y compilar</h3>
<p>En linux el modo por default es generar <strong>Makefiles</strong>, así que entramos al directorio build que actualmente está vacío y generamos los <strong>Makefiles</strong>:</p>
<pre>~/Documentos$ <strong>cd holaMundoCMake
</strong>~/Documentos/holaMundoCMake/$ <strong>cd build
</strong>~/Documentos/holaMundoCMake/build$ <strong>cmake ../</strong>
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ariel/Documentos/holaMundoCMake/build</pre>
<p>Listo, ya estan los Makefiles generados, ahora a compilar con make:</p>
<pre>~/Documentos/holaMundoCMake/build$ <strong>make</strong>
Scanning dependencies of target milib
[ 50%] Building CXX object src/milib/CMakeFiles/milib.dir/milib.o
Linking CXX static library ../../bin/libmilib.a
[ 50%] Built target milib
Scanning dependencies of target holaMundo
[100%] Building CXX object CMakeFiles/holaMundo.dir/src/hola.o
Linking CXX executable bin/holaMundo
[100%] Built target holaMundo
ariel@surfer:~/Documentos/eclipse/holaMundoCMake/build$ make clean
ariel@surfer:~/Documentos/eclipse/holaMundoCMake/build$ make
[ 50%] Building CXX object src/milib/CMakeFiles/milib.dir/milib.o
Linking CXX static library ../../bin/libmilib.a
[ 50%] Built target milib
[100%] Building CXX object CMakeFiles/holaMundo.dir/src/hola.o
Linking CXX executable bin/holaMundo
[100%] Built target holaMundo</pre>
<p>En el directorio <strong>build/bin</strong> se encuentra el binario holaMundo,</p>
<pre>~/Documentos/holaMundoCMake/build$ <strong>cd bin/</strong>
~/Documentos/holaMundoCMake/build$ <strong>./holaMundo</strong>
Hola mundo desde main
[0] Hola Mundo, desde 'milib'
[1] Hola Mundo, desde 'milib'</pre>
<p>¡Listo! ¿Quién dijo que habría que generar Makefiles a mano? Generar <strong>CMakeLists.txt</strong> es mucho mas fácil y mas intuitivo.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/501/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
