16/08/2011 Programação Lua

Já faz um bom tempo que falei sobre o Premake, prometendo dar continuidade ao assunto. Em especial disse que iria falar sobre como compilar bibliotecas e arquivos não C. Pois bem, demorou, mas aqui vai. O principal motivo de ter demorado é que não usei muito a ferramenta ultimamente, não estive compilando muita coisa. E também porque não encontrei nenhuma forma prática de "compilar" arquivos não C. Por exemplo, documentação que use alguma ferramenta de conversão de formato.

Como o Premake usa linguagem Lua, você pode usar os.execute() para chamar programas externos. Mas nada como as regras de sufixo dos makefiles que nos permitem dizer para processar um arquivo somente se ele sofreu alterações desde a última vez que foi processado.

Bibliotecas estáticas

Se necessário, primeiro dê uma revisada no artigo anterior, que mostra o básico. Para compilar programas que usam bibliotecas estáticas não precisamos de muitas novidades:

hello.c:

#include "libhello.h"

int main(int argc, char *argv[]) {
	hello();
	return 0;
}

libhello.c:

#include <stdio.h>

void hello() {
	printf("Hello World!\n");
}

libhello.h:

void hello();

premake4.lua:

solution "hello"
	configurations { "Debug", "Release" }
	configuration "Debug"
		defines { "DEBUG" }
		flags { "Symbols" }
	configuration "Release"
		flags { "Optimize" }

	project "hello"
		kind "ConsoleApp"
		language "C"
		files { "hello.c" }
		links { "libhello" }

	project "libhello"
		kind "StaticLib"
		language "C"
		files { "libhello.c" }

Veja que temos 2 project. Um do tipo ConsoleApp e outro do tipo StaticLib. O projeto hello ConsoleApp é ligado (links) ao projeto libhello StaticLib. Mas, observe que ao limpar os arquivos com o comando premake4 clean, por algum motivo que não sei qual fica sobrando um subdiretório chamado obj. Então vou acrescentar ao arquivo premake4.lua uma customização da ação clean - o que já vai como exemplo de como customizar as ações:

if _ACTION == "clean" then
	os.rmdir("obj")
end

Bibliotecas dinâmicas

O processo é praticamente o mesmo, só o tipo do projeto será SharedLib. Mas nesse caso o Premake além de deixar o já citado subdiretório obj também deixa versões estáticas das bibliotecas, então vou acrescentar alguns comandos a mais para remover esses arquivos também na ação clean.

Os arquivos hello.c, libhello.c e libhello.h serão exatamente os mesmos, então nem vou repetir eles aqui. Vai só o premake4.lua já completo (com acréscimos na ação clean):

premake4.lua:

solution "hello"
	configurations { "Debug", "Release" }
	configuration "Debug"
		defines { "DEBUG" }
		flags { "Symbols" }
	configuration "Release"
		flags { "Optimize" }

	project "hello"
		kind "ConsoleApp"
		language "C"
		files { "hello.c" }
		links { "libhello" }

	project "libhello"
		kind "SharedLib"
		language "C"
		files { "libhello.c" }

if _ACTION == "clean" then
	os.rmdir("obj")
	for i,v in ipairs(os.matchfiles("*.a")) do
		os.remove(v)
	end
end

Bom... é isso pessoal, numa próxima falo sobre criar novas ações. Como da outra vez, o arquivo com os exemplos e o Premake, tudo o que você precisa para experimentar os exemplos.

br_lemes, o Imortal insano (Cleptomaniaco)