From 81b579568ad0a0c6d390093c4075b8abac071899 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sun, 23 Aug 2015 17:05:45 +0300 Subject: [PATCH] CMake: Refactor build files. --- CMakeLists.txt | 72 +++++++++++++++++++++++++++++++--------------- bin/CMakeLists.txt | 2 +- lib/CMakeLists.txt | 5 ++-- src/CMakeLists.txt | 14 ++++++++- 4 files changed, 66 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a33ff6..86e23f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,40 +1,62 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -PROJECT(pi9) -set(PI9_NAME "pi9") -set(PI9_DESCRIPTION "9p server abstraction library") +CMAKE_MINIMUM_REQUIRED(VERSION 3.0) +PROJECT(pi9 VERSION 0.0.1 LANGUAGES C) +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMake") +# Subprojects +include(subproject) +add_subdirectory(lib) + +# CPack +set(CPACK_SYSTEM_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") +set(CPACK_GENERATOR "7Z") +set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}") +set(CPACK_PACKAGE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pkg") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "9p server abstraction library") +set(CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION ON) + +# Includes +include(GNUInstallDirs) +include(FeatureSummary) +include(CPack) + +OPTION(PI9_BUILD_STATIC "Build pi9 as static library" OFF) OPTION(PI9_BUILD_BINARIES "Build binaries" ON) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${pi9_SOURCE_DIR}/CMake) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) +add_feature_info(Static PI9_BUILD_STATIC "Compile as static library") +add_feature_info(Tests PI9_BUILD_TESTS "Compile tests") + +if (NOT PI9_BUILD_STATIC) + set(BUILD_SHARED_LIBS ON) +endif () + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) - set(ldflags -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now) + set(ldflags -Wl,-O1,--no-undefined,--sort-common,--as-needed,-z,relro,-z,now) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ldflags}") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${ldflags}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ldflags}") + + if ("${CMAKE_C_FLAGS}" STREQUAL "") + add_definitions(-O2) + add_definitions(-fstack-protector-strong -fstack-check -flto) + endif () + add_definitions( -Wall -Wextra -Wno-variadic-macros -Wno-long-long -Wformat=2 -Winit-self -Wfloat-equal -Wcast-align -Wpointer-arith -Wmissing-prototypes -Wsuggest-attribute=pure -Wsuggest-attribute=const) - add_definitions(-fstack-protector-strong -fstack-check -pie -flto) -endif () - -if (UNIX AND CMAKE_COMPILER_IS_GNUCC) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - if (${CMAKE_VERSION} VERSION_LESS 2.8.9) - add_definitions(-fPIC) - endif () endif () -add_definitions(-std=c99 -D_DEFAULT_SOURCE) +# -std=c99 -fpic -fpie -D_DEFAULT_SOURCE +set(CMAKE_C_STANDARD 99) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE OFF) +add_definitions(-D_DEFAULT_SOURCE) -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/src - ${CMAKE_CURRENT_SOURCE_DIR}/lib/chck) - -add_subdirectory(lib) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src ${CHCK_INCLUDE_DIRS}) add_subdirectory(src) if (PI9_BUILD_BINARIES) @@ -42,3 +64,7 @@ if (PI9_BUILD_BINARIES) endif () file(COPY src/pi9.h src/pi9_string.h DESTINATION include/pi9) + +if ("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}") + feature_summary(WHAT ALL) +endif () diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index b58901c..10223a4 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -1,2 +1,2 @@ add_executable(server server.c) -target_link_libraries(server pi9 chck_pi9_server) +target_link_libraries(server PRIVATE pi9 ${CHCK_LIBRARIES}) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 77a0897..3ed264c 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,2 +1,3 @@ -add_library(chck_pi9_lib STATIC chck/chck/buffer/buffer.c) -add_library(chck_pi9_server STATIC chck/chck/pool/pool.c chck/chck/lut/lut.c) +set(CHCK_BUILD_STATIC ON CACHE STRING "Build chck statically if not found systemwide" FORCE) +set(CHCK_BUILD_TESTS OFF CACHE STRING "Do not build chck tests" FORCE) +add_subproject(chck) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d9df488..8e35d39 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,2 +1,14 @@ add_library(pi9 pi9.c pi9_string.c) -target_link_libraries(pi9 chck_pi9_lib) +target_link_libraries(pi9 PRIVATE ${CHCK_LIBRARIES}) + +# Parse soversion version +string(REGEX MATCHALL "[0-9]+" VERSION_COMPONENTS ${PROJECT_VERSION}) +list(GET VERSION_COMPONENTS 0 SOVERSION) +set_target_properties(pi9 PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${SOVERSION}) + +set(PI9_LIBRARIES pi9 CACHE STRING "Libraries of pi9" FORCE) +set(PI9_INCLUDE_DIRS "${PROJECT_BINARY_DIR}/include" CACHE STRING "Include directories of pi9" FORCE) +mark_as_advanced(PI9_LIBRARIES PI9_INCLUDE_DIRS) + +install(TARGETS pi9 DESTINATION "${CMAKE_INSTALL_LIBDIR}") +install(DIRECTORY "${PROJECT_BINARY_DIR}/include/pi9" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")