Difference between revisions of "Make/CVS example 1"

From Wiki**3

Line 1: Line 1:
 
{{TOCright}}
 
{{TOCright}}
 
== The Problem (in Portuguese) ==
 
== The Problem (in Portuguese) ==
<p>Considere quatro ficheiros <tt> <span style="color: #990000">recurs.cpp</span></tt> (contendo a fun&ccedil;&atilde;o  <tt>   <span style="color: #990000">factrecurs</span> </tt>), <tt>   <span style="color: #990000">recurs.h</span> </tt> (contendo a declara&ccedil;&atilde;o da fun&ccedil;&atilde;o <tt> <span style="color: #990000">factrecurs</span>),</tt> <tt>   <span style="color: #990000">iter.cpp</span> </tt> (contendo a fun&ccedil;&atilde;o  <tt>   <span style="color: #990000">factiter</span> </tt>), <tt>   <span style="color: #990000">iter.h</span> </tt> (contendo a declara&ccedil;&atilde;o da fun&ccedil;&atilde;o  <tt> <span style="color: #990000">factiter</span>)</tt> e <tt> <span style="color: #990000">main.cpp</span></tt> (contendo a fun&ccedil;&atilde;o  <tt> <span style="color: #990000">main</span></tt> que invoca sequencialmente ambas as fun&ccedil;&otilde;es anteriores e que inclui <tt>   <span style="color: #990000">recurs.h</span> </tt> e <tt>   <span style="color: #990000">iter.h</span> </tt>).</p>
+
 
# Construa, com estes cinco ficheiros, um projecto designado   <strong>factorial</strong>, indicando os comandos para o colocar sob o controlo de vers&otilde;es do CVS. Admita que o reposit&oacute;rio j&aacute; existe em   <tt>     <span style="color: #990000">/cvs</span>   </tt>.
+
Considere quatro ficheiros <tt><span style="color: #990000">recurs.cpp</span></tt> (contendo a função <tt><span style="color: #990000">factrecurs</span></tt>), <tt><span style="color: #990000">recurs.h</span></tt> (contendo a declaração da função <tt><span style="color: #990000">factrecurs</span>),</tt> <tt><span style="color: #990000">iter.cpp</span></tt> (contendo a função <tt><span style="color: #990000">factiter</span> </tt>), <tt><span style="color: #990000">iter.h</span></tt> (contendo a declaração da função <tt><span style="color: #990000">factiter</span>)</tt> e <tt><span style="color: #990000">main.cpp</span></tt> (contendo a função <tt><span style="color: #990000">main</span></tt> que invoca sequencialmente ambas as funções anteriores e que inclui <tt><span style="color: #990000">recurs.h</span></tt> e <tt><span style="color: #990000">iter.h</span></tt>).
# Construa uma   <tt>   <span style="color: #990000">Makefile</span></tt> para gerar o execut&aacute;vel    <tt>   <span style="color: #990000">fact</span></tt>, a partir dos ficheiros anteriores. Indique os comandos necess&aacute;rios para colocar a   <tt>     <span style="color: #990000">Makefile</span>   </tt> no reposit&oacute;rio CVS.
+
 
# Considere agora que vai ter dois execut&aacute;veis, cada um invocando a sua fun&ccedil;&atilde;o. Indique as altera&ccedil;&otilde;es &agrave;    <span style="color: #990000">   <tt>Makefile</tt></span> para que passe a gerar os execut&aacute;veis    <tt>   <span style="color: #990000">recurs</span></tt> e   <tt>   <span style="color: #990000">iter</span></tt>, utilizando ambos o mesmo ficheiro   <tt>   <span style="color: #990000">main.cpp</span></tt> (mas diferentes implementa&ccedil;&otilde;es do factorial). Indique as opera&ccedil;&otilde;es do CVS para criar a nova vers&atilde;o do projecto, assumindo que o projecto est&aacute; checked-out no direct&oacute;rio corrente.
+
# Construa, com estes cinco ficheiros, um projecto designado <strong>factorial</strong>, indicando os comandos para o colocar sob o controlo de versões do CVS. Admita que o repositório já existe em <tt><span style="color: #990000">/cvs</span></tt>.
# Considere uma nova vers&atilde;o do projecto: pretende-se construir um &uacute;nico execut&aacute;vel    <span style="color: #990000">  <tt>fact</tt></span>, mas a escolha da implementa&ccedil;&atilde;o do factorial &eacute; efectuada em tempo de execu&ccedil;&atilde;o. Considere que os ficheiros   <tt>     <span style="color: #990000">recurs.cpp</span>   </tt> e   <tt>     <span style="color: #990000">recurs.h</span>   </tt> existem num subdirect&oacute;rio    <tt>     <span style="color: #990000">recurs</span>   </tt> e, analogamente, existe um direct&oacute;rio    <tt>     <span style="color: #990000">iter</span>   </tt> para a outra vers&atilde;o. Cada um dos conjuntos apresenta agora a mesma interface para a fun&ccedil;&atilde;o que calcula o factorial:   <tt>     <span style="color: #990000">fact</span>   </tt>. Construa duas bibliotecas din&acirc;micas, ambas designadas por   <span style="color: #990000">   <tt>fact.so</tt></span>, cada uma em seu direct&oacute;rio (   <tt>     <span style="color: #990000">recurs/fact.so</span>   </tt> e   <tt>   <span style="color: #990000">iter/fact.so</span></tt>). A selec&ccedil;&atilde;o da variante a utilizar faz-se definindo a vari&aacute;vel de ambiente   <tt>   <span style="color: #990000">LD_LIBRARY_PATH</span></tt> com o direct&oacute;rio apropriado. Indique quais os ficheiros iniciais modificados, face &agrave; al&iacute;nea anterior, a nova   <tt>   <span style="color: #990000">Makefile</span></tt> e os comandos CVS necess&aacute;rios para que o reposit&oacute;rio passe a conter a nova vers&atilde;o.
+
# Construa uma <tt><span style="color: #990000">Makefile</span></tt> para gerar o executável  <tt><span style="color: #990000">fact</span></tt>, a partir dos ficheiros anteriores. Indique os comandos necessários para colocar a <tt><span style="color: #990000">Makefile</span></tt> no repositório CVS.
# Modifique a al&iacute;nea anterior para que o utilizador possa escolher a variante a utilizar atrav&eacute;s de um argumento na linha do comando   <tt>   <span style="color: #990000">fact</span></tt>, respectivamente   <tt>   <span style="color: #990000">recurs</span></tt> ou   <tt>   <span style="color: #990000">iter</span></tt>. Indique quais os ficheiros iniciais modificados, a nova   <tt>   <span style="color: #990000">Makefile</span></tt> e os comandos CVS necess&aacute;rios para registar a nova vers&atilde;o.</li> </ol>
+
# Considere agora que vai ter dois executáveis, cada um invocando a sua função. Indique as alterações à <span style="color: #990000"> <tt>Makefile</tt></span> para que passe a gerar os executáveis <tt><span style="color: #990000">recurs</span></tt> e <tt><span style="color: #990000">iter</span></tt>, utilizando ambos o mesmo ficheiro <tt><span style="color: #990000">main.cpp</span></tt> (mas diferentes implementações do factorial). Indique as operações do CVS para criar a nova versão do projecto, assumindo que o projecto est&aacute; checked-out no directório corrente.
 +
# Considere uma nova versão do projecto: pretende-se construir um único executável <span style="color: #990000">  <tt>fact</tt></span>, mas a escolha da implementação do factorial é efectuada em tempo de execução. Considere que os ficheiros <tt><span style="color: #990000">recurs.cpp</span></tt> e <tt><span style="color: #990000">recurs.h</span></tt> existem num subdirectório <tt><span style="color: #990000">recurs</span></tt> e, analogamente, existe um directório <tt><span style="color: #990000">iter</span></tt> para a outra versão. Cada um dos conjuntos apresenta agora a mesma interface para a função que calcula o factorial: <tt><span style="color: #990000">fact</span></tt>. Construa duas bibliotecas dinâmicas, ambas designadas por <span style="color: #990000"><tt>fact.so</tt></span>, cada uma em seu directório (<tt><span style="color: #990000">recurs/fact.so</span></tt> e <tt><span style="color: #990000">iter/fact.so</span></tt>). A selecção da variante a utilizar faz-se definindo a variável de ambiente <tt><span style="color: #990000">LD_LIBRARY_PATH</span></tt> com o directório apropriado. Indique quais os ficheiros iniciais modificados, face à alínea anterior, a nova <tt><span style="color: #990000">Makefile</span></tt> e os comandos CVS necessários para que o repositório passe a conter a nova versão.
 +
# Modifique a alínea anterior para que o utilizador possa escolher a variante a utilizar através de um argumento na linha do comando <tt><span style="color: #990000">fact</span></tt>, respectivamente <tt><span style="color: #990000">recurs</span></tt> ou <tt><span style="color: #990000">iter</span></tt>. Indique quais os ficheiros iniciais modificados, a nova <tt><span style="color: #990000">Makefile</span></tt> e os comandos CVS necessários para registar a nova versão.
  
 
== Implementation ==
 
== Implementation ==
  
 
The following sections present possible implementations.
 
The following sections present possible implementations.

Revision as of 17:03, 9 March 2008

The Problem (in Portuguese)

Considere quatro ficheiros recurs.cpp (contendo a função factrecurs), recurs.h (contendo a declaração da função factrecurs), iter.cpp (contendo a função factiter ), iter.h (contendo a declaração da função factiter) e main.cpp (contendo a função main que invoca sequencialmente ambas as funções anteriores e que inclui recurs.h e iter.h).

  1. Construa, com estes cinco ficheiros, um projecto designado factorial, indicando os comandos para o colocar sob o controlo de versões do CVS. Admita que o repositório já existe em /cvs.
  2. Construa uma Makefile para gerar o executável fact, a partir dos ficheiros anteriores. Indique os comandos necessários para colocar a Makefile no repositório CVS.
  3. Considere agora que vai ter dois executáveis, cada um invocando a sua função. Indique as alterações à Makefile para que passe a gerar os executáveis recurs e iter, utilizando ambos o mesmo ficheiro main.cpp (mas diferentes implementações do factorial). Indique as operações do CVS para criar a nova versão do projecto, assumindo que o projecto está checked-out no directório corrente.
  4. Considere uma nova versão do projecto: pretende-se construir um único executável fact, mas a escolha da implementação do factorial é efectuada em tempo de execução. Considere que os ficheiros recurs.cpp e recurs.h existem num subdirectório recurs e, analogamente, existe um directório iter para a outra versão. Cada um dos conjuntos apresenta agora a mesma interface para a função que calcula o factorial: fact. Construa duas bibliotecas dinâmicas, ambas designadas por fact.so, cada uma em seu directório (recurs/fact.so e iter/fact.so). A selecção da variante a utilizar faz-se definindo a variável de ambiente LD_LIBRARY_PATH com o directório apropriado. Indique quais os ficheiros iniciais modificados, face à alínea anterior, a nova Makefile e os comandos CVS necessários para que o repositório passe a conter a nova versão.
  5. Modifique a alínea anterior para que o utilizador possa escolher a variante a utilizar através de um argumento na linha do comando fact, respectivamente recurs ou iter. Indique quais os ficheiros iniciais modificados, a nova Makefile e os comandos CVS necessários para registar a nova versão.

Implementation

The following sections present possible implementations.