Related
Update: thanks for the help everyone, tripleee's recursive suggestion worked
flash: clean
sudo $(make) -j8 default
#echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase
nrfjprog -f nrf52 --reset
I noticed that sometimes when I make small change to my code and recompile using make, my code fails. A quick fix to this was to do a clean build (remove my build directory and rebuild). If I parallelise the make process (-j8) it compiles in 10 seconds, so this was an acceptable quick-n-dirty solution.
To automate the clean process, I setup
clean:
ifeq ($(UNAME), Linux)
sudo rm -rf _build
else
#echo os not supported
endif
flash: clean default
#echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase
nrfjprog -f nrf52 --reset
This worked when I was using it a few days ago, but now it to fails when I compile using the -j tag with >1 processors.
sudo rm -rf _build
mkdir _build
cd _build && mkdir nrf52832_xxaa
Compiling file: main.c
Compiling file: battery.c
Compiling file: tension.c
Compiling file: temperature.c
Compiling file: ble_hts_custom.c
Compiling file: accelerometer.c
Compiling file: bma2x2.c
Compiling file: ble_nus.c
Compiling file: ble_link_ctx_manager.c
../../../Src/temperature.c:20:1: fatal error: opening dependency file _build/nrf52832_xxaa/temperature.c.d: No such file or directory
}
^
compilation terminated.
make: *** [../../../../../../components/toolchain/gcc/Makefile.common:272: _build/nrf52832_xxaa/temperature.c.o] Error 1
make: *** Waiting for unfinished jobs....
../../../Src/main.c: In function 'TensionLevelUpdate':
../../../Src/main.c:254:13: warning: implicit declaration of function 'itoa'; did you mean '__itoa'? [-Wimplicit-function-declaration]
itoa(tension_level, tension, 10);
^~~~
__itoa
../../../Src/battery.c:19:1: fatal error: opening dependency file _build/nrf52832_xxaa/battery.c.d: No such file or directory
}
^
compilation terminated.
make: *** [../../../../../../components/toolchain/gcc/Makefile.common:272: _build/nrf52832_xxaa/battery.c.o] Error 1
../../../Src/tension.c:176:1: fatal error: opening dependency file _build/nrf52832_xxaa/tension.c.d: No such file or directory
}
^
compilation terminated.
make: *** [../../../../../../components/toolchain/gcc/Makefile.common:272: _build/nrf52832_xxaa/tension.c.o] Error 1
../../../../../../components/ble/ble_services/ble_nus/ble_nus.c:351:1: fatal error: opening dependency file _build/nrf52832_xxaa/ble_nus.c.d: No such file or directory
}
^
compilation terminated.
make: *** [../../../../../../components/toolchain/gcc/Makefile.common:272: _build/nrf52832_xxaa/ble_nus.c.o] Error 1
../../../Src/accelerometer.c:142:1: fatal error: opening dependency file _build/nrf52832_xxaa/accelerometer.c.d: No such file or directory
}
^
compilation terminated.
make: *** [../../../../../../components/toolchain/gcc/Makefile.common:272: _build/nrf52832_xxaa/accelerometer.c.o] Error 1
../../../Src/ble_hts_custom.c:470:1: fatal error: opening dependency file _build/nrf52832_xxaa/ble_hts_custom.c.d: No such file or directory
}
^
compilation terminated.
make: *** [../../../../../../components/toolchain/gcc/Makefile.common:272: _build/nrf52832_xxaa/ble_hts_custom.c.o] Error 1
../../../Src/main.c: At top level:
../../../Src/main.c:1096:1: fatal error: opening dependency file _build/nrf52832_xxaa/main.c.d: No such file or directory
}
My full makefile as requested by #code_fodder
PROJECT_NAME := ble_app_hts_pca10040_s132
TARGETS := nrf52832_xxaa
OUTPUT_DIRECTORY := _build
SDK_ROOT := ../../../../../..
PROJ_DIR := ../../..
$(OUTPUT_DIRECTORY)/nrf52832_xxaa.out: \
LINKER_SCRIPT := ble_app_hts_gcc_nrf52.ld
######################################
# building variables
######################################
# debug build?
DEBUG ?= 0
DEBUG_PIN ?= 0
BAUDRATE ?= 0
# simulation build?
SIMULATE ?= 0
# devkit build?
DEVKIT ?= 0
# optimization
OPT = -O3
# Source files common to all targets
SRC_FILES += \
$(PROJ_DIR)/Src/main.c \
$(PROJ_DIR)/Src/battery.c \
$(PROJ_DIR)/Src/tension.c \
$(PROJ_DIR)/Src/temperature.c \
$(PROJ_DIR)/Src/ble_hts_custom.c \
$(PROJ_DIR)/Src/accelerometer.c \
$(PROJ_DIR)/Src/bma2x2.c \
$(SDK_ROOT)/components/ble/ble_services/ble_nus/ble_nus.c \
$(SDK_ROOT)/components/ble/ble_link_ctx_manager/ble_link_ctx_manager.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_saadc.c \
$(SDK_ROOT)/modules/nrfx/mdk/gcc_startup_nrf52.S \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_rtt.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_serial.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_uart.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_default_backends.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_frontend.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_str_formatter.c \
$(SDK_ROOT)/components/libraries/button/app_button.c \
$(SDK_ROOT)/components/libraries/util/app_error.c \
$(SDK_ROOT)/components/libraries/util/app_error_handler_gcc.c \
$(SDK_ROOT)/components/libraries/util/app_error_weak.c \
$(SDK_ROOT)/components/libraries/scheduler/app_scheduler.c \
$(SDK_ROOT)/components/libraries/timer/app_timer.c \
$(SDK_ROOT)/components/libraries/util/app_util_platform.c \
$(SDK_ROOT)/components/libraries/crc16/crc16.c \
$(SDK_ROOT)/components/libraries/fds/fds.c \
$(SDK_ROOT)/components/libraries/hardfault/hardfault_implementation.c \
$(SDK_ROOT)/components/libraries/util/nrf_assert.c \
$(SDK_ROOT)/components/libraries/atomic_fifo/nrf_atfifo.c \
$(SDK_ROOT)/components/libraries/atomic_flags/nrf_atflags.c \
$(SDK_ROOT)/components/libraries/atomic/nrf_atomic.c \
$(SDK_ROOT)/components/libraries/balloc/nrf_balloc.c \
$(SDK_ROOT)/external/fprintf/nrf_fprintf.c \
$(SDK_ROOT)/external/fprintf/nrf_fprintf_format.c \
$(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage.c \
$(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage_sd.c \
$(SDK_ROOT)/components/libraries/memobj/nrf_memobj.c \
$(SDK_ROOT)/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c \
$(SDK_ROOT)/components/libraries/ringbuf/nrf_ringbuf.c \
$(SDK_ROOT)/components/libraries/experimental_section_vars/nrf_section_iter.c \
$(SDK_ROOT)/components/libraries/strerror/nrf_strerror.c \
$(SDK_ROOT)/components/libraries/sensorsim/sensorsim.c \
$(SDK_ROOT)/modules/nrfx/mdk/system_nrf52.c \
$(SDK_ROOT)/components/boards/boards.c \
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_clock.c \
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_uart.c \
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_spi.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_clock.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_gpiote.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_power_clock.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/prs/nrfx_prs.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_uart.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_uarte.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_spim.c \
$(SDK_ROOT)/components/libraries/bsp/bsp.c \
$(SDK_ROOT)/components/libraries/bsp/bsp_btn_ble.c \
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT.c \
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c \
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_printf.c \
$(SDK_ROOT)/components/ble/peer_manager/auth_status_tracker.c \
$(SDK_ROOT)/components/ble/common/ble_advdata.c \
$(SDK_ROOT)/components/ble/ble_advertising/ble_advertising.c \
$(SDK_ROOT)/components/ble/common/ble_conn_params.c \
$(SDK_ROOT)/components/ble/common/ble_conn_state.c \
$(SDK_ROOT)/components/ble/common/ble_srv_common.c \
$(SDK_ROOT)/components/ble/peer_manager/gatt_cache_manager.c \
$(SDK_ROOT)/components/ble/peer_manager/gatts_cache_manager.c \
$(SDK_ROOT)/components/ble/peer_manager/id_manager.c \
$(SDK_ROOT)/components/ble/nrf_ble_gatt/nrf_ble_gatt.c \
$(SDK_ROOT)/components/ble/nrf_ble_qwr/nrf_ble_qwr.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_data_storage.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_database.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_id.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_manager.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_manager_handler.c \
$(SDK_ROOT)/components/ble/peer_manager/pm_buffer.c \
$(SDK_ROOT)/components/ble/peer_manager/security_dispatcher.c \
$(SDK_ROOT)/components/ble/peer_manager/security_manager.c \
$(SDK_ROOT)/external/utf_converter/utf.c \
$(SDK_ROOT)/components/ble/ble_services/ble_bas/ble_bas.c \
$(SDK_ROOT)/components/ble/ble_services/ble_dis/ble_dis.c \
$(SDK_ROOT)/components/softdevice/common/nrf_sdh.c \
$(SDK_ROOT)/components/softdevice/common/nrf_sdh_ble.c \
$(SDK_ROOT)/components/softdevice/common/nrf_sdh_soc.c \
# Include folders common to all targets
INC_FOLDERS += \
$(PROJ_DIR)/Inc \
$(SDK_ROOT)/components/ble/ble_services/ble_nus \
$(SDK_ROOT)/components/ble/ble_link_ctx_manager \
$(SDK_ROOT)/components/nfc/ndef/generic/message \
$(SDK_ROOT)/components/nfc/t2t_lib \
$(SDK_ROOT)/components/nfc/t4t_parser/hl_detection_procedure \
$(SDK_ROOT)/components/ble/ble_services/ble_ancs_c \
$(SDK_ROOT)/components/ble/ble_services/ble_ias_c \
$(SDK_ROOT)/components/libraries/pwm \
$(SDK_ROOT)/components/softdevice/s132/headers/nrf52 \
$(SDK_ROOT)/components/libraries/usbd/class/cdc/acm \
$(SDK_ROOT)/components/libraries/usbd/class/hid/generic \
$(SDK_ROOT)/components/libraries/usbd/class/msc \
$(SDK_ROOT)/components/libraries/usbd/class/hid \
$(SDK_ROOT)/modules/nrfx/hal \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/le_oob_rec_parser \
$(SDK_ROOT)/components/libraries/log \
$(SDK_ROOT)/components/ble/ble_services/ble_gls \
$(SDK_ROOT)/components/libraries/fstorage \
$(SDK_ROOT)/components/nfc/ndef/text \
$(SDK_ROOT)/components/libraries/mutex \
$(SDK_ROOT)/components/libraries/gpiote \
$(SDK_ROOT)/components/libraries/bootloader/ble_dfu \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/common \
$(SDK_ROOT)/components/boards \
$(SDK_ROOT)/components/nfc/ndef/generic/record \
$(SDK_ROOT)/components/nfc/t4t_parser/cc_file \
$(SDK_ROOT)/components/ble/ble_advertising \
$(SDK_ROOT)/external/utf_converter \
$(SDK_ROOT)/components/ble/ble_services/ble_bas_c \
$(SDK_ROOT)/modules/nrfx/drivers/include \
$(SDK_ROOT)/components/libraries/experimental_task_manager \
$(SDK_ROOT)/components/ble/ble_services/ble_hrs_c \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/le_oob_rec \
$(SDK_ROOT)/components/libraries/queue \
$(SDK_ROOT)/components/libraries/pwr_mgmt \
$(SDK_ROOT)/components/ble/ble_dtm \
$(SDK_ROOT)/components/toolchain/cmsis/include \
$(SDK_ROOT)/components/ble/ble_services/ble_rscs_c \
$(SDK_ROOT)/components/ble/common \
$(SDK_ROOT)/components/ble/ble_services/ble_lls \
$(SDK_ROOT)/components/libraries/bsp \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ac_rec \
$(SDK_ROOT)/components/ble/ble_services/ble_bas \
$(SDK_ROOT)/components/libraries/mpu \
$(SDK_ROOT)/components/libraries/experimental_section_vars \
$(SDK_ROOT)/components/softdevice/s132/headers \
$(SDK_ROOT)/components/ble/ble_services/ble_ans_c \
$(SDK_ROOT)/components/libraries/slip \
$(SDK_ROOT)/components/libraries/delay \
$(SDK_ROOT)/components/libraries/mem_manager \
$(SDK_ROOT)/components/libraries/csense_drv \
$(SDK_ROOT)/components/libraries/memobj \
$(SDK_ROOT)/components/ble/ble_services/ble_nus_c \
$(SDK_ROOT)/components/softdevice/common \
$(SDK_ROOT)/components/ble/ble_services/ble_ias \
$(SDK_ROOT)/components/libraries/usbd/class/hid/mouse \
$(SDK_ROOT)/components/libraries/low_power_pwm \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/ble_oob_advdata_parser \
$(SDK_ROOT)/components/ble/ble_services/ble_dfu \
$(SDK_ROOT)/external/fprintf \
$(SDK_ROOT)/components/libraries/svc \
$(SDK_ROOT)/components/libraries/atomic \
$(SDK_ROOT)/components \
$(SDK_ROOT)/components/libraries/scheduler \
$(SDK_ROOT)/components/libraries/cli \
$(SDK_ROOT)/components/ble/ble_services/ble_lbs \
$(SDK_ROOT)/components/libraries/crc16 \
$(SDK_ROOT)/components/nfc/t4t_parser/apdu \
$(SDK_ROOT)/components/libraries/util \
../config \
$(SDK_ROOT)/components/libraries/usbd/class/cdc \
$(SDK_ROOT)/components/libraries/csense \
$(SDK_ROOT)/components/libraries/balloc \
$(SDK_ROOT)/components/libraries/ecc \
$(SDK_ROOT)/components/libraries/hardfault \
$(SDK_ROOT)/components/ble/ble_services/ble_cscs \
$(SDK_ROOT)/components/libraries/hci \
$(SDK_ROOT)/components/libraries/usbd/class/hid/kbd \
$(SDK_ROOT)/components/libraries/timer \
$(SDK_ROOT)/integration/nrfx \
$(SDK_ROOT)/components/nfc/t4t_parser/tlv \
$(SDK_ROOT)/components/libraries/sortlist \
$(SDK_ROOT)/components/libraries/spi_mngr \
$(SDK_ROOT)/components/libraries/led_softblink \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser \
$(SDK_ROOT)/components/libraries/sdcard \
$(SDK_ROOT)/components/nfc/ndef/parser/record \
$(SDK_ROOT)/modules/nrfx/mdk \
$(SDK_ROOT)/components/ble/ble_services/ble_cts_c \
$(SDK_ROOT)/components/ble/ble_services/ble_nus \
$(SDK_ROOT)/components/libraries/twi_mngr \
$(SDK_ROOT)/components/ble/ble_services/ble_hids \
$(SDK_ROOT)/components/libraries/strerror \
$(SDK_ROOT)/components/libraries/crc32 \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_oob_advdata \
$(SDK_ROOT)/components/nfc/t2t_parser \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_pair_msg \
$(SDK_ROOT)/components/libraries/usbd/class/audio \
$(SDK_ROOT)/components/nfc/t4t_lib/hal_t4t \
$(SDK_ROOT)/components/libraries/sensorsim \
$(SDK_ROOT)/components/nfc/t4t_lib \
$(SDK_ROOT)/components/ble/peer_manager \
$(SDK_ROOT)/components/drivers_nrf/usbd \
$(SDK_ROOT)/components/libraries/ringbuf \
$(SDK_ROOT)/components/ble/ble_services/ble_tps \
$(SDK_ROOT)/components/nfc/ndef/parser/message \
$(SDK_ROOT)/components/ble/ble_services/ble_dis \
$(SDK_ROOT)/components/nfc/ndef/uri \
$(SDK_ROOT)/components/ble/nrf_ble_gatt \
$(SDK_ROOT)/components/ble/nrf_ble_qwr \
$(SDK_ROOT)/components/libraries/gfx \
$(SDK_ROOT)/components/libraries/button \
$(SDK_ROOT)/modules/nrfx \
$(SDK_ROOT)/components/libraries/twi_sensor \
$(SDK_ROOT)/integration/nrfx/legacy \
$(SDK_ROOT)/components/libraries/usbd \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ep_oob_rec \
$(SDK_ROOT)/external/segger_rtt \
$(SDK_ROOT)/components/libraries/atomic_fifo \
$(SDK_ROOT)/components/ble/ble_services/ble_lbs_c \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_pair_lib \
$(SDK_ROOT)/components/libraries/crypto \
$(SDK_ROOT)/components/ble/ble_racp \
$(SDK_ROOT)/components/libraries/fds \
$(SDK_ROOT)/components/nfc/ndef/launchapp \
$(SDK_ROOT)/components/libraries/atomic_flags \
$(SDK_ROOT)/components/ble/ble_services/ble_hrs \
$(SDK_ROOT)/components/ble/ble_services/ble_rscs \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/hs_rec \
$(SDK_ROOT)/components/nfc/t2t_lib/hal_t2t \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/ac_rec_parser \
$(SDK_ROOT)/components/libraries/stack_guard \
$(SDK_ROOT)/components/libraries/log/src \
# Libraries common to all targets
LIB_FILES += \
# Debug option
ifeq ($(DEBUG), 1)
# use 'make sdk_config -> nRF_Log -> NRF_LOG_BACKEND_UART_ENABLED' to see default params
C_DEFS += -DDEBUG
C_DEFS += -DNRF_LOG_ENABLED=1
C_DEFS += -DNRF_LOG_BACKEND_UART_ENABLED=1
ifneq ($(DEBUG_PIN), 0)
C_DEFS += -DNRF_LOG_BACKEND_UART_TX_PIN=$(DEBUG_PIN)
endif
ifneq ($(BAUDRATE), 0)
C_DEFS += -DNRF_LOG_BACKEND_UART_BAUDRATE=$(BAUDRATE)
endif
OPT = -Og
endif
ifeq ($(SIMULATE), 1)
C_DEFS += -DSIMULATE
endif
ifeq ($(DEVKIT), 1)
C_DEFS += -DDEVKIT
endif
# C flags common to all targets
CFLAGS += $(OPT)
CFLAGS += -DBOARD_PCA10040
CFLAGS += -DCONFIG_GPIO_AS_PINRESET
CFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS
CFLAGS += -DFLOAT_ABI_HARD
CFLAGS += -DNRF52
CFLAGS += -DNRF52832_XXAA
CFLAGS += -DNRF52_PAN_74
CFLAGS += -DNRF_SD_BLE_API_VERSION=6
CFLAGS += -DS132
CFLAGS += -DSOFTDEVICE_PRESENT
CFLAGS += -DSWI_DISABLE0
CFLAGS += -mcpu=cortex-m4
CFLAGS += -mthumb -mabi=aapcs
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# keep every function in a separate section, this allows linker to discard unused ones
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CFLAGS += -fno-builtin -fshort-enums
CFLAGS += -Wall -g3
CFLAGS += $(C_DEFS)
# CFLAGS += -Werror # if you want warnings treated as errors
# C++ flags common to all targets
CXXFLAGS += $(OPT) -std=c++1z
# Assembler flags common to all targets
ASMFLAGS += -g3
ASMFLAGS += -mcpu=cortex-m4
ASMFLAGS += -mthumb -mabi=aapcs
ASMFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
ASMFLAGS += -DBOARD_PCA10040
ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET
ASMFLAGS += -DFLOAT_ABI_HARD
ASMFLAGS += -DNRF52
ASMFLAGS += -DNRF52832_XXAA
ASMFLAGS += -DNRF52_PAN_74
ASMFLAGS += -DNRF_SD_BLE_API_VERSION=6
ASMFLAGS += -DS132
ASMFLAGS += -DSOFTDEVICE_PRESENT
ASMFLAGS += -DSWI_DISABLE0
# Linker flags
LDFLAGS += $(OPT)
LDFLAGS += -mthumb -mabi=aapcs -L$(SDK_ROOT)/modules/nrfx/mdk -T$(LINKER_SCRIPT)
LDFLAGS += -mcpu=cortex-m4
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# let linker dump unused sections
LDFLAGS += -Wl,--gc-sections
# use newlib in nano version
LDFLAGS += --specs=nano.specs
nrf52832_xxaa: CFLAGS += -D__HEAP_SIZE=8192
nrf52832_xxaa: CFLAGS += -D__STACK_SIZE=8192
nrf52832_xxaa: ASMFLAGS += -D__HEAP_SIZE=8192
nrf52832_xxaa: ASMFLAGS += -D__STACK_SIZE=8192
# Add standard libraries at the very end of the linker input, after all objects
# that may need symbols provided by these libraries.
LIB_FILES += -lc -lnosys -lm
.PHONY: default help
# Default target - first one defined
default: nrf52832_xxaa
# Print all targets that can be built
help:
#echo following targets are available:
#echo nrf52832_xxaa
#echo flash_softdevice
#echo sdk_config - starting external tool for editing sdk_config.h
#echo flash - flashing binary
TEMPLATE_PATH := $(SDK_ROOT)/components/toolchain/gcc
include $(TEMPLATE_PATH)/Makefile.common
$(foreach target, $(TARGETS), $(call define_target, $(target)))
.PHONY: flash flash_softdevice erase
UNAME := $(shell uname)
clean:
ifeq ($(UNAME), Linux)
sudo rm -rf _build
else
#echo os not supported for clean target
endif
flash: clean default
#echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase
nrfjprog -f nrf52 --reset
SDK_CONFIG_FILE := ../config/sdk_config.h
CMSIS_CONFIG_TOOL := $(SDK_ROOT)/external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar
sdk_config:
java -jar $(CMSIS_CONFIG_TOOL) $(SDK_CONFIG_FILE)
For completeness, makefile.common is invoked in the first makefile so I'll add it here
# Copyright (c) 2016 - 2017, Nordic Semiconductor ASA
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form, except as embedded into a Nordic
# Semiconductor ASA integrated circuit in a product or a software update for
# such product, must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other
# materials provided with the distribution.
#
# 3. Neither the name of Nordic Semiconductor ASA nor the names of its
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# 4. This software, with or without modification, must only be used with a
# Nordic Semiconductor ASA integrated circuit.
#
# 5. Any software provided in binary form under this license must not be reverse
# engineered, decompiled, modified and/or disassembled.
#
# THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Options:
# VERBOSE=1 (default is 0) - print each executed command
# PRETTY=1 (default is 0) - show progress, in percentage
# ABSOLUTE_PATHS=1 (default is 0) - convert all include folders and source
# file paths to their absolute forms
# PASS_INCLUDE_PATHS_VIA_FILE=1 (default is 0) - use <target>.inc file
# to pass include paths to gcc
# PASS_LINKER_INPUT_VIA_FILE=0 (default is 1) - don't use <target>.in file
# to pass the list of linker input files
VERBOSE ?= 0
PRETTY ?= 0
ABSOLUTE_PATHS ?= 0
PASS_INCLUDE_PATHS_VIA_FILE ?= 0
PASS_LINKER_INPUT_VIA_FILE ?= 1
.SUFFIXES: # ignore built-in rules
%.d: # don't try to make .d files
.PRECIOUS: %.d %.o
MK := mkdir
RM := rm -rf
# echo suspend
ifeq ($(VERBOSE),1)
NO_ECHO :=
else
NO_ECHO := #
endif
ifneq (,$(filter clean, $(MAKECMDGOALS)))
OTHER_GOALS := $(filter-out clean, $(MAKECMDGOALS))
ifneq (, $(OTHER_GOALS))
$(info Cannot make anything in parallel with "clean".)
$(info Execute "$(MAKE) clean \
$(foreach goal, $(OTHER_GOALS),&& $(MAKE) $(goal))" instead.)
$(error Cannot continue)
else
.PHONY: clean
clean:
$(RM) $(OUTPUT_DIRECTORY)
endif # ifneq(, $(OTHER_GOALS))
else # ifneq (,$(filter clean, $(MAKECMDGOALS)))
ifndef PROGRESS
ifeq ($(PRETTY),1)
X := #
EMPTY :=
SPACE := $(EMPTY) $(EMPTY)
TOTAL := $(subst $(SPACE),,$(filter $(X), \
$(shell "$(MAKE)" $(MAKECMDGOALS) --dry-run \
--no-print-directory PROGRESS=$(X))))
5 := $(X)$(X)$(X)$(X)$(X)
25 := $(5)$(5)$(5)$(5)$(5)
100 := $(25)$(25)$(25)$(25)
C :=
COUNTER = $(eval C := $(C)$(100))$(C)
P :=
count = $(if $(filter $1%,$2),$(eval \
P += 1)$(call count,$1,$(2:$1%=%)),$(eval \
C := $2))
print = [$(if $(word 99,$1),99,$(if $(word 10,$1),, )$(words $1))%]
PROGRESS = $(call count,$(TOTAL),$(COUNTER))$(call print,$(P)) $1
else
PROGRESS = $1
endif # ifeq ($(PRETTY),1)
PLATFORM_SUFFIX := $(if $(filter Windows%,$(OS)),windows,posix)
TOOLCHAIN_CONFIG_FILE := $(TEMPLATE_PATH)/Makefile.$(PLATFORM_SUFFIX)
include $(TOOLCHAIN_CONFIG_FILE)
# $1 path
define quote
'$(subst ','\'',$(1))'
endef
# Toolchain commands
CC := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-gcc)
CXX := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-c++)
AS := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-as)
AR := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-ar) -r
LD := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-ld)
NM := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-nm)
OBJDUMP := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-objdump)
OBJCOPY := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-objcopy)
SIZE := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-size)
$(if $(shell $(CC) --version),,$(info Cannot find: $(CC).) \
$(info Please set values in: "$(abspath $(TOOLCHAIN_CONFIG_FILE))") \
$(info according to the actual configuration of your system.) \
$(error Cannot continue))
# Use ccache on linux if available
CCACHE := $(if $(filter Windows%,$(OS)),, \
$(if $(wildcard /usr/bin/ccache),ccache))
CC := $(CCACHE) $(CC)
endif # ifndef PROGRESS
# $1 type of item
# $2 items paths to check
define ensure_exists_each
$(foreach item, $(2), \
$(if $(wildcard $(item)),, $(warning Cannot find $(1): $(item))))
endef
ifeq ($(PASS_INCLUDE_PATHS_VIA_FILE),1)
INC_PATHS = #$($#_INC)
GENERATE_INC_FILE := 1
else
INC_PATHS = $(call target_specific, INC_PATHS, $($#_TGT))
GENERATE_INC_FILE :=
endif
# $1 object file
# $2 source file
# $3 include paths container file
# $4 target name
define bind_obj_with_src
$(eval $(1) := $(2)) \
$(eval $(1)_INC := $(3)) \
$(eval $(1)_TGT := $(4)) \
$(eval $(1): Makefile | $(dir $(1)).) \
$(if $(GENERATE_INC_FILE), $(eval $(1): $(3)))
endef
# $1 target name
# $2 source file name
# Note: this additional .o for .s files is a workaround for issues with make 4.1
# from MinGW (it does nothing to remake .s.o files when a rule for .S.o
# files is defined as well).
define get_object_file_name
$(OUTPUT_DIRECTORY)/$(strip $(1))/$(notdir $(2:%.s=%.s.o)).o
endef
# $1 target name
# $2 include paths container file
# $3 list of source files
define get_object_files
$(call ensure_exists_each,source file, $(3)) \
$(foreach src_file, $(3), \
$(eval obj_file := $(call get_object_file_name, $(1), $(src_file))) \
$(eval DEPENDENCIES += $(obj_file:.o=.d)) \
$(call bind_obj_with_src, $(obj_file), $(src_file), $(2), $(1)) \
$(obj_file))
endef
# $1 variable name
# $2 target name
define target_specific
$($(addsuffix _$(strip $(2)), $(1)))
endef
ifeq ($(ABSOLUTE_PATHS),1)
get_path = $(call quote,$(abspath $1))
else
get_path = $1
endif
# $1 list of include folders
define get_inc_paths
$(call ensure_exists_each,include folder,$(1)) \
$(foreach folder,$(1),-I$(call get_path,$(folder)))
endef
# $1 target name
# $2 include paths container file
# $3 build goal name
define prepare_build
$(eval DEPENDENCIES :=) \
$(eval $(3): \
$(call get_object_files, $(1), $(2), \
$(SRC_FILES) $(call target_specific, SRC_FILES, $(1)))) \
$(eval -include $(DEPENDENCIES)) \
$(eval INC_PATHS_$(strip $(1)) := \
$(call get_inc_paths, \
$(INC_FOLDERS) $(call target_specific, INC_FOLDERS, $(1))))
endef
# $1 target name
define define_target
$(eval OUTPUT_FILE := $(OUTPUT_DIRECTORY)/$(strip $(1))) \
$(eval $(1): $(OUTPUT_FILE).out $(OUTPUT_FILE).hex $(OUTPUT_FILE).bin \
; #echo DONE $(strip $(1))) \
$(call prepare_build, $(1), $(OUTPUT_FILE).inc, $(OUTPUT_FILE).out)
endef
# $1 target name
# $2 library file name
define define_library
$(eval OUTPUT_FILE := $(OUTPUT_DIRECTORY)/$(strip $(1))) \
$(eval $(1) := $(2)) \
$(call prepare_build, $(1), $(OUTPUT_FILE).inc, $(1))
endef
# $1 content to be dumped
# Invokes another instance of MAKE to dump the specified content to stdout,
# which may be then redirected in shell to a file and this way stored there.
# MAKE in version prior to 4.0 does not provide the $(file ...) function.
define dump
$(eval CONTENT_TO_DUMP := $(1)) \
"$(MAKE)" -s --no-print-directory \
-f "$(TEMPLATE_PATH)/dump.mk" VARIABLE=CONTENT_TO_DUMP
endef
export CONTENT_TO_DUMP
.PHONY: $(TARGETS) all
all: $(TARGETS)
# Create build directories
$(OUTPUT_DIRECTORY):
$(MK) $#
$(OUTPUT_DIRECTORY)/%/.: | $(OUTPUT_DIRECTORY)
cd $(OUTPUT_DIRECTORY) && $(MK) $*
$(OUTPUT_DIRECTORY)/%.inc: Makefile | $(OUTPUT_DIRECTORY)
$(info Generating $#)
$(NO_ECHO)$(call dump, $(call target_specific, INC_PATHS, $*)) > $#
# $1 command
# $2 flags
# $3 message
define run
$(info $(call PROGRESS,$(3) file: $(notdir $($#)))) \
$(NO_ECHO)$(1) -MP -MD -c -o $# $(call get_path,$($#)) $(2) $(INC_PATHS)
endef
# Create object files from C source files
%.c.o:
$(call run,$(CC) -std=c99,$(CFLAGS),Compiling)
# Create object files from C++ source files
%.cpp.o:
$(call run,$(CXX),$(CFLAGS) $(CXXFLAGS),Compiling)
# Create object files from assembly source files
%.S.o %.s.o.o:
$(call run,$(CC) -x assembler-with-cpp,$(ASMFLAGS),Assembling)
ifeq ($(PASS_LINKER_INPUT_VIA_FILE),1)
GENERATE_LD_INPUT_FILE = $(call dump, $^ $(LIB_FILES)) > $(#:.out=.in)
LD_INPUT = #$(#:.out=.in)
else
GENERATE_LD_INPUT_FILE =
LD_INPUT = $^ $(LIB_FILES)
endif
# Link object files
%.out:
$(info $(call PROGRESS,Linking target: $#))
$(NO_ECHO)$(GENERATE_LD_INPUT_FILE)
$(NO_ECHO)$(CC) $(LDFLAGS) $(LD_INPUT) -Wl,-Map=$(#:.out=.map) -o $#
$(NO_ECHO)$(SIZE) $#
# Create binary .bin file from the .out file
%.bin: %.out
$(info Preparing: $#)
$(NO_ECHO)$(OBJCOPY) -O binary $< $#
# Create binary .hex file from the .out file
%.hex: %.out
$(info Preparing: $#)
$(NO_ECHO)$(OBJCOPY) -O ihex $< $#
endif # ifneq (,$(filter clean, $(MAKECMDGOALS)))
This is almost certainly not right:
flash: clean default
This tells make that both the clean and default targets need to complete before the recipe for the flash target can be invoked.
However, it says absolutely nothing about any relationship between the clean and default targets themselves. Since that's true, make will be free to run the recipes for both targets (and their prerequisites) in parallel, if you invoke it with the -j option.
It's highly unlikely it will work reliably for your clean target to be running in parallel with other, build targets.
ETA
There is only one way to tell make that one target must be built before another is started, and that's to define a prerequisite relationship. So if you want to require that clean must complete before default, the only way to tell make about that is to use:
default: clean
However you probably don't want to do this because it will mean that every time you run the default target it will first run the clean target.
There are some complicated things you can do but the simplest one is to use recursive make invocations. That would look something like this:
flash: clean
$(MAKE) default
#echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase
nrfjprog -f nrf52 --reset
This forces clean to run first before the recipe for flash, then the first line in the flash recipe invokes a recursive make that builds the default target.
When I run make clean then make DEBUG=1, it correctly compiles my file. If I want to add another argument I should be able to type make DEBUG=1 SIMULATE=1 but it doesn't recompile with the new C_FLAG.
This is the spot in the makefile where object files are created. When I specify %.c.o: $(C_FLAGS) it still doesn't recompile.
# $1 command
# $2 flags
# $3 message
define run
$(info $(call PROGRESS,$(3) file: $(notdir $($#)))) \
$(NO_ECHO)$(1) -MP -MD -c -o $# $(call get_path,$($#)) $(2) $(INC_PATHS)
endef
# Create object files from C source files
%.c.o:
$(call run,$(CC) -std=c99,$(CFLAGS),Compiling)
# Create object files from C++ source files
%.cpp.o:
$(call run,$(CXX),$(CFLAGS) $(CXXFLAGS),Compiling)
# Create object files from assembly source files
%.S.o %.s.o.o:
$(call run,$(CC) -x assembler-with-cpp,$(ASMFLAGS),Assembling)
makefile
PROJECT_NAME := ble_app_hts_pca10040_s132
TARGETS := nrf52832_xxaa
OUTPUT_DIRECTORY := _build
SDK_ROOT := ../../../../../..
PROJ_DIR := ../../..
$(OUTPUT_DIRECTORY)/nrf52832_xxaa.out: \
LINKER_SCRIPT := ble_app_hts_gcc_nrf52.ld
######################################
# building variables
######################################
# debug build?
DEBUG ?= 0
DEBUG_PIN ?= 0
BAUDRATE ?= 0
# simulation build?
SIMULATE ?= 0
# devkit build?
DEVKIT ?= 0
# optimization
OPT = -O3
# Source files common to all targets
SRC_FILES += \
$(PROJ_DIR)/Src/main.c \
$(PROJ_DIR)/Src/battery.c \
$(PROJ_DIR)/Src/tension.c \
$(PROJ_DIR)/Src/temperature.c \
$(PROJ_DIR)/Src/ble_hts_custom.c \
$(PROJ_DIR)/Src/accelerometer.c \
$(PROJ_DIR)/Src/bma2x2.c \
$(SDK_ROOT)/components/ble/ble_services/ble_nus/ble_nus.c \
$(SDK_ROOT)/components/ble/ble_link_ctx_manager/ble_link_ctx_manager.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_saadc.c \
$(SDK_ROOT)/modules/nrfx/mdk/gcc_startup_nrf52.S \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_rtt.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_serial.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_uart.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_default_backends.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_frontend.c \
$(SDK_ROOT)/components/libraries/log/src/nrf_log_str_formatter.c \
$(SDK_ROOT)/components/libraries/button/app_button.c \
$(SDK_ROOT)/components/libraries/util/app_error.c \
$(SDK_ROOT)/components/libraries/util/app_error_handler_gcc.c \
$(SDK_ROOT)/components/libraries/util/app_error_weak.c \
$(SDK_ROOT)/components/libraries/scheduler/app_scheduler.c \
$(SDK_ROOT)/components/libraries/timer/app_timer.c \
$(SDK_ROOT)/components/libraries/util/app_util_platform.c \
$(SDK_ROOT)/components/libraries/crc16/crc16.c \
$(SDK_ROOT)/components/libraries/fds/fds.c \
$(SDK_ROOT)/components/libraries/hardfault/hardfault_implementation.c \
$(SDK_ROOT)/components/libraries/util/nrf_assert.c \
$(SDK_ROOT)/components/libraries/atomic_fifo/nrf_atfifo.c \
$(SDK_ROOT)/components/libraries/atomic_flags/nrf_atflags.c \
$(SDK_ROOT)/components/libraries/atomic/nrf_atomic.c \
$(SDK_ROOT)/components/libraries/balloc/nrf_balloc.c \
$(SDK_ROOT)/external/fprintf/nrf_fprintf.c \
$(SDK_ROOT)/external/fprintf/nrf_fprintf_format.c \
$(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage.c \
$(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage_sd.c \
$(SDK_ROOT)/components/libraries/memobj/nrf_memobj.c \
$(SDK_ROOT)/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c \
$(SDK_ROOT)/components/libraries/ringbuf/nrf_ringbuf.c \
$(SDK_ROOT)/components/libraries/experimental_section_vars/nrf_section_iter.c \
$(SDK_ROOT)/components/libraries/strerror/nrf_strerror.c \
$(SDK_ROOT)/components/libraries/sensorsim/sensorsim.c \
$(SDK_ROOT)/modules/nrfx/mdk/system_nrf52.c \
$(SDK_ROOT)/components/boards/boards.c \
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_clock.c \
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_uart.c \
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_spi.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_clock.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_gpiote.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_power_clock.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/prs/nrfx_prs.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_uart.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_uarte.c \
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_spim.c \
$(SDK_ROOT)/components/libraries/bsp/bsp.c \
$(SDK_ROOT)/components/libraries/bsp/bsp_btn_ble.c \
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT.c \
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c \
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_printf.c \
$(SDK_ROOT)/components/ble/peer_manager/auth_status_tracker.c \
$(SDK_ROOT)/components/ble/common/ble_advdata.c \
$(SDK_ROOT)/components/ble/ble_advertising/ble_advertising.c \
$(SDK_ROOT)/components/ble/common/ble_conn_params.c \
$(SDK_ROOT)/components/ble/common/ble_conn_state.c \
$(SDK_ROOT)/components/ble/common/ble_srv_common.c \
$(SDK_ROOT)/components/ble/peer_manager/gatt_cache_manager.c \
$(SDK_ROOT)/components/ble/peer_manager/gatts_cache_manager.c \
$(SDK_ROOT)/components/ble/peer_manager/id_manager.c \
$(SDK_ROOT)/components/ble/nrf_ble_gatt/nrf_ble_gatt.c \
$(SDK_ROOT)/components/ble/nrf_ble_qwr/nrf_ble_qwr.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_data_storage.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_database.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_id.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_manager.c \
$(SDK_ROOT)/components/ble/peer_manager/peer_manager_handler.c \
$(SDK_ROOT)/components/ble/peer_manager/pm_buffer.c \
$(SDK_ROOT)/components/ble/peer_manager/security_dispatcher.c \
$(SDK_ROOT)/components/ble/peer_manager/security_manager.c \
$(SDK_ROOT)/external/utf_converter/utf.c \
$(SDK_ROOT)/components/ble/ble_services/ble_bas/ble_bas.c \
$(SDK_ROOT)/components/ble/ble_services/ble_dis/ble_dis.c \
$(SDK_ROOT)/components/softdevice/common/nrf_sdh.c \
$(SDK_ROOT)/components/softdevice/common/nrf_sdh_ble.c \
$(SDK_ROOT)/components/softdevice/common/nrf_sdh_soc.c \
# Include folders common to all targets
INC_FOLDERS += \
$(PROJ_DIR)/Inc \
$(SDK_ROOT)/components/ble/ble_services/ble_nus \
$(SDK_ROOT)/components/ble/ble_link_ctx_manager \
$(SDK_ROOT)/components/nfc/ndef/generic/message \
$(SDK_ROOT)/components/nfc/t2t_lib \
$(SDK_ROOT)/components/nfc/t4t_parser/hl_detection_procedure \
$(SDK_ROOT)/components/ble/ble_services/ble_ancs_c \
$(SDK_ROOT)/components/ble/ble_services/ble_ias_c \
$(SDK_ROOT)/components/libraries/pwm \
$(SDK_ROOT)/components/softdevice/s132/headers/nrf52 \
$(SDK_ROOT)/components/libraries/usbd/class/cdc/acm \
$(SDK_ROOT)/components/libraries/usbd/class/hid/generic \
$(SDK_ROOT)/components/libraries/usbd/class/msc \
$(SDK_ROOT)/components/libraries/usbd/class/hid \
$(SDK_ROOT)/modules/nrfx/hal \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/le_oob_rec_parser \
$(SDK_ROOT)/components/libraries/log \
$(SDK_ROOT)/components/ble/ble_services/ble_gls \
$(SDK_ROOT)/components/libraries/fstorage \
$(SDK_ROOT)/components/nfc/ndef/text \
$(SDK_ROOT)/components/libraries/mutex \
$(SDK_ROOT)/components/libraries/gpiote \
$(SDK_ROOT)/components/libraries/bootloader/ble_dfu \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/common \
$(SDK_ROOT)/components/boards \
$(SDK_ROOT)/components/nfc/ndef/generic/record \
$(SDK_ROOT)/components/nfc/t4t_parser/cc_file \
$(SDK_ROOT)/components/ble/ble_advertising \
$(SDK_ROOT)/external/utf_converter \
$(SDK_ROOT)/components/ble/ble_services/ble_bas_c \
$(SDK_ROOT)/modules/nrfx/drivers/include \
$(SDK_ROOT)/components/libraries/experimental_task_manager \
$(SDK_ROOT)/components/ble/ble_services/ble_hrs_c \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/le_oob_rec \
$(SDK_ROOT)/components/libraries/queue \
$(SDK_ROOT)/components/libraries/pwr_mgmt \
$(SDK_ROOT)/components/ble/ble_dtm \
$(SDK_ROOT)/components/toolchain/cmsis/include \
$(SDK_ROOT)/components/ble/ble_services/ble_rscs_c \
$(SDK_ROOT)/components/ble/common \
$(SDK_ROOT)/components/ble/ble_services/ble_lls \
$(SDK_ROOT)/components/libraries/bsp \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ac_rec \
$(SDK_ROOT)/components/ble/ble_services/ble_bas \
$(SDK_ROOT)/components/libraries/mpu \
$(SDK_ROOT)/components/libraries/experimental_section_vars \
$(SDK_ROOT)/components/softdevice/s132/headers \
$(SDK_ROOT)/components/ble/ble_services/ble_ans_c \
$(SDK_ROOT)/components/libraries/slip \
$(SDK_ROOT)/components/libraries/delay \
$(SDK_ROOT)/components/libraries/mem_manager \
$(SDK_ROOT)/components/libraries/csense_drv \
$(SDK_ROOT)/components/libraries/memobj \
$(SDK_ROOT)/components/ble/ble_services/ble_nus_c \
$(SDK_ROOT)/components/softdevice/common \
$(SDK_ROOT)/components/ble/ble_services/ble_ias \
$(SDK_ROOT)/components/libraries/usbd/class/hid/mouse \
$(SDK_ROOT)/components/libraries/low_power_pwm \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/ble_oob_advdata_parser \
$(SDK_ROOT)/components/ble/ble_services/ble_dfu \
$(SDK_ROOT)/external/fprintf \
$(SDK_ROOT)/components/libraries/svc \
$(SDK_ROOT)/components/libraries/atomic \
$(SDK_ROOT)/components \
$(SDK_ROOT)/components/libraries/scheduler \
$(SDK_ROOT)/components/libraries/cli \
$(SDK_ROOT)/components/ble/ble_services/ble_lbs \
$(SDK_ROOT)/components/libraries/crc16 \
$(SDK_ROOT)/components/nfc/t4t_parser/apdu \
$(SDK_ROOT)/components/libraries/util \
../config \
$(SDK_ROOT)/components/libraries/usbd/class/cdc \
$(SDK_ROOT)/components/libraries/csense \
$(SDK_ROOT)/components/libraries/balloc \
$(SDK_ROOT)/components/libraries/ecc \
$(SDK_ROOT)/components/libraries/hardfault \
$(SDK_ROOT)/components/ble/ble_services/ble_cscs \
$(SDK_ROOT)/components/libraries/hci \
$(SDK_ROOT)/components/libraries/usbd/class/hid/kbd \
$(SDK_ROOT)/components/libraries/timer \
$(SDK_ROOT)/integration/nrfx \
$(SDK_ROOT)/components/nfc/t4t_parser/tlv \
$(SDK_ROOT)/components/libraries/sortlist \
$(SDK_ROOT)/components/libraries/spi_mngr \
$(SDK_ROOT)/components/libraries/led_softblink \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser \
$(SDK_ROOT)/components/libraries/sdcard \
$(SDK_ROOT)/components/nfc/ndef/parser/record \
$(SDK_ROOT)/modules/nrfx/mdk \
$(SDK_ROOT)/components/ble/ble_services/ble_cts_c \
$(SDK_ROOT)/components/ble/ble_services/ble_nus \
$(SDK_ROOT)/components/libraries/twi_mngr \
$(SDK_ROOT)/components/ble/ble_services/ble_hids \
$(SDK_ROOT)/components/libraries/strerror \
$(SDK_ROOT)/components/libraries/crc32 \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_oob_advdata \
$(SDK_ROOT)/components/nfc/t2t_parser \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_pair_msg \
$(SDK_ROOT)/components/libraries/usbd/class/audio \
$(SDK_ROOT)/components/nfc/t4t_lib/hal_t4t \
$(SDK_ROOT)/components/libraries/sensorsim \
$(SDK_ROOT)/components/nfc/t4t_lib \
$(SDK_ROOT)/components/ble/peer_manager \
$(SDK_ROOT)/components/drivers_nrf/usbd \
$(SDK_ROOT)/components/libraries/ringbuf \
$(SDK_ROOT)/components/ble/ble_services/ble_tps \
$(SDK_ROOT)/components/nfc/ndef/parser/message \
$(SDK_ROOT)/components/ble/ble_services/ble_dis \
$(SDK_ROOT)/components/nfc/ndef/uri \
$(SDK_ROOT)/components/ble/nrf_ble_gatt \
$(SDK_ROOT)/components/ble/nrf_ble_qwr \
$(SDK_ROOT)/components/libraries/gfx \
$(SDK_ROOT)/components/libraries/button \
$(SDK_ROOT)/modules/nrfx \
$(SDK_ROOT)/components/libraries/twi_sensor \
$(SDK_ROOT)/integration/nrfx/legacy \
$(SDK_ROOT)/components/libraries/usbd \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ep_oob_rec \
$(SDK_ROOT)/external/segger_rtt \
$(SDK_ROOT)/components/libraries/atomic_fifo \
$(SDK_ROOT)/components/ble/ble_services/ble_lbs_c \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_pair_lib \
$(SDK_ROOT)/components/libraries/crypto \
$(SDK_ROOT)/components/ble/ble_racp \
$(SDK_ROOT)/components/libraries/fds \
$(SDK_ROOT)/components/nfc/ndef/launchapp \
$(SDK_ROOT)/components/libraries/atomic_flags \
$(SDK_ROOT)/components/ble/ble_services/ble_hrs \
$(SDK_ROOT)/components/ble/ble_services/ble_rscs \
$(SDK_ROOT)/components/nfc/ndef/connection_handover/hs_rec \
$(SDK_ROOT)/components/nfc/t2t_lib/hal_t2t \
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/ac_rec_parser \
$(SDK_ROOT)/components/libraries/stack_guard \
$(SDK_ROOT)/components/libraries/log/src \
# Libraries common to all targets
LIB_FILES += \
# Debug option
ifeq ($(DEBUG), 1)
# use 'make sdk_config -> nRF_Log -> NRF_LOG_BACKEND_UART_ENABLED' to see default params
C_DEFS += -DDEBUG
C_DEFS += -DNRF_LOG_ENABLED=1
C_DEFS += -DNRF_LOG_BACKEND_UART_ENABLED=1
ifneq ($(DEBUG_PIN), 0)
C_DEFS += -DNRF_LOG_BACKEND_UART_TX_PIN=$(DEBUG_PIN)
endif
ifneq ($(BAUDRATE), 0)
C_DEFS += -DNRF_LOG_BACKEND_UART_BAUDRATE=$(BAUDRATE)
endif
OPT = -Og
endif
ifeq ($(SIMULATE), 1)
C_DEFS += -DSIMULATE
endif
ifeq ($(DEVKIT), 1)
C_DEFS += -DDEVKIT
endif
# C flags common to all targets
CFLAGS += $(OPT)
CFLAGS += -DBOARD_PCA10040
CFLAGS += -DCONFIG_GPIO_AS_PINRESET
CFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS
CFLAGS += -DFLOAT_ABI_HARD
CFLAGS += -DNRF52
CFLAGS += -DNRF52832_XXAA
CFLAGS += -DNRF52_PAN_74
CFLAGS += -DNRF_SD_BLE_API_VERSION=6
CFLAGS += -DS132
CFLAGS += -DSOFTDEVICE_PRESENT
CFLAGS += -DSWI_DISABLE0
CFLAGS += -mcpu=cortex-m4
CFLAGS += -mthumb -mabi=aapcs
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# keep every function in a separate section, this allows linker to discard unused ones
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CFLAGS += -fno-builtin -fshort-enums
CFLAGS += -Wall -g3
CFLAGS += $(C_DEFS)
# CFLAGS += -Werror # if you want warnings treated as errors
# C++ flags common to all targets
CXXFLAGS += $(OPT) -std=c++1z
# Assembler flags common to all targets
ASMFLAGS += -g3
ASMFLAGS += -mcpu=cortex-m4
ASMFLAGS += -mthumb -mabi=aapcs
ASMFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
ASMFLAGS += -DBOARD_PCA10040
ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET
ASMFLAGS += -DFLOAT_ABI_HARD
ASMFLAGS += -DNRF52
ASMFLAGS += -DNRF52832_XXAA
ASMFLAGS += -DNRF52_PAN_74
ASMFLAGS += -DNRF_SD_BLE_API_VERSION=6
ASMFLAGS += -DS132
ASMFLAGS += -DSOFTDEVICE_PRESENT
ASMFLAGS += -DSWI_DISABLE0
# Linker flags
LDFLAGS += $(OPT)
LDFLAGS += -mthumb -mabi=aapcs -L$(SDK_ROOT)/modules/nrfx/mdk -T$(LINKER_SCRIPT)
LDFLAGS += -mcpu=cortex-m4
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# let linker dump unused sections
LDFLAGS += -Wl,--gc-sections
# use newlib in nano version
LDFLAGS += --specs=nano.specs
nrf52832_xxaa: CFLAGS += -D__HEAP_SIZE=8192
nrf52832_xxaa: CFLAGS += -D__STACK_SIZE=8192
nrf52832_xxaa: ASMFLAGS += -D__HEAP_SIZE=8192
nrf52832_xxaa: ASMFLAGS += -D__STACK_SIZE=8192
# Add standard libraries at the very end of the linker input, after all objects
# that may need symbols provided by these libraries.
LIB_FILES += -lc -lnosys -lm
.PHONY: default help
# Default target - first one defined
default: nrf52832_xxaa
# Print all targets that can be built
help:
#echo following targets are available:
#echo nrf52832_xxaa
#echo flash_softdevice
#echo sdk_config - starting external tool for editing sdk_config.h
#echo flash - flashing binary
TEMPLATE_PATH := $(SDK_ROOT)/components/toolchain/gcc
include $(TEMPLATE_PATH)/Makefile.common
$(foreach target, $(TARGETS), $(call define_target, $(target)))
.PHONY: flash flash_softdevice erase
UNAME := $(shell uname)
clean:
ifeq ($(UNAME), Linux)
sudo rm -rf _build
else
#echo os not supported for clean target
endif
flash: clean
sudo $(MAKE) -j8 DEBUG=$(DEBUG) DEBUG_PIN=$(DEBUG_PIN) SIMULATE=$(SIMULATE) DEVKIT=$(DEVKIT) default
#echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase
nrfjprog -f nrf52 --reset
flash_noclean: default
#echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase
nrfjprog -f nrf52 --reset
flash_softdevice:
#echo Flashing: s132_nrf52_6.1.0_softdevice.hex
nrfjprog -f nrf52 --program $(SDK_ROOT)/components/softdevice/s132/hex/s132_nrf52_6.1.0_softdevice.hex --sectorerase
nrfjprog -f nrf52 --reset
erase:
nrfjprog -f nrf52 --eraseall
SDK_CONFIG_FILE := ../config/sdk_config.h
CMSIS_CONFIG_TOOL := $(SDK_ROOT)/external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar
sdk_config:
java -jar $(CMSIS_CONFIG_TOOL) $(SDK_CONFIG_FILE)
makefile.common (invoked from the above makefile)
# Copyright (c) 2016 - 2017, Nordic Semiconductor ASA
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form, except as embedded into a Nordic
# Semiconductor ASA integrated circuit in a product or a software update for
# such product, must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other
# materials provided with the distribution.
#
# 3. Neither the name of Nordic Semiconductor ASA nor the names of its
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# 4. This software, with or without modification, must only be used with a
# Nordic Semiconductor ASA integrated circuit.
#
# 5. Any software provided in binary form under this license must not be reverse
# engineered, decompiled, modified and/or disassembled.
#
# THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Options:
# VERBOSE=1 (default is 0) - print each executed command
# PRETTY=1 (default is 0) - show progress, in percentage
# ABSOLUTE_PATHS=1 (default is 0) - convert all include folders and source
# file paths to their absolute forms
# PASS_INCLUDE_PATHS_VIA_FILE=1 (default is 0) - use <target>.inc file
# to pass include paths to gcc
# PASS_LINKER_INPUT_VIA_FILE=0 (default is 1) - don't use <target>.in file
# to pass the list of linker input files
VERBOSE ?= 0
PRETTY ?= 0
ABSOLUTE_PATHS ?= 0
PASS_INCLUDE_PATHS_VIA_FILE ?= 0
PASS_LINKER_INPUT_VIA_FILE ?= 1
.SUFFIXES: # ignore built-in rules
%.d: # don't try to make .d files
.PRECIOUS: %.d %.o
MK := mkdir
RM := rm -rf
# echo suspend
ifeq ($(VERBOSE),1)
NO_ECHO :=
else
NO_ECHO := #
endif
ifneq (,$(filter clean, $(MAKECMDGOALS)))
OTHER_GOALS := $(filter-out clean, $(MAKECMDGOALS))
ifneq (, $(OTHER_GOALS))
$(info Cannot make anything in parallel with "clean".)
$(info Execute "$(MAKE) clean \
$(foreach goal, $(OTHER_GOALS),&& $(MAKE) $(goal))" instead.)
$(error Cannot continue)
else
.PHONY: clean
clean:
$(RM) $(OUTPUT_DIRECTORY)
endif # ifneq(, $(OTHER_GOALS))
else # ifneq (,$(filter clean, $(MAKECMDGOALS)))
ifndef PROGRESS
ifeq ($(PRETTY),1)
X := #
EMPTY :=
SPACE := $(EMPTY) $(EMPTY)
TOTAL := $(subst $(SPACE),,$(filter $(X), \
$(shell "$(MAKE)" $(MAKECMDGOALS) --dry-run \
--no-print-directory PROGRESS=$(X))))
5 := $(X)$(X)$(X)$(X)$(X)
25 := $(5)$(5)$(5)$(5)$(5)
100 := $(25)$(25)$(25)$(25)
C :=
COUNTER = $(eval C := $(C)$(100))$(C)
P :=
count = $(if $(filter $1%,$2),$(eval \
P += 1)$(call count,$1,$(2:$1%=%)),$(eval \
C := $2))
print = [$(if $(word 99,$1),99,$(if $(word 10,$1),, )$(words $1))%]
PROGRESS = $(call count,$(TOTAL),$(COUNTER))$(call print,$(P)) $1
else
PROGRESS = $1
endif # ifeq ($(PRETTY),1)
PLATFORM_SUFFIX := $(if $(filter Windows%,$(OS)),windows,posix)
TOOLCHAIN_CONFIG_FILE := $(TEMPLATE_PATH)/Makefile.$(PLATFORM_SUFFIX)
include $(TOOLCHAIN_CONFIG_FILE)
# $1 path
define quote
'$(subst ','\'',$(1))'
endef
# Toolchain commands
CC := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-gcc)
CXX := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-c++)
AS := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-as)
AR := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-ar) -r
LD := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-ld)
NM := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-nm)
OBJDUMP := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-objdump)
OBJCOPY := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-objcopy)
SIZE := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-size)
$(if $(shell $(CC) --version),,$(info Cannot find: $(CC).) \
$(info Please set values in: "$(abspath $(TOOLCHAIN_CONFIG_FILE))") \
$(info according to the actual configuration of your system.) \
$(error Cannot continue))
# Use ccache on linux if available
CCACHE := $(if $(filter Windows%,$(OS)),, \
$(if $(wildcard /usr/bin/ccache),ccache))
CC := $(CCACHE) $(CC)
endif # ifndef PROGRESS
# $1 type of item
# $2 items paths to check
define ensure_exists_each
$(foreach item, $(2), \
$(if $(wildcard $(item)),, $(warning Cannot find $(1): $(item))))
endef
ifeq ($(PASS_INCLUDE_PATHS_VIA_FILE),1)
INC_PATHS = #$($#_INC)
GENERATE_INC_FILE := 1
else
INC_PATHS = $(call target_specific, INC_PATHS, $($#_TGT))
GENERATE_INC_FILE :=
endif
# $1 object file
# $2 source file
# $3 include paths container file
# $4 target name
define bind_obj_with_src
$(eval $(1) := $(2)) \
$(eval $(1)_INC := $(3)) \
$(eval $(1)_TGT := $(4)) \
$(eval $(1): Makefile | $(dir $(1)).) \
$(if $(GENERATE_INC_FILE), $(eval $(1): $(3)))
endef
# $1 target name
# $2 source file name
# Note: this additional .o for .s files is a workaround for issues with make 4.1
# from MinGW (it does nothing to remake .s.o files when a rule for .S.o
# files is defined as well).
define get_object_file_name
$(OUTPUT_DIRECTORY)/$(strip $(1))/$(notdir $(2:%.s=%.s.o)).o
endef
# $1 target name
# $2 include paths container file
# $3 list of source files
define get_object_files
$(call ensure_exists_each,source file, $(3)) \
$(foreach src_file, $(3), \
$(eval obj_file := $(call get_object_file_name, $(1), $(src_file))) \
$(eval DEPENDENCIES += $(obj_file:.o=.d)) \
$(call bind_obj_with_src, $(obj_file), $(src_file), $(2), $(1)) \
$(obj_file))
endef
# $1 variable name
# $2 target name
define target_specific
$($(addsuffix _$(strip $(2)), $(1)))
endef
ifeq ($(ABSOLUTE_PATHS),1)
get_path = $(call quote,$(abspath $1))
else
get_path = $1
endif
# $1 list of include folders
define get_inc_paths
$(call ensure_exists_each,include folder,$(1)) \
$(foreach folder,$(1),-I$(call get_path,$(folder)))
endef
# $1 target name
# $2 include paths container file
# $3 build goal name
define prepare_build
$(eval DEPENDENCIES :=) \
$(eval $(3): \
$(call get_object_files, $(1), $(2), \
$(SRC_FILES) $(call target_specific, SRC_FILES, $(1)))) \
$(eval -include $(DEPENDENCIES)) \
$(eval INC_PATHS_$(strip $(1)) := \
$(call get_inc_paths, \
$(INC_FOLDERS) $(call target_specific, INC_FOLDERS, $(1))))
endef
# $1 target name
define define_target
$(eval OUTPUT_FILE := $(OUTPUT_DIRECTORY)/$(strip $(1))) \
$(eval $(1): $(OUTPUT_FILE).out $(OUTPUT_FILE).hex $(OUTPUT_FILE).bin \
; #echo DONE $(strip $(1))) \
$(call prepare_build, $(1), $(OUTPUT_FILE).inc, $(OUTPUT_FILE).out)
endef
# $1 target name
# $2 library file name
define define_library
$(eval OUTPUT_FILE := $(OUTPUT_DIRECTORY)/$(strip $(1))) \
$(eval $(1) := $(2)) \
$(call prepare_build, $(1), $(OUTPUT_FILE).inc, $(1))
endef
# $1 content to be dumped
# Invokes another instance of MAKE to dump the specified content to stdout,
# which may be then redirected in shell to a file and this way stored there.
# MAKE in version prior to 4.0 does not provide the $(file ...) function.
define dump
$(eval CONTENT_TO_DUMP := $(1)) \
"$(MAKE)" -s --no-print-directory \
-f "$(TEMPLATE_PATH)/dump.mk" VARIABLE=CONTENT_TO_DUMP
endef
export CONTENT_TO_DUMP
.PHONY: $(TARGETS) all
all: $(TARGETS)
# Create build directories
$(OUTPUT_DIRECTORY):
$(MK) $#
$(OUTPUT_DIRECTORY)/%/.: | $(OUTPUT_DIRECTORY)
cd $(OUTPUT_DIRECTORY) && $(MK) $*
$(OUTPUT_DIRECTORY)/%.inc: Makefile | $(OUTPUT_DIRECTORY)
$(info Generating $#)
$(NO_ECHO)$(call dump, $(call target_specific, INC_PATHS, $*)) > $#
# $1 command
# $2 flags
# $3 message
define run
$(info $(call PROGRESS,$(3) file: $(notdir $($#)))) \
$(NO_ECHO)$(1) -MP -MD -c -o $# $(call get_path,$($#)) $(2) $(INC_PATHS)
endef
# Create object files from C source files
%.c.o:
$(call run,$(CC) -std=c99,$(CFLAGS),Compiling)
# Create object files from C++ source files
%.cpp.o:
$(call run,$(CXX),$(CFLAGS) $(CXXFLAGS),Compiling)
# Create object files from assembly source files
%.S.o %.s.o.o:
$(call run,$(CC) -x assembler-with-cpp,$(ASMFLAGS),Assembling)
ifeq ($(PASS_LINKER_INPUT_VIA_FILE),1)
GENERATE_LD_INPUT_FILE = $(call dump, $^ $(LIB_FILES)) > $(#:.out=.in)
LD_INPUT = #$(#:.out=.in)
else
GENERATE_LD_INPUT_FILE =
LD_INPUT = $^ $(LIB_FILES)
endif
# Link object files
%.out:
$(info $(call PROGRESS,Linking target: $#))
$(NO_ECHO)$(GENERATE_LD_INPUT_FILE)
$(NO_ECHO)$(CC) $(LDFLAGS) $(LD_INPUT) -Wl,-Map=$(#:.out=.map) -o $#
$(NO_ECHO)$(SIZE) $#
# Create binary .bin file from the .out file
%.bin: %.out
$(info Preparing: $#)
$(NO_ECHO)$(OBJCOPY) -O binary $< $#
# Create binary .hex file from the .out file
%.hex: %.out
$(info Preparing: $#)
$(NO_ECHO)$(OBJCOPY) -O ihex $< $#
endif # ifneq (,$(filter clean, $(MAKECMDGOALS)))
I want make to recompile whenever I use a new argument.
I think the easiest way in this Makefile would be to use different OUTPUT_DIRECTORY for each switch configuration that you care about. You can make different variants yourself or generalize, like so:
OUTPUT_DIRECTORY = $(shell echo $(CFLAGS) $(CXXFLAGS) | sha1sum | cut -f1 -d\ )
$(info Using output directory: $(OUTPUT_DIRECTORY))
.PHONY: all
all: $(OUTPUT_DIRECTORY)/foo
$(OUTPUT_DIRECTORY)/.:
mkdir -p $#
$(OUTPUT_DIRECTORY)/%: | $(OUTPUT_DIRECTORY)/.
touch $#
Output:
$ make
Using output directory: adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
mkdir -p adc83b19e793491b1c6ea0fd8b46cd9f32e592fc/.
touch adc83b19e793491b1c6ea0fd8b46cd9f32e592fc/foo
$ make CFLAGS=-g
Using output directory: 4e3223fc5750f1d1ef94845b09843555aee23f69
mkdir -p 4e3223fc5750f1d1ef94845b09843555aee23f69/.
touch 4e3223fc5750f1d1ef94845b09843555aee23f69/foo
$ make CFLAGS=-g
Using output directory: 4e3223fc5750f1d1ef94845b09843555aee23f69
make: Nothing to be done for 'all'.
$ make CFLAGS="-g -O2"
Using output directory: 29020c30ba848fbbf4c208ae78b5ed0362b24ce3
mkdir -p 29020c30ba848fbbf4c208ae78b5ed0362b24ce3/.
touch 29020c30ba848fbbf4c208ae78b5ed0362b24ce3/foo
Might require fine-tuning since $(OUTPUT_DIRECTORY) will be resolved when expanded (and therefore sha1sum counted many times - costly), but actual solution depends on where exactly variables are set.
How can I avoid rebuilding of targets every time even though there are no changes to them? I have looked at these answers: answer1, answer2, answer3, but I still could not solve my problem. I think I understand conceptually why this problem occurs. It is just that I was unable to apply the solutions to my case.
Here is my makefile:
.PHONY: all dircreate dircreate_sub
# Create shortcuts to directories ##############################################
DAT4 = data/4-Year/
RES4 = data/results/4-Year/
FIG4 = figures/4-Year/
DAT2 = data/2-Year/
RES2 = data/results/2-Year/
FIG2 = figures/2-Year/
DEPVARS = \
ret.1st.2nd.term.left \
ret.1st.2nd.year.left \
ret.1st.7th.year.grad \
ret.1st.5th.year.grad
# Create directories ###########################################################
dircreate:
mkdir -p \
data/ \
data/4-Year/ \
data/2-Year/ \
data/results/ \
data/results/4-Year \
data/results/2-Year \
figures/ \
figures/4-Year/ \
figures/2-Year/
dircreate_sub:
for d in $(DEPVARS); do \
mkdir -p data/4-Year/$$d ; \
mkdir -p data/2-Year/$$d ; \
mkdir -p data/results/4-Year/$$d ; \
mkdir -p data/results/2-Year/$$d ; \
mkdir -p figures/4-Year/$$d ; \
mkdir -p figures/2-Year/$$d ; \
done;
#TARGETS_DATAPREP := \
#$(foreach dat, $(DAT4) $(DAT2), $\
# $(foreach filename, \
# train_index_outer.RDS \
# train_outer.RDS \
# train_inter_outer.RDS, $\
# $(foreach depvar, $(DEPVARS),$(dat)$(depvar)/$(filename))))
# Data prep:####################################################################
TARGETS_DATAPREP := \
$(foreach filename, $\
train_index_outer.RDS \
train_outer.RDS \
train_inter_outer.RDS \
entire_data.RDS \
entire_inter_data.RDS, $\
$(foreach depvar, $(DEPVARS),$(DAT4)$(depvar)/$(filename)))
$(TARGETS_DATAPREP): \
dataprep.R \
funcs.R \
../core/data/analysis.data.RDS
Rscript $<
# benchmark:####################################################################
DEPENDENCIES_BENCHMARK := \
$(foreach filename, $\
train_index_outer.RDS \
train_outer.RDS \
train_inter_outer.RDS \
entire_data.RDS \
entire_inter_data.RDS, $\
$(foreach depvar, $(DEPVARS),$(DAT4)$(depvar)/$(filename)))
TARGETS_BENCHMARK := \
$(foreach filename, $\
logreg_inner.RDS \
l1logreg_inner.RDS \
l1logreg.int_inner.RDS \
rf_inner.RDS \
xgb_inner.RDS \
logreg_outer.RDS \
l1logreg_outer.RDS \
l1logreg.int_outer.RDS \
rf_outer.RDS \
xgb_outer.RDS, $\
$(foreach depvar, $(DEPVARS),$(RES4)$(depvar)/$(filename)))
$(TARGETS_BENCHMARK): \
benchmark.R \
funcs.R \
$(DEPENDENCIES_BENCHMARK)
Rscript $<
# Process:######################################################################
TARGETS_PROCESS := \
$(foreach filename, $\
processed_inner.RDS \
processed_inner_outer.RDS, $\
$(foreach depvar, $(DEPVARS),$(RES4)$(depvar)/$(filename)))
$(TARGETS_PROCESS): \
process.R \
funcs.R \
$(TARGETS_BENCHMARK)
Rscript $<
# Graphs:#######################################################################
TARGETS_GRAPHS := \
$(foreach filename, $\
ave_auc_inner.png \
ave_ppv10_inner.png \
dist_auc_inner.png \
dist_ppv10_inner.png \
roc_inner.png \
ave_auc_outer.png \
ave_ppv10_outer.png \
dist_auc_outer.png \
dist_ppv10_outer.png \
roc_outer.png \
ave_auc_ppv10_inner_outer.png \
roc_inner_outer.png \
thresh_inner_outer.png, $\
$(foreach depvar, $(DEPVARS),$(FIG4)$(depvar)/$(filename)))
$(TARGETS_GRAPHS): \
graphs.R \
funcs.R \
$(TARGETS_PROCESS)
Rscript $<
# Make all
all: $(TARGETS_PROCESS)
So, the make -nd tells me dircreate needs to be remade every time. That's why I also tried adding a variable called, say, OUTDIRS and also created a rule for it. So, instead of dircreate, I added this bit:
OUTDIRS: $(DAT4) $(RES4) $(FIG4) $(DAT2) $(RES2) $(FIG2)
OUTDIRS := \
for d in $(DEPVARS); do \
$(DAT4)$$d ; \
$(DAT2)$$d ; \
$(RES4)$$d ; \
$(RES2)$$d ; \
$(FIG4)$$d ; \
$(FIG2)$$d ; \
done;
$(OUTDIRS):
mkdir -p $#
But, this time I get a missing separator error at $(OUTDIRS): mkdir -p $#, which, I know, is unrelated to the main question, but I am wondering if the way I am going about is at least on the right track?
Suppose you have
DIRS := 2-Year 4-Year
DEPVARS := term year
and you want to construct:
2-Year/term 2-Year/year 4-Year/term 4-Year/year
You can do it this way:
OUTDIRS := $(foreach d,$(DIRS),$(addprefix $(d)/,$(DEPVARS)))
And once you have that working you can abstract it into a function:
Multiply= $(foreach d,$(1),$(addprefix $(d)/,$(2)))
OUTDIRS:=$(call Multiply, $(DIRS), $(DEPVARS))
And one you have that working you can use it to construct those trees of yours:
DIRS := data data/results figures
DIRS := $(DIRS) $(call Multiply, $(DIRS), 4-Year 2-Year)
DEPVARS := $(addprefix ret.1st., 2nd.term.left 2nd.year.left 7th.year.grad 5th.year.grad)
OUTDIRS:=$(call Multiply, $(DIRS), $(DEPVARS))
$(OUTDIRS):
mkdir -p $#
Note that if you want Make to create whichever of those directories don't exist, you must add another rule before the $(OUTDIRS) rule:
.PHONY: all-dirs
all-dirs: $(OUTDIRS)
I have a source code with thousands of media files and the following file structure:
files/module/file.vid
files/module/lang/file.vid
if 'files/module/lang/file.vid' exists, I want to copy it to target as is.
if not, I want to copy 'files/module/file.vid' into 'files/module/lang/file.vid' in target.
How can I do that with makefile?
PS: to be more precise, can the solution fit in the current piece below?
$(foreach lang,$(filter-out en-US,$(gb_HELP_LANGS)),$(eval $(call gb_AllLangPackage_add_files_for_lang,helpcontent2_html_media_lang,$(lang),$(LIBO_SHARE_HELP_FOLDER)$(if $(HELP_ONLINE),/$(PRODUCTVERSION))/media, \
files/scalc/$(lang)/imtrigon.vid \
files/scalc/$(lang)/trigon.vid \
files/scalc/$(lang)/pivot.vid \
files/scalc/$(lang)/functions_ifs.vid \
)))
Thanks
You can do this:
VIDDIR := files/module
LANGDIR := $(VIDDIR)/lang
TARGETDIR := target
VIDFILES := $(notdir $(wildcard $(VIDDIR)/*.vid))
TARGETVIDS := $(addprefix $(TARGETDIR)/,$(VIDFILES))
LANGVIDS := $(addprefix $(LANGDIR)/,$(VIDFILES))
all: $(TARGETVIDS) $(LANGVIDS)
$(TARGETDIR)/%.vid : $(LANGDIR)/%.vid
cp $< $#
$(LANGDIR)/%.vid: $(VIDDIR)/%.vid
cp $< $#
I have a macro the finds some files and stores them in a variable
ERR_FILES += \
$(addprefix $(COMP_DIR)/err/, $(C_SOURCES:.c=.err)) \
$(addprefix $(COMP_DIR)/err/, $(C1_SOURCES:.c=.err)) \
$(addprefix $(COMP_DIR)/err/, $(C2_SOURCES:.c=.err)) \
$(addprefix $(COMP_DIR)/err/, $(S_SOURCES:.s=.era)) \
$(addprefix $(COMP_DIR)/err/, $(ASM_SOURCES:.asm=.era))
I want it to "type" each file name out.
type $(ERR_FILES) is what I'm trying to use but it's coming up syntax error.
How can I do this?
type is not a valid UNIX command. That's a Windows command. Try echo to print the names of the files, or cat to show the contents of the files.