• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1###################################################################################
2#                                                                                 #
3# NAME: CMakeLists.txt                                                            #
4#                                                                                 #
5# AUTHOR: Mike Karlesky, Mark VanderVoord, Greg Williams.                         #
6# WRITTEN BY: Michael Brockus.                                                    #
7#                                                                                 #
8# License: MIT                                                                    #
9#                                                                                 #
10###################################################################################
11
12cmake_minimum_required(VERSION 3.12)
13
14# Read src/unity.h file and get project version from it
15set(UNITY_HEADER "src/unity.h")
16
17file(STRINGS "${UNITY_HEADER}" UNITY_HEADER_CONTENT
18    REGEX "^#define UNITY_VERSION_(MAJOR|MINOR|BUILD) +[0-9]+$"
19)
20
21set(UNITY_HEADER_VERSION_MAJOR 0)
22set(UNITY_HEADER_VERSION_MINOR 0)
23set(UNITY_HEADER_VERSION_BUILD 0)
24
25foreach(VERSION_LINE IN LISTS UNITY_HEADER_CONTENT)
26    foreach(VERSION_PART MAJOR MINOR BUILD)
27        string(CONCAT REGEX_STRING "#define UNITY_VERSION_"
28                                   "${VERSION_PART}"
29                                   " +([0-9]+)"
30        )
31
32        if(VERSION_LINE MATCHES "${REGEX_STRING}")
33            set(UNITY_HEADER_VERSION_${VERSION_PART} "${CMAKE_MATCH_1}")
34        endif()
35    endforeach()
36endforeach()
37
38project(unity
39    VERSION     ${UNITY_HEADER_VERSION_MAJOR}.${UNITY_HEADER_VERSION_MINOR}.${UNITY_HEADER_VERSION_BUILD}
40    LANGUAGES   C
41    DESCRIPTION "C Unit testing framework."
42)
43
44# Options to Build With Extras -------------------------------------------------
45option(UNITY_EXTENSION_FIXTURE "Compiles Unity with the \"fixture\" extension." OFF)
46option(UNITY_EXTENSION_MEMORY "Compiles Unity with the \"memory\" extension." OFF)
47
48set(UNITY_EXTENSION_FIXTURE_ENABLED $<BOOL:${UNITY_EXTENSION_FIXTURE}>)
49set(UNITY_EXTENSION_MEMORY_ENABLED $<OR:${UNITY_EXTENSION_FIXTURE_ENABLED},$<BOOL:${UNITY_EXTENSION_MEMORY}>>)
50
51if(${UNITY_EXTENSION_FIXTURE})
52    message(STATUS "Unity: Building with the fixture extension.")
53endif()
54
55if(${UNITY_EXTENSION_MEMORY})
56    message(STATUS "Unity: Building with the memory extension.")
57endif()
58
59# Main target ------------------------------------------------------------------
60add_library(${PROJECT_NAME} STATIC)
61add_library(${PROJECT_NAME}::framework ALIAS ${PROJECT_NAME})
62
63# Includes ---------------------------------------------------------------------
64include(GNUInstallDirs)
65include(CMakePackageConfigHelpers)
66
67target_sources(${PROJECT_NAME}
68    PRIVATE
69        src/unity.c
70        $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:extras/fixture/src/unity_fixture.c>
71        $<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:extras/memory/src/unity_memory.c>
72)
73
74target_include_directories(${PROJECT_NAME}
75    PUBLIC
76        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
77        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
78        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>
79        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
80        $<BUILD_INTERFACE:$<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/memory/src>>
81        $<BUILD_INTERFACE:$<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src>>
82)
83
84set(${PROJECT_NAME}_PUBLIC_HEADERS
85        src/unity.h
86        src/unity_internals.h
87        $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src/unity_fixture.h>
88        $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src/unity_fixture_internals.h>
89        $<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/memory/src/unity_memory.h>
90)
91
92set_target_properties(${PROJECT_NAME}
93    PROPERTIES
94        C_STANDARD          11
95        C_STANDARD_REQUIRED ON
96        C_EXTENSIONS        OFF
97        PUBLIC_HEADER       "${${PROJECT_NAME}_PUBLIC_HEADERS}"
98        EXPORT_NAME         framework
99)
100
101target_compile_options(${PROJECT_NAME}
102    PRIVATE
103        # Clang
104        $<$<C_COMPILER_ID:Clang>:
105            -Wcast-align
106            -Wcast-qual
107            -Wconversion
108            -Wexit-time-destructors
109            -Wglobal-constructors
110            -Wmissing-noreturn
111            -Wmissing-prototypes
112            -Wno-missing-braces
113            -Wold-style-cast
114            -Wshadow
115            -Wweak-vtables
116            -Werror
117            -Wall
118            $<$<VERSION_GREATER_EQUAL:$<C_COMPILER_VERSION>,8.0.0>:-Wextra-semi-stmt>
119        >
120
121        # GCC
122        $<$<C_COMPILER_ID:GNU>:
123            -Waddress
124            -Waggregate-return
125            -Wformat-nonliteral
126            -Wformat-security
127            -Wformat
128            -Winit-self
129            -Wmissing-declarations
130            -Wmissing-include-dirs
131            -Wno-multichar
132            -Wno-parentheses
133            -Wno-type-limits
134            -Wno-unused-parameter
135            -Wunreachable-code
136            -Wwrite-strings
137            -Wpointer-arith
138            -Werror
139            -Wall
140        >
141
142        # MSVC
143        $<$<C_COMPILER_ID:MSVC>:
144            /Wall
145        >
146)
147
148write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake
149    VERSION       ${PROJECT_VERSION}
150    COMPATIBILITY SameMajorVersion
151)
152
153## Target installation
154install(TARGETS   ${PROJECT_NAME}
155    EXPORT        ${PROJECT_NAME}Targets
156    ARCHIVE       DESTINATION ${CMAKE_INSTALL_LIBDIR}
157    LIBRARY       DESTINATION ${CMAKE_INSTALL_LIBDIR}
158    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
159    COMPONENT     library
160)
161
162## Target's cmake files: targets export
163install(EXPORT  ${PROJECT_NAME}Targets
164    NAMESPACE   ${PROJECT_NAME}::
165    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
166)
167
168## Target's cmake files: config and version config for find_package()
169install(FILES   ${PROJECT_NAME}Config.cmake
170                ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
171    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
172)
173