• 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: Bulding with the fixture extension.")
53endif()
54
55if(${UNITY_EXTENSION_MEMORY})
56    message(STATUS "Unity: Bulding 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        $<BUILD_INTERFACE:$<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/memory/src>>
80        $<BUILD_INTERFACE:$<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src>>
81)
82
83set(${PROJECT_NAME}_PUBLIC_HEADERS
84        src/unity.h
85        src/unity_internals.h
86        $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src/unity_fixture.h>
87        $<$<BOOL:${UNITY_EXTENSION_FIXTURE_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/fixture/src/unity_fixture_internals.h>
88        $<$<BOOL:${UNITY_EXTENSION_MEMORY_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/extras/memory/src/unity_memory.h>
89)
90
91set_target_properties(${PROJECT_NAME}
92    PROPERTIES
93        C_STANDARD          11
94        C_STANDARD_REQUIRED ON
95        C_EXTENSIONS        OFF
96        PUBLIC_HEADER       "${${PROJECT_NAME}_PUBLIC_HEADERS}"
97        EXPORT_NAME         framework
98)
99
100target_compile_options(${PROJECT_NAME}
101    PRIVATE
102        $<$<C_COMPILER_ID:Clang>:-Wcast-align
103                                 -Wcast-qual
104                                 -Wconversion
105                                 -Wexit-time-destructors
106                                 -Wglobal-constructors
107                                 -Wmissing-noreturn
108                                 -Wmissing-prototypes
109                                 -Wno-missing-braces
110                                 -Wold-style-cast
111                                 -Wshadow
112                                 -Wweak-vtables
113                                 -Werror
114                                 -Wall>
115        $<$<C_COMPILER_ID:GNU>:-Waddress
116                               -Waggregate-return
117                               -Wformat-nonliteral
118                               -Wformat-security
119                               -Wformat
120                               -Winit-self
121                               -Wmissing-declarations
122                               -Wmissing-include-dirs
123                               -Wno-multichar
124                               -Wno-parentheses
125                               -Wno-type-limits
126                               -Wno-unused-parameter
127                               -Wunreachable-code
128                               -Wwrite-strings
129                               -Wpointer-arith
130                               -Werror
131                               -Wall>
132       $<$<C_COMPILER_ID:MSVC>:/Wall>
133)
134
135write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake
136    VERSION       ${PROJECT_VERSION}
137    COMPATIBILITY SameMajorVersion
138)
139
140## Target installation
141install(TARGETS   ${PROJECT_NAME}
142    EXPORT        ${PROJECT_NAME}Targets
143    ARCHIVE       DESTINATION ${CMAKE_INSTALL_LIBDIR}
144    LIBRARY       DESTINATION ${CMAKE_INSTALL_LIBDIR}
145    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
146    COMPONENT     library
147)
148
149## Target's cmake files: targets export
150install(EXPORT  ${PROJECT_NAME}Targets
151    NAMESPACE   ${PROJECT_NAME}::
152    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
153)
154
155## Target's cmake files: config and version config for find_package()
156install(FILES   ${PROJECT_NAME}Config.cmake
157                ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
158    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
159)
160