ede: Quick Start

 
 3 Quick Start
 *************
 
 Once you have EDE enabled, you can create a project.  This chapter
 provides an example C++ project that will create Automake files for
 compilation.
 
 3.1 Step 1: Create root directory
 =================================
 
 First, lets create a directory for our project.  For this example, we’ll
 start with something in ‘/tmp’.
 
      C-x C-f /tmp/myproject/README RET
      M-x make-directory RET RET
 
    Now put some plain text in your README file to start.
 
    Now, lets create the project:
 
      M-x ede-new RET Automake RET myproject RET
 
    Nothing visible happened, but if you use ‘dired’ to look at the
 directory, you should see this:
 
        /tmp/myproject:
        total used in directory 32 available 166643476
        drwxr-xr-x  2 zappo users  4096 2012-02-23 22:10 .
        drwxrwxrwt 73 root  root  20480 2012-02-23 22:10 ..
        -rw-r--r--  1 zappo users   195 2012-02-23 22:10 Project.ede
        -rw-r--r--  1 zappo users    10 2012-02-23 22:09 README
 
 3.2 Step 2: Create Subdirectories and Files
 ===========================================
 
 We’ll make a more complex project, so use dired to create some more
 directories using the ‘+’ key, and typing in new directories:
 
      + include RET
      + src RET
 
    Now I’ll short-cut in this tutorial.  Create the following files:
 
    ‘include/myproj.hh’
      /** myproj.hh ---
       */
 
      #ifndef myproj_hh
      #define myproj_hh 1
 
      #define IMPORTANT_MACRO 1
 
      int my_lib_function();
 
      #endif // myproj_hh
 
    ‘src/main.cpp’
      /** main.cpp ---
       */
 
      #include <iostream>
      #include "myproj.hh"
 
      int main() {
 
      }
 
      #ifdef IMPORTANT_MACRO
      int my_fcn() {
 
      }
      #endif
 
    ‘src/mylib.cpp’
      /** mylib.cpp ---
       *
       * Shared Library to build
       */
 
      int my_lib_function() {
 
      }
 
 3.3 Step 3: Create subprojects
 ==============================
 
 EDE needs subdirectories to also have projects in them.  You can now
 create those projects.
 
    With ‘main.cpp’ as your current buffer, type:
 
      M-x ede-new RET Automake RET src RET
 
    and in ‘myproj.hh’ as your current buffer, type:
 
      M-x ede-new RET Automake RET include RET
 
    These steps effectively only create the Project.ede file in which you
 will start adding targets.
 
 3.4 Step 4: Create targets
 ==========================
 
 In order to build a program, you must have targets in your EDE Projects.
 You can create targets either from a buffer, or from a ‘dired’ directory
 buffer.
 
    Note: If for some reason a directory list buffer, or file does not
 have the ‘Project’ menu item, or if EDE keybindings don’t work, just use
 ‘M-x revert-buffer RET’ to force a refresh.  Sometimes creating a new
 project doesn’t restart buffers correctly.
 
    Lets start with the header file.  In ‘include/myproj.hh’, you could
 use the menu, but we will now start using the EDE command prefix which
 is ‘C-c .’.
 
      C-c . t includes RET miscellaneous RET y
 
    This creates a misc target for holding your includes, and then adds
 myproj.hh to the target.  Automake (the tool) has better ways to do
 this, but for this project, it is sufficient.
 
    Next, visit the ‘src’ directory using dired.  There should be a
 ‘Project’ menu.  You can create a new target with
 
      . t myprogram RET program RET
 
    Note that ‘. t’ is a command for creating a target.  This command is
 also in the menu.  This will create a target that will build a program.
 If you want, visit ‘Project.ede’ to see the structure built so far.
 
    Next, place the cursor on ‘main.cpp’, and use ‘. a’ to add that file
 to your target.
 
      . a myprogram RET
 
    Note that these prompts often have completion, so you can just press
 ‘TAB’ to complete the name ‘myprogram’.
 
    If you had many files to add to the same target, you could mark them
 all in your dired buffer, and add them all at the same time.
 
    Next, do the same for the library by placing the cursor on
 ‘mylib.cpp’.
 
      . t mylib RET sharedobject RET
      . a mylib RET
 
 3.5 Step 5: Compile, and fail
 =============================
 
 Next, we’ll try to compile the project, but we aren’t done yet, so it
 won’t work right away.
 
    Visit ‘/tmp/myproject/Project.ede’.  We’re starting here because we
 don’t have any program files in this directory yet.  Now we can use the
 compile command:
 
      C-c . C
 
    Because this is the very first time, it will create a bunch of files
 for you that are required by Automake.  It will then use automake to
 build the support infrastructure it needs.  This step is skipped if you
 choose just a ‘Makefile’ build system.
 
    After the Automake init, it runs compile.  You will immediately
 discover the error in main.cpp can’t find ‘myproj.hh’.  We need to go
 fix this.
 
 3.6 Step 6: Customizing your project
 ====================================
 
 To fix the failed compile, we need to add ‘/tmp/myproject/include’ to
 the include path.
 
    Visit ‘main.cpp’.
 
      M-x customize-project RET
 
    Select the ‘[Settings]’ subgroup of options.  Under ‘Variable :’
 click ‘[INS]’.  At this point, you need to be somewhat savvy with
 Automake.  Add a variable named ‘CPPFLAGS’, and set the value to
 ‘../include’.
 
    You should see something like this:
 
      Variables :
      [INS] [DEL] Cons-cell:
                  Name: AM_CPPFLAGS
                  Value: -I../include
      [INS]
      Variables to set in this Makefile.
 
    Click ‘[Apply]’.  Feel free to visit ‘Project.ede’ to see how it
 changed the config file.
 
    Compile the whole project again with ‘C-c . C’ from ‘main.cpp’.  It
 should now compile.
 
 3.7 Step 7: Shared library dependency
 =====================================
 
 Note: Supporting shared libraries for Automake in this way is easy, but
 doing so from a project of type Makefile is a bit tricky.  If you are
 creating shared libraries too, stick to Automake projects.
 
    Next, lets add a dependency from ‘main.cpp’ on our shared library.
 To do that, update main like this:
 
      int main() {
 
        my_lib_function();
 
      }
 
    Now compile with:
 
      C-c . c
 
    where the lower case ‘c’ compiles just that target.  You should see
 an error.
 
    This time, we need to add a dependency from ‘main.cpp’ on our shared
 library.  To do that, we need to customize our target instead of the
 project.  This is because variables such as the include path are treated
 globally, whereas dependencies for a target are target specific.
 
      M-x customize-target RET
 
    On the first page, you will see an Ldlibs-local section.  Add mylib
 to it by first clicking ‘[INS]’, and they adding the library.  It should
 look like this:
 
      Ldlibs-Local :
      [INS] [DEL] Local Library: libmylib.la
      [INS]
      Libraries that are part of this project. [Hide Rest]
      The full path to these libraries should be specified, such as:
      ../lib/libMylib.la  or ../ar/myArchive.a
 
    You will also see other variables for library related flags and
 system libraries if you need them.  Click ‘[Accept]’, and from
 ‘main.cpp’, again compile the whole project to force all dependent
 elements to compile:
 
      C-c . C
 
 3.8 Step 8: Run your program
 ============================
 
 You can run your program directly from EDE.
 
      C-c . R RET RET
 
    If your program takes command line arguments, you can type them in
 when it offers the command line you want to use to run your program.