/*
This file is part of hugin.
hugin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
hugin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with hugin. If not, see .
*/
/**
* @file example.cpp
* @brief
* Created on: Aug 15, 2010
* @author Florian Achleitner
*/
#include
#include
#include "Comment.h"
#include "Conditional.h"
#include "VariableDef.h"
#include "VariableRef.h"
#include "AutoVariable.h"
#include "Rule.h"
#include "Makefile.h"
#include "Manager.h"
using namespace makefile;
/**
* @example example.cpp
* A short example of how to use the Makefilelib.
* It tries to create a Makefile to compile itself.
*
* This may not work, but thats not the goal of this program.
*
*/
int main(int argc, char *argv[])
{
// The Manager owns our MakefileItems and destructs them when
// itself is destructed. Only heap-allocateed objects can be owned
// by the Manager, otherwise delete would fail.
Manager mgr;
// own_add is a shortcut, if you don't need the pointer for anything else.
mgr.own_add(new Comment("This example program creates a makefile to build itself"));
// The other way is this:
// We create a Variable.
Variable* cc = mgr.own(new Variable("CXX", "g++"));
// We create a Conditional that checks if CC is defined, and otherwise defines it.
// Never forget to call mgr.own, or delete yourself, otherwise valgrind will tell you bad news ;)
ConditionalNDEF* have_cc = mgr.own(new ConditionalNDEF("CXX"));
// and add it.
have_cc->add();
// A Conditional can hold MakefileItems in it's if- and else-blocks
// Variables have a VariableRef(erence) and a VariableDef(inition).
// If CC is not defined, we want to define it.
have_cc->addToIf(cc->getDef());
// We want another Variable containing compiler flags
// Variables quotemode defines how there value is quoted in the definition.
Variable* cflags = mgr.own(new Variable("CFLAGS", "-Wall -c", Makefile::NONE));
// ..and add the definition to the Makefile right here.
cflags->getDef().add();
// And another Var for the executable name
Variable* executable = mgr.own(new Variable("OBJ", "example.o"));
executable->getDef().add();
// The default rule is the first that appears. We want to build the
// executable.
Rule* all = mgr.own(new Rule());
all->add();
all->addTarget("all");
all->addPrereq(executable->getRef());
// Now we need a rule to build all that. We create a rule, that says
// how to get a .o file from a .cpp file. (Yes I know there are implicitrules..)
Rule* build = mgr.own(new Rule());
build->add();
build->addTarget("%.o");
build->addPrereq("%.cpp");
// We use Automatic Variables in the command.
// This is a special Varialbe having only a name.
Variable* target = mgr.own(new AutoVariable("@"));
Variable* prereq = mgr.own(new AutoVariable("<"));
// Now we can add a command to the rule.
build->addCommand(cc->getRef() +" "+ cflags->getRef() + " -o " + target->getRef() +" "+ prereq->getRef());
// The Makefile singleton has pointers to our added objects. We open a file and
// let it write our makefile into it.
std::ofstream outfile("example.mk");
Makefile::getSingleton().writeMakefile(outfile);
outfile.close();
// Now run make and look what it does. Maybe it won't work, because the cpp file is somewhere else
// Run make -n -f example.mk to do a dryrun.
// To get a running executable, this has to be linked against libmakefilelib.so.
return 0;
}