DEV Community

Loknath Dhar
Loknath Dhar

Posted on • Edited on

Setting up Codeblocks with Freeglut on Linux

In my Computer Graphics class, the teacher asked us to setup Codeblocks for the glut. She gave us an amazing tutorial on how to setup Codeblocks on windows but didn't provide any suggestion to set up on Linux. After some researching on google, I was able to setup Codeblocks with Freeglut (which is an alternative to Glut and available on Linux). This is a kind of writeup (or tutorial) on how I was able to setup Codeblocks with Freeglut.

This setup is tested and working on Pop os, as of writing, should be working with Ubuntu/Debian with the latest Codeblocks.

Also, I linked to the posts from where I collected these and setting up Codeblocks to work properly.

Installation Part

To work with all of these, of course, we have to install all the necessary files.

For Freeglut:

sudo apt install g++ freeglut3 freeglut3-dev

sudo apt install libxmu-dev libxi-dev
Enter fullscreen mode Exit fullscreen mode

For Codeblocks:

sudo apt install codeblocks
Enter fullscreen mode Exit fullscreen mode

For OpenGL:

sudo apt install build-essential libgl1-mesa-dev

sudo apt install libglew-dev libsdl2-dev libsdl2-image-dev libglm-dev libfreetype6-dev  # some libraries
Enter fullscreen mode Exit fullscreen mode

Check OpenGL installation:

glxinfo | grep OpenGL
Enter fullscreen mode Exit fullscreen mode

Setup Part

Open Codeblocks, go to settings > Global Variables.
Click new, it should look like this:

Alt Text

type freeglut, press ok and setup the rest like this:

Alt Text

Now close the Codeblocks.

Resting part is collected from here.

  • Go to /usr/share/codeblocks/templates, create the file freeglut.cbp and put the following code there:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
    <FileVersion major="1" minor="4" />
    <Project>
        <Option title="freeglut" />
        <Option pch_mode="0" />
        <Option compiler="gcc" />
        <Build>
            <Target title="default">
                <Option output="freeglut.exe" />
                <Option type="0" />
                <Option compiler="gcc" />
                <Option includeInTargetAll="1" />
            </Target>
        </Build>
        <Compiler>
            <Add directory="$(#freeglut.include)" />
        </Compiler>
        <Linker>
            <Add library="freeglut" />
            <Add library="glu32" />
            <Add library="opengl32" />
            <Add library="winmm" />
            <Add library="gdi32" />
            <Add library="user32" />
            <Add library="kernel32" />
            <Add directory="$(#freeglut.lib)" />
        </Linker>
        <Unit filename="main.cpp">
            <Option compilerVar="CPP" />
            <Option target="default" />
        </Unit>
    </Project>
</CodeBlocks_project_file>
Enter fullscreen mode Exit fullscreen mode

Save it.

  • Create a directory named freeglut on /usr/share/codeblocks/templates/wizard/. You will find another directory named glut there. Copy all the contents and paste it on the newly created freeglut directory.
  • Now go to the created freeglut directory, edit the wizard.script file and paste the following:
////////////////////////////////////////////////////////////////////////////////
//
// FreeGLUT project wizard
//
////////////////////////////////////////////////////////////////////////////////

// globals
FreeGlutPathDefault    <- _T("$(#freeglut)");
FreeGlutPathDefaultInc <- _T("$(#freeglut.include)");
FreeGlutPathDefaultLib <- _T("$(#freeglut.lib)");
FreeGlutPath <- _T("");

function BeginWizard()
{
    local intro_msg = _T("Welcome to the new FreeGLUT project wizard!\n\n" +
                         "This wizard will guide you to create a new project\n" +
                         "using the FreeGLUT OpenGL extensions.\n\n" +
                         "When you 're ready to proceed, please click \"Next\"...");

    local glutpath_descr = _T("Please select the location of FreeGLUT on your computer.\n" +
                              "This is the top-level folder where FreeGLUT was installed (unpacked).\n" +
                              "To help you, this folder must contain the subfolders\n" +
                              "\"include\" and \"lib\".");

    Wizard.AddInfoPage(_T("GlutIntro"), intro_msg);
    Wizard.AddProjectPathPage();
    if (PLATFORM == PLATFORM_MAC)
    {
        FreeGlutPathDefault="/System/Library/Frameworks/FreeGLUT.framework";
    }
    else
        Wizard.AddGenericSelectPathPage(_T("FreeGlutPath"), glutpath_descr, _T("Please select FreeGLUT's location:"), FreeGlutPathDefault);
    Wizard.AddCompilerPage(_T(""), _T("*"), true, true);
}

////////////////////////////////////////////////////////////////////////////////
// GLUT's path page
////////////////////////////////////////////////////////////////////////////////

function OnLeave_GlutPath(fwd)
{
    if (fwd)
    {
        local dir         = Wizard.GetTextControlValue(_T("txtFolder")); // txtFolder is the text control in GenericSelectPathPage
        local dir_nomacro = VerifyDirectory(dir);

        if (dir_nomacro.IsEmpty())
            return false;

        // verify include dependencies
        local dir_nomacro_inc = GetCompilerIncludeDir(dir, FreeGlutPathDefault, FreeGlutPathDefaultInc);
        if (dir_nomacro_inc.IsEmpty())
            return false;
        if (!VerifyFile(dir_nomacro_inc + wxFILE_SEP_PATH + _T("GL"), _T("freeglut.h"), _T("FreeGLUT's include"))) return false;

        // verify library dependencies
        local dir_nomacro_lib = GetCompilerLibDir(dir, FreeGlutPathDefault, FreeGlutPathDefaultLib);
        if (dir_nomacro_lib.IsEmpty())
            return false;

        if (PLATFORM == PLATFORM_MSW)
        {
            if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("FreeGLUT's"))) return false;
        }
        else
        {
            if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("FreeGLUT's"))) return false;
        }


        FreeGlutPath = dir; // Remember the original selection.

        local is_macro = _T("");

        // try to resolve the include directory as macro
        is_macro = GetCompilerIncludeMacro(dir, FreeGlutPathDefault, FreeGlutPathDefaultInc);
        if (is_macro.IsEmpty())
        {
            // not possible -> use the real inc path we had computed instead
            FreeGlutPathDefaultInc = dir_nomacro_inc;
        }

        // try to resolve the library directory as macro
        is_macro = GetCompilerLibMacro(dir, FreeGlutPathDefault, FreeGlutPathDefaultLib);
        if (is_macro.IsEmpty())
        {
            // not possible -> use the real lib path we had computed instead
            FreeGlutPathDefaultLib = dir_nomacro_lib;
        }
    }
    return true;
}

// return the files this project contains
function GetFilesDir()
{
    return _T("glut/files");
}

// setup the already created project
function SetupProject(project)
{
    // set project options
    if (PLATFORM != PLATFORM_MAC)
    {
        project.AddIncludeDir(FreeGlutPathDefaultInc);
        project.AddLibDir(FreeGlutPathDefaultLib);
    }

    // add link libraries
    if (PLATFORM == PLATFORM_MSW)
    {
        project.AddLinkLib(_T("freeglut"));
        project.AddLinkLib(_T("opengl32"));
        project.AddLinkLib(_T("glu32"));
        project.AddLinkLib(_T("winmm"));
        project.AddLinkLib(_T("gdi32"));
    }
    else if (PLATFORM == PLATFORM_MAC)
    {
        project.AddLinkerOption(_T("-framework GLUT"));
        project.AddLinkerOption(_T("-framework OpenGL"));

        project.AddLinkerOption(_T("-framework Cocoa")); // GLUT dependency
    }
    else
    {
        project.AddLinkLib(_T("glut"));
        project.AddLinkLib(_T("GL"));
        project.AddLinkLib(_T("GLU"));
        project.AddLinkLib(_T("Xxf86vm"));
    }

    // enable compiler warnings (project-wide)
    WarningsOn(project, Wizard.GetCompilerID());

    // Debug
    local target = project.GetBuildTarget(Wizard.GetDebugName());
    if (!IsNull(target))
    {
        target.SetTargetType(ttConsoleOnly); // ttConsoleOnly: console for debugging
        target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
        target.SetWorkingDir(FreeGlutPath + _T("/bin"));
        // enable generation of debugging symbols for target
        DebugSymbolsOn(target, Wizard.GetCompilerID());
    }

    // Release
    target = project.GetBuildTarget(Wizard.GetReleaseName());
    if (!IsNull(target))
    {
        target.SetTargetType(ttExecutable); // ttExecutable: no console
        target.SetOutputFilename(Wizard.GetReleaseOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
        target.SetWorkingDir(FreeGlutPath + _T("/bin"));
        // enable optimizations for target
        OptimizationsOn(target, Wizard.GetCompilerID());
    }

    return true;
}
Enter fullscreen mode Exit fullscreen mode

Save it.

  • Now on /usr/share/codeblocks/templates/wizard directory, there is a script named config.script and add the following line at the end of the file:
RegisterWizard(wizProject,     _T("freeglut"),     _T("FreeGLUT project"),      _T("2D/3D Graphics"));
Enter fullscreen mode Exit fullscreen mode
  • Now go to this link, this is the Freeglut project's source files, download the latest stable:

Alt Text

  • Extract it.
  • Copy the contents of the extracted folder and paste it on the /usr/share/codeblocks/templates/wizard/freeglut directory. At the time of writing, it looks like this:

Alt Text

Codeblocks Setup Part

If everything goes well/correctly, Codeblocks should be open without warning/showing any errors.

  • Open Codeblocks. Go to File > New > Projects and this dialog should be showing with Freeglut Project:

Alt Text

  • Give a name of the project as you see fit:

Alt Text

  • Then, specify the location where the Freeglut is:

Alt Text

  • Leave the next dialog as it is (don't change anything):

Alt Text

At this moment your Codeblocks should be ready for the Freeglut projects.

Final Part

Just checking if things are working or not.

  • Go to sources, there should be a main.cpp file for test running:

Alt Text

  • Build and Run!

Alt Text

Alt Text

That's it.

Okay, that's all. Hope, everything works fine.
See ya later!

Top comments (2)

Collapse
 
tasinchowdhury profile image
Tasin Shahriar Chowdhury

I have recently switched to Linux(Ubuntu) permanently, and facing the same thing with my Computer Graphics class. Your writeup(or tutorial) saved my day brother 😃

Collapse
 
sadespresso profile image
Батмэнд Ганбаатар

Ah, you're a lifesaver!