Повторное использование собственного make-файла для статической библиотеки с помощью cmake - PullRequest
5 голосов
/ 24 октября 2011

Я думаю, это будет общий вопрос о включении библиотек с существующими make-файлами в cmake; но вот мой контекст -

Я пытаюсь включить scintilla в другой проект CMake, и у меня возникает следующая проблема:

В Linux у scintilla есть make-файл в (скажем) каталоге ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk; если вы запустите make в этом каталоге (как обычно), вы получите файл ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/bin/scintilla.a - который (я думаю) является статической библиотекой.

Теперь, если бы я попытался использовать ADD_LIBRARY в cmake, мне пришлось бы вручную указывать источники сцинтиллы в cmake - и я бы предпочел не связываться с этим, поскольку у меня уже есть make-файл. Итак, я бы лучше позвонил обычному сцинтилле make - и затем дал бы команду CMAKE как-то сослаться на полученный scintilla.a. ( Полагаю, что тогда не обеспечит кросс-платформенную совместимость - но учтите, что в настоящее время кросс-платформенность для меня не проблема; я просто хотел бы построить сцинтиллу как часть этого проекта который уже использует cmake, только в Linux )

Итак, я немного попробовал с этим:

ADD_CUSTOM_COMMAND(
  OUTPUT scintilla.a
  COMMAND ${CMAKE_MAKE_PROGRAM}
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk
  COMMENT "Original scintilla makefile target" )

... но затем add_custom_command добавляет цель без вывода ; поэтому я пытаюсь использовать несколько подходов, которые все терпят неудачу (ошибки приведены как комментарий):

ADD_CUSTOM_TARGET(scintilla STATIC DEPENDS scintilla.a) # Target "scintilla" of type UTILITY may not be linked into another target.

ADD_LIBRARY(scintilla STATIC DEPENDS scintilla.a) # Cannot find source file "DEPENDS".

ADD_LIBRARY(scintilla STATIC) # You have called ADD_LIBRARY for library scintilla without any source files.
ADD_DEPENDENCIES(scintilla scintilla.a)

Я, очевидно, цитирую noob с помощью cmake - поэтому можно ли вообще cmake запустить уже существующий make-файл и "перехватить" его файл выходной библиотеки, чтобы другие компоненты проекта cmake могли ссылка против этого?

Большое спасибо за любые ответы,
Ура!

РЕДАКТИРОВАТЬ: возможный дубликат: CMake: как мне зависеть от вывода из пользовательской цели? - Переполнение стека - однако, здесь, кажется, поломка вызвана необходимостью специально иметь библиотеку , которую остальная часть проекта cmake будет распознавать ...

Ответы [ 2 ]

9 голосов
/ 25 октября 2011

Вы также можете использовать импортированные цели и пользовательские цели, например:

# set the output destination
set(SCINTILLA_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk/scintilla.a)
# create a custom target called build_scintilla that is part of ALL
# and will run each time you type make 
add_custom_target(build_scintilla ALL 
                   COMMAND ${CMAKE_MAKE_PROGRAM}
                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk
                   COMMENT "Original scintilla makefile target")

# now create an imported static target
add_library(scintilla STATIC IMPORTED)
# Import target "scintilla" for configuration ""
set_property(TARGET scintilla APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
set_target_properties(scintilla PROPERTIES
  IMPORTED_LOCATION_NOCONFIG "${SCINTILLA_LIBRARY}")

# now you can use scintilla as if it were a regular cmake built target in your project
add_dependencies(scintilla build_scintilla)

add_executable(foo foo.c)
target_link_libraries(foo scintilla)

# note, this will only work on linux/unix platforms, also it does building
# in the source tree which is also sort of bad style and keeps out of source 
# builds from working.  
2 голосов
/ 24 октября 2011

ОК, я думаю, у меня это немного; в основном, в CMakeLists.txt, который строит сцинтиллу, я использовал только это:

ADD_CUSTOM_TARGET(
  scintilla.a ALL
  COMMAND ${CMAKE_MAKE_PROGRAM}
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk
  COMMENT "Original scintilla makefile target" )

... а затем, чуть более сложной задачей, было найти правильный файл cmake в другом месте проекта, где был определен ${PROJECT_NAME}, чтобы добавить зависимость:

ADD_DEPENDENCIES(${PROJECT_NAME} scintilla.a)

... и, наконец, библиотека должна быть связана.

Обратите внимание, что в приведенных выше командах scintilla.a - это просто имя / метка / идентификатор / строка (, так что это может быть что-то еще, например scintilla--a или что-то ); но для связывания - необходим полный путь к фактическому файлу `scintilla.a (который в этом проекте заканчивается переменной ${SCINTILLA_LIBRARY}). В этом проекте связь в основном происходит через форму

list(APPEND PROJ_LIBRARIES ${SCINTILLA_LIBRARY} )

... и я действительно не знаю, как cmake обрабатывает фактические ссылки впоследствии (но, похоже, это работает)

Для согласованности я попытался использовать ${SCINTILLA_LIBRARY} вместо scintilla.a в качестве идентификатора в ADD_CUSTOM_TARGET, но получил ошибку: " Имена целей не могут содержать косую черту. Используйте ADD_CUSTOM_COMMAND для генерации файлов ". Так что, вероятно, это можно решить умнее / более правильно с помощью ADD_CUSTOM_COMMAND - однако я прочитал, что это " определяет новую команду, которая может быть выполнена во время процесса сборки. Названные выходные данные должны быть перечислены как исходные файлы в цель, для которой они должны быть сгенерированы. "... И сейчас я совершенно запутался в том, что такое файл, что такое ярлык и какова цель - так что я думаю, что оставлю на этом (и не исправлю, если он не сломан :))

Ну, было бы неплохо узнать более правильный способ сделать это в конце концов,
Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...