Make/CVS example 1: Difference between revisions
From Wiki**3
No edit summary |
No edit summary |
||
Line 11: | Line 11: | ||
== Implementation == | == Implementation == | ||
The following sections present possible implementations. | |||
All shell commands are prefixed with <tt>prompt%</tt> (their output is presented for explanation purposes only and is not required to answer the problem). | |||
It is assumed that the <tt>CVSROOT</tt> variable has been defined: | |||
<bash> | |||
export CVSROOT=/cvs | |||
</bash> | |||
=== Step 1: Building the Project === | |||
Assuming that all files are in directory <tt>/some/temporary/directory</tt>, the following commands may be used to create the '''factorial''' project (). | |||
prompt% cd /some/temporary/directory | |||
prompt% cvs import factorial david initial | |||
N factorial/recurs.cpp | |||
N factorial/recurs.h | |||
N factorial/iter.cpp | |||
N factorial/iter.h | |||
N factorial/main.cpp | |||
Then, after import is complete, we can check-out a fresh copy of the project and change to that directory: | |||
prompt% cvs co factorial | |||
U factorial/iter.cpp | |||
U factorial/iter.h | |||
U factorial/main.cpp | |||
U factorial/recurs.cpp | |||
U factorial/recurs.h | |||
prompt% cd factorial |
Revision as of 16:12, 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).
- 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.
- 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.
- 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.
- 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.
- 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.
All shell commands are prefixed with prompt% (their output is presented for explanation purposes only and is not required to answer the problem).
It is assumed that the CVSROOT variable has been defined: <bash>
export CVSROOT=/cvs
</bash>
Step 1: Building the Project
Assuming that all files are in directory /some/temporary/directory, the following commands may be used to create the factorial project ().
prompt% cd /some/temporary/directory prompt% cvs import factorial david initial N factorial/recurs.cpp N factorial/recurs.h N factorial/iter.cpp N factorial/iter.h N factorial/main.cpp
Then, after import is complete, we can check-out a fresh copy of the project and change to that directory:
prompt% cvs co factorial U factorial/iter.cpp U factorial/iter.h U factorial/main.cpp U factorial/recurs.cpp U factorial/recurs.h prompt% cd factorial