Создание библиотеки с использованием autotools от cmake
Это моя первая попытка с cmake, и я хотел бы иметь, если возможно, некоторые отзывы о том, что я сделал, поскольку некоторые проблемы остаются.
В CMakeLists.txt из папки библиотеки я создал две цели makefile: configure-antlr3c
и antlr3c
. Первая цель запускает оболочку конфигурации autotools script, вторая запускает исполняемый файл 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 в отдельном каталоге (а не в корневом каталоге моего проекта), чтобы избежать переопределения файла Makefile из autotools...
У кого-нибудь была эта проблема (создание проектов autotools с cmake)? И если да, то каковы были ваши решения?
Спасибо.
EDIT: решение
В корне 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
Я думаю, что вам лучше использовать функцию 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})
<INSTALL_DIR>
расширяется до чего-то вроде libantlr-префикса, поэтому вещи устанавливаются в дереве сборки, а не в /usr/local, что будет без аутрич-кода без префикса.