Сборка zLib с помощью CMake - PullRequest
       40

Сборка zLib с помощью CMake

1 голос
/ 10 октября 2019

Я пытаюсь собрать Zlib и quazip Automatic с остальной частью моего проекта. Я хочу сделать это аналогичным образом, добавив googletest в свой проект. zLib и Quazip должны быть связаны статически с моим приложением.

Я хочу сделать это из-за причин CI / CD, и если кто-то еще хочет создать проект, ему не нужно беспокоиться об этих зависимостях (особенно в Windows) ...

  1. Загрузить его во время настройки с помощью CMake ExternalProject_Add
  2. добавить его на целевом уровне

Моя структура выглядит следующим образом:

project/
├── CMakelists.txt (1)
├── sources/
│   ├── APP/
│   │   ├── CMakeLists.txt (2)
│   │   ├── thirdparty/
│   │   │   ├── CMakeLists.txt (3)
│   │   │   ├── zlib
│   │   │   │   ├── CMakeLists.txt.in
│   │   │   ├── quazip
│   │   │   │   ├── CMakeLists.txt.in
│   │   │   │   ├── CMakeListsBuild.txt.in

Это достаточно сложно, но позвольте мне показать вам, что я делаю где ...

(1) CMakeLists.txt

Особо отмечая, просто добавляя все пакеты вместе, как APP

(2) CMakeLists.txt

cmake_minimum_required(VERSION 3.15.2)

project(Project VERSION 0.0.1)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

#Add the needed Qt Components
find_package(Qt5 COMPONENTS
                            Core
                            Network
                            REQUIRED)

add_subdirectory(thirdparty) 

SET(INCLUDES
    ...
    )

SET(SOURCES
    ...
    )

target_compile_options(${PROJECT_NAME}  PUBLIC
                                        ...
                                        )

target_compile_definitions(${PROJECT_NAME} PUBLIC
                                                    QUAZIP_STATIC )

target_include_directories(${PROJECT_NAME} PRIVATE
    OtherIncludes
    "${QUAZIP_INCLUDE_DIR}"
    )

target_link_libraries(${PROJECT_NAME}
    Qt5::Network
    Qt5::Core
    SomeOtherDep
    quazip_static  <---- adding static targets here
    zlibstatic     <---- adding static targets here
    )

(3) CMakeLists.txt

# Download and unpack at configure time
configure_file(zlib/CMakeLists.txt.in zlib-download/CMakeLists.txt)

execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/zlib-download"
)
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/zlib-download"
)

add_subdirectory("${CMAKE_BINARY_DIR}/zlib-src"
                 "${CMAKE_BINARY_DIR}/zlib-build"
)

# Download and unpack at configure time
configure_file(quazip/CMakeLists.txt.in quazip-download/CMakeLists.txt)

execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/quazip-download"
)
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/quazip-download"
)

configure_file(quazip/CMakeListsBuild.txt.in ${CMAKE_BINARY_DIR}/quazip-src/CMakeLists.txt COPYONLY)

add_subdirectory("${CMAKE_BINARY_DIR}/quazip-src"
                 "${CMAKE_BINARY_DIR}/quazip-build"
)

set(QUAZIP_INCLUDE_DIR
                "${CMAKE_BINARY_DIR}/quazip-src/quazip" PARENT_SCOPE)

Два CMakeLists.txt.in имеют почти одинаковое содержимое .. .

cmake_minimum_required(VERSION 2.8.2)

include(ExternalProject)

project(quazip-download NONE)

ExternalProject_Add(quazip
    GIT_REPOSITORY git://github.com/stachenov/quazip.git
    GIT_TAG v0.8.1
    SOURCE_DIR "${CMAKE_BINARY_DIR}/quazip-src"
    BINARY_DIR "${CMAKE_BINARY_DIR}/quazip-build"
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    TEST_COMMAND ""
)
cmake_minimum_required(VERSION 2.8.2)

include(ExternalProject)

project(zlib-download NONE)

ExternalProject_Add(zlib
    GIT_REPOSITORY git://github.com/madler/zlib.git
    GIT_TAG v1.2.11
    SOURCE_DIR "${CMAKE_BINARY_DIR}/zlib-src"
    BINARY_DIR "${CMAKE_BINARY_DIR}/zlib-build"
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    TEST_COMMAND ""
)

Затем в папке quazip находится последний файл CMakeListsBuild.txt.in. Я просто редактирую исходный файл и напрямую добавляю зависимости zlib. Это выглядит так:

cmake_minimum_required(VERSION 2.6)
project(QuaZip)

...
EVERYTHING ORIGINAL 
...
# Use system zlib on unix and Qt ZLIB on Windows
# will be set from outside ZLIB_LIBRARIES ZLIB_INCLUDE_DIRS
--------------------ADDED BY ME REMOVED find_packages...
set(ZLIB_INCLUDE_DIRS   ${CMAKE_BINARY_DIR}/zlib-src
                        ${CMAKE_BINARY_DIR}/zlib-build)
if(UNIX)
    set(ZLIB_LIBRARIES
                    "${CMAKE_BINARY_DIR}/zlib-build/libz.a")
elseif(MINGW)
    set(ZLIB_LIBRARIES
                    "${CMAKE_BINARY_DIR}/zlib-build/libzlibstatic.a")
endif()


...
EVERYTHING ORIGINAL 
...

Вопрос

Загрузка и сборка статической библиотеки zlib работает, но я получаюследующая ошибка при компиляции под linux.

/home/linuxmint/someDirectory/build/zlib-src/test/example.c:8:10: fatal error: zlib.h: No such file or directory
 #include "zlib.h"
          ^~~~~~~~
compilation terminated.
zlib-build/CMakeFiles/example.dir/build.make:75: recipe for target 'zlib-build/CMakeFiles/example.dir/test/example.o' failed
make[2]: *** [zlib-build/CMakeFiles/example.dir/test/example.o] Error 1
CMakeFiles/Makefile2:1355: recipe for target 'zlib-build/CMakeFiles/example.dir/all' failed
make[1]: *** [zlib-build/CMakeFiles/example.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

Это странная часть, которую я не понимаю. Если я смотрю в CMakeLists из Zlib. ( LINK ) Они добавляют все из исходной и двоичной папок во включаемую с этим:

include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})

Так что я не понимаю, почему пример zlib (и все остальное, чтонужно zlib.h) не может быть сборка ... Perhabs, у кого-то есть подсказка ... Спасибо ...

Редактировать

Если я установлю заголовки с подходящими строительными работами ... Но почему;) Так как нигде find_package не называется ...

1 Ответ

2 голосов
/ 11 октября 2019

Благодаря @squarekittles, которые указали мне правильное направление.

В CMakeLists.txt zlib каталог включения указан как ${CMAKE_SOURCE_DIR}. Это, конечно, неправильный каталог ...

Я добавил дополнительный файл CMakeLists.txt.in для zlib, который заменит исходный. Все равно только две строки разные:

...
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
                                                        ^~~~~~~~~~~~~ Added in


#============================================================================
# zlib
#============================================================================

set(ZLIB_PUBLIC_HDRS
    ${CMAKE_CURRENT_BINARY_DIR}/zconf.h
    ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h
)     ^~~~~~~~~~~~~ Added in

...

Теперь примеры компилируются ... Также мне нужно было добавить заголовки zlib в мой проект, сделал это путем редактирования CMakeLists.txt (3)

...
configure_file(zlib/CMakeListsBuild.txt.in ${CMAKE_BINARY_DIR}/zlib-src/CMakeLists.txt COPYONLY) <--- Replacing CMakeLists.txt for zlib
...

set(QUAZIP_INCLUDE_DIR
                "${CMAKE_BINARY_DIR}/quazip-src/quazip" 
                ${ZLIB_INCLUDE_DIR} PARENT_SCOPE)
                  ^~~~~~~~~~~~ Added in
...
...