Existen varías opciones para llevar a cabo estas tareas, me centraré en Autotools (automake), Cmake, y qmake (para proyectos que usen QT). Los IDE de desarrollo más avanzados ya integran estas herramientas, e incluso existen algunas interfaces gráficas que ayudan a la generación del Makefile como son la GUI de Cmake o el imake, pero que no trataré en el taller pero es bueno que sepais de su existencia.
CMake
Lo primero de todo instalar CMake: ~$ sudo apt-get install cmake
Al igual que el fichero Makefile que generamos a mano anteriormente (y del cual ahora hay que olvidarse), debemos crear un fichero llamado CMakeLists.txt dentro del directorio donde se encuentra nuestro software.
El CMakeLists.txt no sirve para generar únicamente un Makefile, así que me ceñire a una sintaxis simple y más que suficiente:
#Nombra al proyecto con el nombre bloguero, gracias a esto se definen 2 variables que pueden usarse dentro del CMakeList.txt mas adelante, ${BLOGUERO_SOURCE_DIR} directorio del codigo fuente, y ${BLOGUERO_BINARY_DIR} directorio donde se encuentran los compilados.
PROJECT(bloguero)
#Indica que vesión mínima de cmake se necesita. Si no se indica puede dar warnings.
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
#Añade el directorio ./src a la lista de directorios que compone el proyecto. Se pueden añadir tantos directorios como se necesiten, repitiendo esta línea y poniendo el nombre. Dentro del directorio, en este caso src debe existir otro fichero CMakeLists.txt
ADD_SUBDIRECTORY(src)
#Define una variable NOMBRE_EJECUTABLE dentro de la cuál se almacena el nombre de nuestro programa, bloguero
SET(NOMBRE_EJECUTABLE bloguero)
#Define para el compilador, en este caso opciones de compilación
ADD_DEFINITIONS( "-Wall -O2 -ansi -pedantic" )
#Para buscar una librería que pueda necesitarse en la compilación o en el CMakeLists.txt . En NAMES se indica el nombre la librería,y en PATHS las rutas donde debe buscar. LIB_SERIAL será una variable que se creará con el resultado de la búsqueda.Al igual que existe un FIND_LIBRARY también existe un FIND_PROGRAM para buscar librerías, que sigue la misma sintaxis
FIND_LIBRARY(LIB_SERIAL
NAMES libserial
PATHS /usr/lib
/usr/local/lib)
#Si no se encontró la librería se muestra un mensaje de error. Hay varios tipos de mensajes, como STATUS y varios tipos de condiciones para el IF, NO
IF(LIB_SERIAL)
#Añade la librería para el enlazado
TARGET_LINK_LIBRARIES(bloguero LIB_SERIAL)
ELSE(LIB_SERIAL)
MESSAGE("imposible encontrar la libreria libserial")
ENDIF(LIB_SERIAL)
#Incluye directorios para los ficheros de cabecera en el proyecto
INCLUDE_DIRECTORIES(./cabeceras)
#Incluye directorios para buscar librerías en el proyecto
LINK_DIRECTORIES(./librerias)
#Indica el nombre del ejecutable contenido en NOMBRE_EJECUTABLE y los ficheros fuente que se usaran (fichero1.cpp,fichero2.cpp...) para la compilación. Si quisiéramos que en lugar de un ejecutable, compilará en forma de librería, se haría con la siguiente instrucción ADD_LIBRARY(bloguerolib SHARED fichero1.cpp fichero2.cpp) donde SHARED se puede sustituir por STATIC en función de si queremos una librería dinámica .a o estática .so
ADD_EXECUTABLE(${NOMBRE_EJECUTABLE} fichero1.cpp fichero2.cpp fichero3.cpp)
#Indica que el ejecutable cuyo nombre esta almacenado en la variable NOMBRE_EJECUTABLE requiere para enlazar la librería pthread (lpthread)
TARGET_LINK_LIBRARIES(${NOMBRE_EJECUTABLE} pthread)
#Instala el ejecutable bloguero que se encuentra en la carpeta raíz del proyecto en el directorio /usr/local/bin si quisieramos instalar una libreria, en destination sustituiríamos bin por lib y se instalaría en /usr/local/lib Como se puede observar, se indican también los permisos que tendra trás la instalación
INSTALL(FILES ./bloguero
DESTINATION bin
PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
En este CMakeLists.txt me he explayado un poco, y he puesto cosas que no son necesarias en absoluto. He faltado un poco a la palabra de simple, pero ha sido para moestrar un poco la potencia. Un ejemplo super simple sería:
PROJECT( bloguero )
ADD_EXECUTABLE( bloguero main.cpp)
Un Ejemplo intermedio en complejidad:
PROJECT( bloguero )En este se genera una librería dinámica .so y después se incluye para el enlazado para la generación del ejecutable.
SET(LIBSRC bloguerolib )
SET(SRC bloguero )
ADD_LIBRARY( bloguerolib SHARED ${LIBSRC} )
ADD_EXECUTABLE( bloguero ${SRC} )
TARGET_LINK_LIBRARIES( bloguero bloguerolib )
No hay comentarios:
Publicar un comentario