MAC 328 Algoritmos em Grafos

Este projeto foi elaborado pelo professor Francisco Reverbel

Segundo Exercício-Programa. Make: Episode I

A long time ago in a galaxy far,
far away ...


Avisos

  1. O programa pode ser feito em grupos de uma ou duas pessoas.
  2. O valor deste EP é 20 pontos.

Objetivos

  1. Manipulação da representação de um grafo através de listas de adjacências.
  2. Treino no uso de algumas funções básicas do Stanford GraphBase.
  3. Familiarização com o processo de compilação usando a biblioteca libgb.
    (Veja o Makefile em http://www.ime.usp.br/~coelho/grafos/sgb/exemplos/.)

Descrição

Introdução

Neste exercício-programa você fará um documento em CWEB que deverá charmar-se Make.w. Este documento utilizará a biblioteca do SGB para a criação e recuperação de um `grafo de dependências', como descreveremos a seguir.

O seu programa deverá chamar-se Make. O `M' maiúsculo em Make é para diferenciarmos o se programa do make do UNIX. Da mesma maneira que o utilitário make, o seu programa, ao ser chamado na linha de comando sem opção alguma, lerá um arquivo de nome MakeFile contendo informações de dependências e comandos para reconstrução (rebuilding commands). O `F' maiúsculo em MakeFile é para não confundirmos a entrada do Make com o arquivo Makefile que você muito provavelmente estará utilizado.

Formato de um MakeFile

Um MakeFile consiste de uma seqüência de `regras' com o seguinte formato:
  target ... :  dependências ...
         comando1
         comando2
         ...

Um target é usualmente o nome de um arquivo que é gerado por um programa; exemplos de targets são arquivos executáveis (bin ou .o). Um target também pode ser o nome de uma ação, tal como `clean'.

Uma dependência é um arquivo que é usado para criar o target. Um target pode depender de vários arquivos.

Um comando é uma ação que Make pode mandar que seja executada. Um regra pode ter mais que um comando, cada um em uma linha. Nota: deve existir um caractere TAB ('\t') no início de cada linha.

Exemplo de um MakeFile

A seguir está um exemplo típico de um arquivo MakeFile que seu programa Make deverá ser capaz de tratar (os números das linhas foram colocada apenas para efeito de referência, eles não farão parte do MakeFile):

1   meuprog: meuprog.o  fila.o  etc.o
2         gcc meuprog.o fila.o etc.o -o meuprog 
3
4   meuprog.o:  meuprog.c  minhasdefs.h  fila.h   etc.h
5         gcc -c meuprog.c
6
7   fila.o:  fila.c minhasdefs.h  fila.h
8         gcc -c fila.c
9
10  etc.o: etc.c  minhasdefs.h  etc.h
11        gcc -c etc.c
12
13  clean:
14        rm -f meuprog.o fila.o etc.o
Este exemplo ilustra o formato do arquivo MakeFile que o seu programa deverá tratar:

Grafo de dependências

As linhas de dependências em um MakeFile (ou Makefile) definem um grafo de dependências, um grafo dirigido cujos vértices correspondem a targets e arquivos de dependência, e cujos arcos representam a dependência entre estes targets e arquivos. Sempre que um target f1 depende de um arquivo f2 o correspondente grafo de dependências deve conter um arco do vértice de nome f1 até o vértice de nome f2. A Linha 7 do nosso exemplo de MakeFile acima diz que respectivo grafo de dependências contém arcos do vértice de nome fila.o até o vértice de nome fila.c, até o vértice de nome minhasdefs.h, e até o vértice de nome fila.h .

Um ciclo em um grafo é caminho fechado. Mais precisamente, um ciclo é uma seqüência de vértices (v1,v2,...,vk) tal que

existe um arco de vi até vi+1 (i=1,...,k-1) e um arco de vk até v1.

Um grafo de depêndencias não deve conter um ciclos. Isto, entretanto, não é obstáculo para que um grafo de dependência correspondente a um arquivo MakeFile tenha circuitos. Isto apenas significa que o Make deverá ser capaz de verificar a presença ou não de circlos no grafo de dependências. A existência de ciclos deverá ser considerada pelo Make como um erro na especificação do MakeFile. Detecção de ciclos será o objeto de estudo do Exercício-Programa 3. (Por enquanto não se preocupe com isto.)

O que Make deverá fazer

O programa Make poderá ser chamado em uma linha de comando do shell de duas maneiras diferentes:

Representação interna de um grafo de dependências

O seu programa deverá usar a biblioteca do SGB para representação interna de um grafo de dependências. Você precisará usar os módulos GB_GRAPH e GB_SAVE. Veja exemplos de como utilizar este módulos em

http://www.ime.usp.br/~coelho/grafos/sgb/exemplos/

Um vértice v (registro ou estrutura do tipo Vertex) deverá conter:

Por enquanto acho que é só isto que precisamos de um registro do tipo Vertex. No Exercício-programa 3 precisaremos guardar mais informações.

Fazendo a busca por um vértice

O seu programa fará várias vezes a busca por um vértice, dado o seu nome. As seguintes rotinas podem ser usadas para isto. Elas fazem parte do módulo GB_GRAPH do SGB.

Important: Utility fields u and v of each vertex are reserved for use by the search routine when hashing is active. You can crash the system if you try to fool around with these values yourself, or if you use any subroutines that change those fields. The first two characters in the current graph's util_types field should be VV if the hash table information is to be saved by GB_SAVE.

Warning: Users of this hash scheme must preserve the number of vertices g->n in the current graph g. If g->n is changed, the hash table will be worthless, unless hash_setup is used to rehash everything.

Caution: This hash coding scheme is system-dependent, because it uses the system's character codes. If you create a graph on a machine with ASCII code and save it with GB_SAVE, and if you subsequently ship the resulting text file to some friend whose machine does not use ASCII code, your friend will have to rebuild the hash structure with hash_setup before being able to use hash_lookup successfully.


Entrega e Prazos

  1. Como sempre, somente entregue seu programa se o mesmo não apresentar erros de compilação. O processo de compilação aqui deve ser entendido como todo o processo cweave, latex, ctangle e cc.
  2. A entrega do programa consiste da entrega eletrônica do programa E da entrega de uma impressão do arquivo dvi correspondente (huuummm, vocês têm onde imprimir isto?).

[ MAC 328's Home Page. | Exercícios-programas]
Last modified: Fri Apr 6 16:20:21 BRST 2001