1# Copyright 2020 The Pigweed Authors 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4# use this file except in compliance with the License. You may obtain a copy of 5# the License at 6# 7# https://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12# License for the specific language governing permissions and limitations under 13# the License. 14 15include($ENV{PW_ROOT}/pw_build/pigweed.cmake) 16include($ENV{PW_ROOT}/pw_chrono/backend.cmake) 17include($ENV{PW_ROOT}/pw_sync/backend.cmake) 18include($ENV{PW_ROOT}/pw_protobuf_compiler/proto.cmake) 19 20pw_add_library(pw_chrono.epoch INTERFACE 21 HEADERS 22 public/pw_chrono/epoch.h 23 PUBLIC_INCLUDES 24 public 25) 26 27pw_add_library(pw_chrono.virtual_clock INTERFACE 28 HEADERS 29 public/pw_chrono/virtual_clock.h 30 PUBLIC_INCLUDES 31 public 32) 33 34pw_add_facade(pw_chrono.system_clock STATIC 35 BACKEND 36 pw_chrono.system_clock_BACKEND 37 HEADERS 38 public/pw_chrono/internal/system_clock_macros.h 39 public/pw_chrono/system_clock.h 40 PUBLIC_INCLUDES 41 public 42 PUBLIC_DEPS 43 pw_chrono.epoch 44 pw_chrono.virtual_clock 45 pw_preprocessor 46 SOURCES 47 system_clock.cc 48) 49 50pw_add_facade(pw_chrono.system_timer INTERFACE 51 BACKEND 52 pw_chrono.system_timer_BACKEND 53 HEADERS 54 public/pw_chrono/system_timer.h 55 PUBLIC_INCLUDES 56 public 57 PUBLIC_DEPS 58 pw_chrono.system_clock 59 pw_function 60) 61 62# Dependency injectable implementation of pw::chrono::SystemClock::Interface. 63pw_add_library(pw_chrono.simulated_system_clock INTERFACE 64 HEADERS 65 public/pw_chrono/simulated_system_clock.h 66 PUBLIC_INCLUDES 67 public 68 PUBLIC_DEPS 69 pw_chrono.system_clock 70 pw_sync.interrupt_spin_lock 71) 72 73pw_proto_library(pw_chrono.protos 74 SOURCES 75 chrono.proto 76 PREFIX 77 pw_chrono_protos 78 DEPS 79 pw_tokenizer.proto 80) 81 82if((NOT "${pw_chrono.system_clock_BACKEND}" STREQUAL "") AND 83 (NOT "${pw_sync.interrupt_spin_lock_BACKEND}" STREQUAL "")) 84 pw_add_test(pw_chrono.simulated_system_clock_test 85 SOURCES 86 simulated_system_clock_test.cc 87 PRIVATE_DEPS 88 pw_chrono.simulated_system_clock 89 GROUPS 90 modules 91 pw_chrono 92 ) 93endif() 94 95if(NOT "${pw_chrono.system_clock_BACKEND}" STREQUAL "") 96 pw_add_test(pw_chrono.system_clock_facade_test 97 SOURCES 98 system_clock_facade_test.cc 99 system_clock_facade_test_c.c 100 PRIVATE_DEPS 101 pw_chrono.system_clock 102 pw_preprocessor 103 GROUPS 104 modules 105 pw_chrono 106 ) 107endif() 108 109if(NOT "${pw_chrono.system_timer_BACKEND}" STREQUAL "") 110 pw_add_test(pw_chrono.system_timer_facade_test 111 SOURCES 112 system_timer_facade_test.cc 113 PRIVATE_DEPS 114 pw_chrono.system_timer 115 pw_sync.thread_notification 116 GROUPS 117 modules 118 pw_chrono 119 ) 120endif() 121 122function(generate_build_time_header NAME) 123 pw_parse_arguments( 124 NUM_POSITIONAL_ARGS 125 1 126 ) 127 128 set(out_dir "${CMAKE_CURRENT_BINARY_DIR}/${NAME}") 129 set(output "${out_dir}/pw_chrono/build_time.h") 130 get_filename_component(output_include_path "${output}" DIRECTORY) 131 132 set(gen_header "$ENV{PW_ROOT}/pw_chrono/generate_build_time_header.py") 133 LIST(APPEND gen_header_cmd python3 "${gen_header}" ${output}) 134 135 add_custom_command( 136 COMMAND 137 ${gen_header_cmd} 138 DEPENDS 139 ${gen_header} 140 OUTPUT 141 ${output}) 142 143 add_custom_target("${NAME}._generate" DEPENDS ${output}) 144 145 pw_add_library_generic("${NAME}" INTERFACE 146 PUBLIC_INCLUDES 147 ${out_dir} 148 ) 149 add_dependencies("${NAME}" "${NAME}._generate") 150endfunction() 151 152generate_build_time_header(pw_chrono.build_time_header) 153 154pw_add_library(pw_chrono.wrap_time_build_time STATIC 155 SOURCES 156 wrap_time_build_time.cc 157 PUBLIC_DEPS 158 pw_chrono.build_time_header 159 PUBLIC_LINK_OPTIONS 160 -Wl,--wrap=time 161 -Wl,--wrap=gettimeofday 162) 163