8000 Revamped CMakeLists.txt · lineCode/docopt.cpp@d136b7b · GitHub
[go: up one dir, main page]

Skip to content

Commit d136b7b

Browse files
committed
Revamped CMakeLists.txt
Now version of the package is defined in project() directive on line 2. Removed WITH_STATIC option. Now static lib is being linked every time, but compilation of source files is performed only once (google for CMake OBJECT targets) Defined docopt_SOURCES and docopt_HEADERS more explicitly. Now docopt supports installing as "CMake native package", enabling its install system-wide.
1 parent a4177cc commit d136b7b

File tree

2 files changed

+78
-60
lines changed

2 files changed

+78
-60
lines changed

CMakeLists.txt

Lines changed: 77 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,69 @@
11
cmake_minimum_required(VERSION 3.1)
2+
project(docopt.cpp VERSION 0.6.1)
23

3-
option(WITH_TESTS "Build tests." OFF)
4-
option(WITH_EXAMPLE "Build example." OFF)
5-
option(WITH_STATIC "Build static libs." ON)
4+
include(GNUInstallDirs)
65

7-
project(docopt.cpp)
8-
include_directories("${PROJECT_SOURCE_DIR}")
9-
10-
########################################################################
11-
# Compiler properties
6+
#============================================================================
7+
# Settable options
8+
#============================================================================
9+
option(WITH_TESTS "Build tests." OFF)
10+
option(WITH_EXAMPLE "Build example." OFF)
1211

12+
#============================================================================
13+
# Internal compiler options
14+
#============================================================================
1315
# C++ standard
1416
set(CMAKE_CXX_STANDARD_REQUIRED ON)
1517
set(CMAKE_CXX_EXTENSIONS OFF)
16-
if(NOT CMAKE_CXX_STANDARD)
18+
if(NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 11)
1719
set(CMAKE_CXX_STANDARD 11)
1820
endif()
1921

2022
# Suppression of "unknown pragma" warning on GCC
2123
if(CMAKE_COMPILER_IS_GNUCXX)
22-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas") # Code uses #pragma mark
24+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas") # Code uses #pragma mark
2325
endif()
2426

25-
########################################################################
26-
# docopt
27-
28-
set(DOCOPT_SRC
29-
docopt.cpp
27+
#============================================================================
28+
# Sources & headers
29+
#============================================================================
30+
set(docopt_SOURCES docopt.cpp)
31+
set(docopt_HEADERS
3032
docopt.h
3133
docopt_private.h
3234
docopt_util.h
3335
docopt_value.h
3436
)
35-
if(WITH_STATIC)
36-
add_library(docopt_s STATIC ${DOCOPT_SRC})
37-
target_include_directories(docopt_s PUBLIC "${PROJECT_SOURCE_DIR}")
38-
endif()
39-
add_library(docopt SHARED ${DOCOPT_SRC})
40-
target_include_directories(docopt PUBLIC "${PROJECT_SOURCE_DIR}")
4137

42-
########################################################################
43-
# tests
38+
#============================================================================
39+
# Compile targets
40+
#============================================================================
41+
add_library(docopt_o OBJECT ${docopt_SOURCES} ${docopt_HEADERS})
42+
set_target_properties(docopt_o PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
43+
44+
add_library(docopt SHARED $<TARGET_OBJECTS:docopt_o>)
45+
add_library(docopt_s STATIC $<TARGET_OBJECTS:docopt_o>)
4446

45-
if (WITH_EXAMPLE)
47+
target_include_directories(docopt PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<INSTALL_INTERFACE:include/docopt>)
48+
target_include_directories(docopt_s PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<INSTALL_INTERFACE:include/docopt>)
49+
50+
if(NOT MSVC)
51+
set_target_properties(docopt PROPERTIES OUTPUT_NAME docopt)
52+
set_target_properties(docopt_s PROPERTIES OUTPUT_NAME docopt)
53+
endif()
54+
55+
#============================================================================
56+
# Examples
57+
#============================================================================
58+
if(WITH_EXAMPLE)
4659
add_executable(docopt_example examples/naval_fate.cpp)
4760
target_link_libraries(docopt_example docopt)
4861
endif()
4962

50-
########################################################################
51-
# example
52-
53-
if (WITH_TESTS)
63+
#============================================================================
64+
# Tests
65+
#============================================================================
66+
if(WITH_TESTS)
5467
set(TESTPROG "${CMAKE_CURRENT_BINARY_DIR}/run_testcase")
5568
set(TESTCASES "${PROJECT_SOURCE_DIR}/testcases.docopt")
5669
add_executable(run_testcase run_testcase.cpp)
@@ -63,36 +76,40 @@ if (WITH_TESTS)
6376
add_test("Testcases docopt" ${TESTPROG})
6477
endif()
6578

66-
########################################################################
67-
# installation
79+
#============================================================================
80+
# Install
81+
#============================================================================
82+
set(export_name "docopt-targets")
6883

69-
INSTALL(TARGETS
70-
docopt
71-
DESTINATION lib)
72-
if(WITH_STATIC)
73-
INSTALL(TARGETS
74-
docopt_s
75-
DESTINATION lib)
76-
endif()
77-
INSTALL(FILES
78-
docopt.h
79-
docopt_private.h
80-
docopt_util.h
81-
docopt_value.h
82-
DESTINATION include/docopt)
83-
SET(CPACK_PACKAGE_NAME "docopt")
84-
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "")
85-
SET(CPACK_RPM_PACKAGE_REQUIRES "")
86-
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Beautiful command line interfaces")
87-
SET(CPACK_PACKAGE_VENDOR "Jared Grubb")
88-
SET(CPACK_PACKAGE_CONTACT ${CPACK_PACKAGE_VENDOR})
89-
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.rst")
90-
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE-MIT")
91-
SET(CPACK_PACKAGE_VERSION_MAJOR 0)
92-
SET(CPACK_PACKAGE_VERSION_MINOR 6)
93-
SET(CPACK_PACKAGE_VERSION_PATCH 1)
94-
SET(CPACK_DEBIAN_PACKAGE_SECTION "Development")
95-
SET(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
96-
SET(CPACK_RPM_PACKAGE_LICENSE "MIT")
97-
SET(CPACK_STRIP_FILES TRUE)
98-
INCLUDE(CPack)
84+
# Runtime package
85+
install(TARGETS docopt EXPORT ${export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})
86+
87+
# Development package
88+
install(TARGETS docopt_s EXPORT ${export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})
89+
install(FILES ${docopt_HEADERS} DESTINATION include/docopt)
90+
91+
# CMake Package
92+
include(CMakePackageConfigHelpers)
93+
write_basic_package_version_file("${PROJECT_BINARY_DIR}/docopt-config-version.cmake" COMPATIBILITY SameMajorVersion)
94+
install(FILES docopt-config.cmake ${PROJECT_BINARY_DIR}/docopt-config-version.cmake DESTINATION "lib/cmake/docopt")
95+
install(EXPORT ${export_name} DESTINATION "lib/cmake/docopt")
96+
97+
#============================================================================
98+
# CPack
99+
#============================================================================
100+
set(CPACK_PACKAGE_NAME "docopt")
101+
set(CPACK_DEBIAN_PACKAGE_DEPENDS "")
102+
set(CPACK_RPM_PACKAGE_REQUIRES "")
103+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Beautiful command line interfaces")
104+
set(CPACK_PACKAGE_VENDOR "Jared Grubb")
105+
set(CPACK_PACKAGE_CONTACT ${CPACK_PACKAGE_VENDOR})
106+
set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.rst")
107+
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE-MIT")
108+
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
109+
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
110+
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
111+
set(CPACK_DEBIAN_PACKAGE_SECTION "Development")
112+
set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
113+
set(CPACK_RPM_PACKAGE_LICENSE "MIT")
114+
set(CPACK_STRIP_FILES TRUE)
115+
include(CPack)

docopt-config.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include("${CMAKE_CURRENT_LIST_DIR}/docopt-targets.cmake")

0 commit comments

Comments
 (0)
0