...
# Вместо этой строчки также можно указать путь из командой строки:
# $ cmake -DOPENSSL_ROOT_DIR=/usr/local/ssl -DOPENSSL_LIBRARIES=/usr/local/ssl/lib ..
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/openssl)
# Используем FindOpenSSL.cmake для поиска
find_package(OpenSSL REQUIRED)
...
target_link_directories(my_target ${CMAKE_CURRENT_SOURCE_DIR}/openssl/lib)
target_link_libraries(my_target PRIVATE crypto ssl)
add_executable(
my_target
path/to/generated/file_1
path/to/generated/file_2
)
add_custom_command(
OUTPUT # Файлы, которые генерируем
path/to/generated/file_1
path/to/generated/file_2
COMMAND # Команда генерации
python generate.py
DEPENDS # Файл конфига (CMake должен сам отслеживать изменения этого файла и вызывать COMMAND если это необходимо)
path/to/config.cfg
)
include_directories("C:\\Program Files\\...\\include") #в этой папке tlhelp32.h
packages_test
├── .git
├── cmake // Папка с доп. CMake скриптами если в этом есть необходимость
├── build // Результат сборки
│ └─ res.exe // Исполняемый файл
├── CMakeLists.txt // Конфигурация сборки проекта
├── src
│ ├─ main.cpp // Точка входа, main()
│ └─ ...// Прочие файлы проекта
├── dependencies // Зависимости (подключаются через механизм submodule)
│ ├─ vendor_package_0 // У каждой зависимости своя внутренняя организация
│ └─ vendor_package_1
└── test // Тесты
├── CMakeLists.txt
└── src
└── test_main.cpp
cmake_minimum_required(VERSION 3.0)
project(playrix_project VERSION 1.0 LANGUAGES CXX)
add_executable(playrix src/main.cpp)
# Импортируем наши зависимости. Это не приводит к сборке, но просто позволяет нам использовать target'ы этих проектов.
add_subdirectory(dependencies/vendor_package_0)
add_subdirectory(dependencies/vendor_package_1)
# Забудьте про include_directories и link_directories! В современном CMake следует использовать targets и properties.
# Опредеяем зависимости нашего проекта
target_link_libraries(playrix # Имя нашего executable'а
PRIVATE # Определяет область видимости зависимостей для внешних проектов
vendor_package_0_target # Настоящее имя target'а надо смотреть в vendor_package_0 CMakeLists.txt (add_library)
vendor_package_1_target
)
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project(mylib_combined VERSION 0.1 LANGUAGES CXX)
# Нам нужны статические либы
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS system filesystem REQUIRED)
# Наша собственная либа.
# К сожалению мы не может использовать add_library OBJECT либу, т.к.
# CMake не умеет работать с IMPORTED OBJECT либами, т.е. он не умеет
# экстрактить (ar -x) существующею static либу, чтобы собрать её потом
# в одну большую (ar -qcs).
add_library(mylib mylib.cpp)
add_custom_command(
TARGET mylib
POST_BUILD
# Экстрактим нашу свежесобранную либу. Не самое красивое решение, но
# что поделать ¯\_(ツ)_/¯
COMMAND ar -x $<TARGET_FILE:mylib>
# Теперь наши буст либы
COMMAND ar -x ${Boost_SYSTEM_LIBRARY}
COMMAND ar -x ${Boost_FILESYSTEM_LIBRARY}
# А теперь собираем всё обратно
COMMAND ar -qcs lib${PROJECT_NAME}.a *.o
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project(mylib_combined VERSION 0.1 LANGUAGES CXX)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS system filesystem REQUIRED)
add_library(mylib mylib.cpp)
add_custom_target(mylib_packer
COMMAND ar -x $<TARGET_FILE:mylib>
COMMAND ar -x ${Boost_SYSTEM_LIBRARY}
COMMAND ar -x ${Boost_FILESYSTEM_LIBRARY}
COMMAND ar -qcs lib${PROJECT_NAME}.a *.o
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS mylib
)
add_library(mylib_combined STATIC IMPORTED GLOBAL)
add_dependencies(mylib_combined mylib_packer)
set_target_properties(mylib_combined
PROPERTIES
IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.a
)