Показаны сообщения с ярлыком cmake. Показать все сообщения
Показаны сообщения с ярлыком cmake. Показать все сообщения

четверг, 2 сентября 2010 г.

Простой проект с использованием CMake, log4cxx, boost

Планируется серия постов, посвященных разработке простого проекта на C++, использующего библиотеки boost, log4cxx, и собираемого CMake. Будет рассмотрена интеграция с Visual Studio 2010 и Eclipse Helios CDT, соответственно проект будет собираться под Windows и Linux. Отдельные детали уже были описаны в предыдущих постах, сейчас же рассмотрим все в подробностях.

Примерный план такой:

  1. Сборка log4cxx под Windows

  2. Установка boost под Windows
  3. Разработка структуры проекта
  4. Написание кода
  5. Конфигурация log4cxx
  6. Сборка CMake'ом под Windows
  7. Интеграция с Visual Studio 2010
  8. Установка библиотек и сборка CMake'ом под Linux
  9. Интеграция с Eclipse Helios CDT
Больше внимания будет уделено Windows, поскольку для нее все оказалось сложнее и не так прямолинейно, как для Linux.

суббота, 21 августа 2010 г.

Visual Studio 2010: Clean command line, переменные среды

При выполнении команды Clean в C++ проекте типа Makefile project команды запускаются в некорректном окружении: cmake ругается на отсутствие необходимых переменных, nmake не доступен в PATH. Проблема известна, но предложенный workaround с ключом useenv не работает, неправильное окружение получают и команды Build и Rebuild.


Update: решение найдено. Необходимо в Clean command line добавить вызов bat-файла, устанавливающего необходимые переменные среды. Этот bat-файл используется в ярлыке Visual Studio Command Prompt (2010).

call "$(VCInstallDir)vcvarsall.bat"

set BUILD_DIR="$(ProjectDir)$(Configuration)"
set PROJECT_DIR="$(ProjectDir)..\..\.."
 
if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake clean

вторник, 17 августа 2010 г.

CMake, Visual Studio, отладка

Чтобы отлаживать проект CMake'а в студии, необходимо указать следующее в поле Command страницы Debugging свойств проекта:
$(TargetDir)$(ConfigurationName)\$(TargetName)\$(TargetFileName)

Update:Для Visual Studio 2010 путь будет другой.

$(ProjectDir)$(Configuration)\$(ProjectName)\$(ProjectName).exe

Так же имеет смысл указать Working Directory, использовав путь к исполняемому файлу. Для VS 2010:

$(ProjectDir)$(Configuration)\$(ProjectName)\

Update2: эти установки сохраняются не в файле проекта, а файле *.vcxproj.user

вторник, 10 августа 2010 г.

CMake: интеграция с Visual Studio

Есть проект, описанный здесь, нужно интегрировать его с VS.

Структура директорий следующая:
C:\DOCUMENTS AND SETTINGS\user\DESKTOP\CMAKE_TEST
│   CMakeLists.txt
│
├───cli
│   │   CMakeLists.txt
│   │
│   └───src
│           main.cpp
│
├───core
│   │   CMakeLists.txt
│   │
│   ├───include
│   │       core.hpp
│   │
│   └───src
│           core.cpp
│           core.hpp
│
└───ide_files
    └───vs
        │   CMake_test.sln
        │
        ├───cli
        │       cli.vcproj
        │
        └───core
                core.vcproj

В студии нужно создать солюшен и добавить в него два проекта, соответствующие подпроектам CMake, подробно это описано здесь. В каждый из проектов нужно добавить соответствующие исходные файлы (правой кнопкой по проекту --> Add --> Existing Item). Но команды для сборки проекта будут другие:
set BUILD_DIR="$(TargetDir)$(ConfigurationName)"
set PROJECT_DIR="$(TargetDir)..\..\.."

if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake all

set BUILD_DIR="$(TargetDir)$(ConfigurationName)"
set PROJECT_DIR="$(TargetDir)..\..\.."

if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake clean all

set BUILD_DIR="$(TargetDir)$(ConfigurationName)"
set PROJECT_DIR="$(TargetDir)..\..\.."

if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(ConfigurationName) -G "NMake Makefiles" %PROJECT_DIR%
nmake clean

В поле Output должно быть написано core.lib для проекта core и cli.exe для проекта cli.

Исходный код здесь.

Update: Выше указаны команды сборки для проекта cli. Для проекта core необходимо изменить вторую строку:

set PROJECT_DIR="$(TargetDir)..\..\..\core"

Update1: для Visual Studio 2010 первые две и 6-ая строки должны быть другими, поскольку изменились имена встроенных переменных (пример для проекта cli):
set BUILD_DIR="$(ProjectDir)$(Configuration)"
set PROJECT_DIR="$(ProjectDir)..\..\.."
 
if not exist %BUILD_DIR% mkdir %BUILD_DIR%
cd %BUILD_DIR%
cmake -DCMAKE_BUILD_TYPE=$(Configuration) -G "NMake Makefiles" %PROJECT_DIR%
nmake all

вторник, 3 августа 2010 г.

CMake: консольная программа и статическая библиотека

Необходимо написать программу с консольным интерфейсом, которая будет линковаться со статической библиотекой. Для сборки будет использован CMake.

Сначала создадим необходимую иерархию директорий:
D:\PROJECTS\SIMPLE-THINGS\TRUNK\CMAKE_TEST
│   CMakeLists.txt
│
├───cli
│   │   CMakeLists.txt
│   │
│   └───src
│           main.cpp
│
└───core
    │   CMakeLists.txt
    │
    ├───include
    │       core.hpp
    │
    └───src
            core.cpp
            core.hpp
CMAKE_TEST - главный каталог проекта. Библиотека находится в папке core, сама программа - в папке cli. В каждой из упомянутых папок есть файл CMakeLists.txt, описывающий их содержимое.

CMakeLists.txt в корневой директории проекта:
cmake_minimum_required(VERSION 2.6)
project(CMAKE_TEST)

add_subdirectory(core)
add_subdirectory(cli)
Минимально необходимой для сборки проекта версией CMake является 2.6, проект называется CMAKE_TEST, это имя будет использоваться для обращения к корневой папке из подпроектов. Две команды add_subdirectory, аргументом которых являются имена папок, необходимы для указания подпроектов.

Библиотека core состоит из единственного класса, имеющего следующий вид:
#ifndef _CORE_HPP_
#define _CORE_HPP_

class Core
{
public:
  const char * say();
};

#endif

##include "Core.hpp"

const char * Core::say()
{
  return "hello";
}

Файл проекта библиотеки такой:
set(SRC src/core.cpp)
add_library(core ${SRC})

Первая строка — список исходников, вторая строка — команда на обработку библиотеки под названием core.

Основной класс библиотеки доступен с помощью заголовочного файла:
#ifndef CORE_HPP
#define CORE_HPP

#include "../src/core.hpp"

#endif

Код самой программы предельно прост:
#include <iostream>
#include "core.hpp"

int main(int argc, char **argv)
{
  Core core;
  std::cout << core.say() << std::endl;

  return 0;
}

Особый интерес представляет CMakeLists.txt этого подпроекта:
include_directories(${CMAKE_TEST_SOURCE_DIR}/core/include)
link_directories(${CMAKE_TEST_BINARY_DIR}/core)

set(SRC src/main.cpp)

add_executable(cli ${SRC})
target_link_libraries(cli core)
Команда include_directories определяет папку, где компилятор будет искать заголовочные файлы, подключаемые с помощью include, при этом переменная CMAKE_TEST_SOURCE_DIR указывает на корневую папку проекта. link_directories определяет, где искать библиотеки для линковки, CMAKE_TEST_BINARY_DIR - директория для сборки проекта. 4-ая строка задает список исходников, add_executable говорит, что будет собираться приложение cli.exe, target_link_libraries перечисляет библиотеки, с которым его нужно слинковать. Библиотека core по умолчанию будет статической.

Для сборки в корневой папки проекта необходимо создать директорию build и в ней отдать следующие команды:
cmake ..
msbuild CMAKE_TEST.sln /t:Rebuild /p:Configuration=Release

Исходный код здесь.