Сборка библиотеки с использованием автоинструментов из cmake - PullRequest
31 голосов
/ 12 мая 2011

Это моя первая попытка использования cmake, и я хотел бы получить, если возможно, некоторые отзывы о том, что я сделал, поскольку остаются некоторые проблемы.

В CMakeLists.txt папки библиотеки я создал двацели makefile: configure-antlr3c и antlr3c.Первая цель запускает скрипт оболочки конфигурации autotools, вторая запускает исполняемый файл make для сборки библиотеки:

# CMakeLists.txt in libantlr3c-3.1.3 
add_custom_target(
  configure-antlr3c
  ${SHELL_EXECUTABLE} configure
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

add_custom_target(
  antlr3c
   ${MAKE}
   DEPENDS configure-antlr3c
   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

Основная проблема в том, что цель configure-antlr3c всегда «устарела», поэтомувсегда будет выполняться, даже если никаких изменений не произошло.Более того, мне обязательно нужно сгенерировать мои make-файлы cmake в отдельном каталоге (не в корневом каталоге моего проекта), чтобы избежать переопределения autofols Makefile библиотеки ...

У кого-нибудь была такая проблема (сборка autotoolsпроекты с cmake)?И если да, то каковы были ваши решения?

Спасибо.

РЕДАКТИРОВАТЬ: Решение В корне CMakeLists.txt:

include(ExternalProject)
ExternalProject_Add(
  libantlr3c
  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
  CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3/configure --prefix=${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
  PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
  BUILD_COMMAND make
  BUILD_IN_SOURCE 1
)

1 Ответ

45 голосов
/ 12 мая 2011

Я думаю, вам лучше использовать функцию ExternalProject в cmake.Я полагаю, у вас есть проект и есть libantrl в подкаталоге?

project
      +- libantlr
      +- mysrc
  ---- etc ----

Если это так, вы можете сделать что-то подобное в верхнем уровне CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(test)
include(ExternalProject)
ExternalProject_Add(libantlr
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libantlr
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/libantlr/configure --prefix=<INSTALL_DIR>
    BUILD_COMMAND ${MAKE})

The <INSTALL_DIR> расширен на что-то вроде libantlr-приставкой, так что вещи будут установлены в дереве сборки, а не в / USR / местные, что и Autotools бы обойтись без префикса.

...