Cmake/cpack: как создать deb статической библиотеки libc++ без заголовков?

Сегодня вечером я пытался создать deb для LLVM libc++ 3.4 на 64-битной машине Ubuntu 12.04LTS. Я хотел бы сначала создать deb, который состоит только из /usr/lib64/libc++.a без каких-либо заголовков. Да, я знаю согласно руководству по упаковке библиотеки Debian, я должен включить файл в пакет *-dev, но, будучи новичком в cmake и cpack, я хотел бы получить его постепенно.

Итак, я сначала изменил libcxx-3.4/lib/CMakeLists.txt и добавил проверку if (см. строки 14 и 18).

$ cat CMakeLists.txt
 1  if (NOT LIBCXX_INSTALL_SUPPORT_HEADERS)
 2    set(LIBCXX_SUPPORT_HEADER_PATTERN PATTERN "support" EXCLUDE)
 3  endif()
 4  
 5  file(COPY .
 6    DESTINATION "${CMAKE_BINARY_DIR}/include/c++/v1"
 7    FILES_MATCHING
 8    PATTERN "*"
 9    PATTERN "CMakeLists.txt" EXCLUDE
10    PATTERN ".svn" EXCLUDE
11    ${LIBCXX_SUPPORT_HEADER_PATTERN}
12    )
13  
14  if (${LIBCXX_ENABLE_SHARED} MATCHES "ON")
15    install(DIRECTORY "${CMAKE_BINARY_DIR}/include/c++/v1/"
16      DESTINATION include/c++/v1/
17      )
18  endif()

Затем в подкаталоге build я выдал

CC=clang CXX=clang++ cmake -j2 -G "Unix Makefiles" -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_LIBCXXABI_INCLUDE_PATHS="../libcxxabi/include" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ../libcxx -DLIBCXX_ENABLE_SHARED=OFF

Созданный deb по-прежнему состоит из всех заголовков. Если я закомментировал строки с 14 по 18, то в пакете не было заголовков. Я озадачен этим. Переменная, определенная для родительского элемента CMakeLists.txt, должна использоваться дочерним элементом CMakeLists.txt. Что я пропустил? Я был бы признателен за намек или два.


person user183394    schedule 04.03.2014    source источник


Ответы (2)


Я нашел ответ на свой вопрос. Будучи новичком в cmake и cpack, я изначально сосредоточился на неправильном CMakeLists.txt. Команда install для заголовков в include/CMakeLists.txt не единственная. В основном файле CMakeLists.txt есть макрос, в котором также есть команда install. Это тоже должно быть отключено. Конкретно:

В основном CMakeLists.txt можно было сделать:

   129    message(STATUS "Inside of setup_abi_libs; LIBCXX_ENABLE_SHARED: ${LIBCXX_ENABLE_SHARED}")
   130    if (LIBCXX_ENABLE_SHARED)
   131      install(DIRECTORY "${CMAKE_BINARY_DIR}/include/"
   132        DESTINATION include/c++/v1
   133        FILES_MATCHING
   134        PATTERN "*"
   135        )
   136    endif()
   137  endmacro()

Затем в include/CMakeLists.txt можно было бы сделать:

13  
14  message(STATUS "Inside of include; LIBCXX_ENABLE_SHARED: ${LIBCXX_ENABLE_SHARED}")
15  
16  if (LIBCXX_ENABLE_SHARED)
17    install(DIRECTORY "${CMAKE_BINARY_DIR}/include/c++/v1/"
18      DESTINATION include/c++/v1/
19      )
20  endif()

Это конечный результат, который я пытался получить, но не смог прошлой ночью:

$ dpkg-deb -c libcxx_3.4-1_amd64.deb 
drwxrwxr-x root/root         0 2014-03-04 08:59 ./usr/
drwxrwxr-x root/root         0 2014-03-04 08:59 ./usr/lib64/
-rw-r--r-- root/root   1928770 2014-03-04 08:58 ./usr/lib64/libc++.a

Заголовков больше нет. Теперь мне просто нужно выяснить, как изменить исходные файлы CMakeLists.txt, чтобы сделать настоящий пакет для разработчиков :)

person user183394    schedule 04.03.2014
comment
Привет, Питер, чтобы принять мой собственный ответ, есть двухдневный период ожидания. Я буду. Спасибо еще раз. - person user183394; 04.03.2014

Прочтите документацию для if:

MATCHES для регулярных выражений, вместо них используйте if (LIBCXX_ENABLE_SHARED) или if (${LIBCXX_ENABLE_SHARED} STREQUAL "ON")

person Peter    schedule 04.03.2014
comment
Питер. Спасибо за ответ. ИМХО проблема не связана с синтаксисом if. Я попробовал оба предложенных вами варианта, но все заголовки по-прежнему включены cpack. Я сделаю простой тестовый пример и посмотрю, смогу ли я понять это. - person user183394; 04.03.2014