Merged in f5soh/librepilot/LP-608_HoTT_telemetry_revonano (pull request #527)
[librepilot.git] / Makefile
blob642931aa4d77275b9d007eaacbe8ce003e9aa743
2 # Top level Makefile for the LibrePilot Project build system.
3 # Copyright (c) 2015-2017, The LibrePilot Project, http://www.librepilot.org
4 # Copyright (c) 2010-2013, The OpenPilot Team, http://www.openpilot.org
5 # Use 'make help' for instructions.
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 # for more details.
17 # You should have received a copy of the GNU General Public License along
18 # with this program; if not, write to the Free Software Foundation, Inc.,
19 # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 # This top level Makefile passes down some variables to sub-makes through
23 # the environment. They are explicitly exported using the export keyword.
24 # Lower level makefiles assume that these variables are defined. To ensure
25 # that a special magic variable is exported here. It must be checked for
26 # existance by each sub-make.
27 export TOP_LEVEL_MAKEFILE := TRUE
29 # The root directory that this makefile resides in
30 export ROOT_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
32 # Include some helper functions
33 include $(ROOT_DIR)/make/functions.mk
35 # This file can be used to override default options using the "override" keyword
36 CONFIG_FILE := config
37 -include $(CONFIG_FILE)
39 ##############################
40 # It is possible to set DL_DIR and/or TOOLS_DIR environment
41 # variables to override local tools download and installation directorys. So the
42 # same toolchains can be used for all working copies. Particularly useful for CI
43 # server build agents, but also for local installations.
44 override DL_DIR := $(if $(DL_DIR),$(call slashfix,$(DL_DIR)),$(ROOT_DIR)/downloads)
45 override TOOLS_DIR := $(if $(TOOLS_DIR),$(call slashfix,$(TOOLS_DIR)),$(ROOT_DIR)/tools)
46 export DL_DIR
47 export TOOLS_DIR
49 # Set up some macros for common directories within the tree
50 export BUILD_DIR := $(CURDIR)/build
51 export PACKAGE_DIR := $(BUILD_DIR)/package
52 export DIST_DIR := $(BUILD_DIR)/dist
53 export GCS_SYNTH_DIR := $(BUILD_DIR)/gcs-synthetics
55 DIRS := $(DL_DIR) $(TOOLS_DIR) $(BUILD_DIR) $(PACKAGE_DIR) $(DIST_DIR) $(GCS_SYNTH_DIR)
57 # Naming for binaries and packaging etc,.
58 export ORG_BIG_NAME := LibrePilot
59 GCS_LABEL := GCS
60 GCS_BIG_NAME := $(ORG_BIG_NAME) $(GCS_LABEL)
61 # These should be lowercase with no spaces
62 export ORG_SMALL_NAME := $(call smallify,$(ORG_BIG_NAME))
63 GCS_SMALL_NAME := $(call smallify,$(GCS_BIG_NAME))
65 WEBSITE_URL := http://librepilot.org
66 GIT_URL := https://bitbucket.org/librepilot/librepilot.git
67 GITWEB_URL := https://bitbucket.org/librepilot/librepilot
68 # Change this once the DNS is set to http://wiki.librepilot.org/
69 WIKI_URL_ROOT := https://librepilot.atlassian.net/wiki/display/LPDOC/
70 USAGETRACKER_URL := https://usagetracker.librepilot.org/
72 PACKAGING_EMAIL_ADDRESS := packaging@librepilot.org
74 define DESCRIPTION_SHORT :=
75 A ground control station and firmware for UAV flight controllers
76 endef
78 define DESCRIPTION_LONG :=
79 The LibrePilot open source project was founded in July 2015.
80 It focuses on research and development of software and hardware to be used in a variety of applications including vehicle control and stabilization, unmanned autonomous vehicles and robotics.
81 One of the project's primary goals is to provide an open and collaborative environment making it the ideal home for development of innovative ideas.
82 endef
85 # Clean out undesirable variables from the environment and command-line
86 # to remove the chance that they will cause problems with our build
87 define SANITIZE_VAR
88 $(if $(filter-out undefined,$(origin $(1))),
89 $(info $(EMPTY) NOTE Sanitized $(2) variable '$(1)' from $(origin $(1)))
90 MAKEOVERRIDES = $(filter-out $(1)=%,$(MAKEOVERRIDES))
91 override $(1) :=
92 unexport $(1)
94 endef
96 # These specific variables can influence compilation in unexpected (and undesirable) ways
97 # gcc flags
98 SANITIZE_GCC_VARS := TMPDIR GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH
99 # preprocessor flags
100 SANITIZE_GCC_VARS += CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH DEPENDENCIES_OUTPUT
101 # make flags
102 SANITIZE_GCC_VARS += CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LDLIBS
103 $(foreach var, $(SANITIZE_GCC_VARS), $(eval $(call SANITIZE_VAR,$(var),disallowed)))
105 # These specific variables used to be valid but now they make no sense
106 SANITIZE_DEPRECATED_VARS := USE_BOOTLOADER CLEAN_BUILD
107 $(foreach var, $(SANITIZE_DEPRECATED_VARS), $(eval $(call SANITIZE_VAR,$(var),deprecated)))
109 # Decide on a verbosity level based on the V= parameter
110 export AT := @
111 ifndef V
112 export V0 :=
113 export V1 := $(AT)
114 else ifeq ($(V), 0)
115 export V0 := $(AT)
116 export V1 := $(AT)
117 else ifeq ($(V), 1)
118 endif
120 ARCH := $(call get_arch)
122 # Include tools installers
123 include $(ROOT_DIR)/make/tools.mk
125 # Include third party builders if available
126 -include $(ROOT_DIR)/make/3rdparty/3rdparty.mk
128 # We almost need to consider autoconf/automake instead of this
129 ifeq ($(UNAME), Linux)
130 UAVOBJGENERATOR := $(BUILD_DIR)/uavobjgenerator/uavobjgenerator
131 GCS_WITH_OSG := 1
132 GCS_WITH_OSGEARTH := 1
133 GCS_COPY_OSG := 0
134 GCS_WITH_GSTREAMER := 0
135 GCS_COPY_GSTREAMER := 0
136 else ifeq ($(UNAME), Darwin)
137 UAVOBJGENERATOR := $(BUILD_DIR)/uavobjgenerator/uavobjgenerator
138 GCS_WITH_OSG := 1
139 GCS_WITH_OSGEARTH := 0
140 GCS_COPY_OSG := 1
141 GCS_WITH_GSTREAMER := 0
142 GCS_COPY_GSTREAMER := 0
143 else ifeq ($(UNAME), Windows)
144 UAVOBJGENERATOR := $(BUILD_DIR)/uavobjgenerator/uavobjgenerator.exe
145 GCS_WITH_OSG := 1
146 GCS_WITH_OSGEARTH := 1
147 GCS_COPY_OSG := 1
148 GCS_WITH_GSTREAMER := 1
149 GCS_COPY_GSTREAMER := 1
150 endif
152 export UAVOBJGENERATOR
154 # Set up default build configurations (debug | release)
155 GCS_BUILD_CONF := release
157 # Set extra configuration
158 ifeq ($(GCS_WITH_OSG), 1)
159 GCS_EXTRA_CONF += osg
160 ifeq ($(GCS_COPY_OSG), 1)
161 GCS_EXTRA_CONF += copy_osg
162 endif
163 ifeq ($(GCS_WITH_OSGEARTH), 1)
164 GCS_EXTRA_CONF += osgearth
165 endif
166 endif
168 ifeq ($(GCS_WITH_GSTREAMER), 1)
169 GCS_EXTRA_CONF += gstreamer
170 ifeq ($(GCS_COPY_GSTREAMER), 1)
171 GCS_EXTRA_CONF += copy_gstreamer
172 endif
173 endif
175 ##############################
177 # All targets
179 ##############################
181 .PHONY: all
182 all: uavobjects all_ground all_flight
184 .PHONY: all_clean
185 all_clean:
186 @$(ECHO) " CLEAN $(call toprel, $(BUILD_DIR))"
187 $(V1) [ ! -d "$(BUILD_DIR)" ] || $(RM) -rf "$(BUILD_DIR)"
189 .PHONY: clean
190 clean: all_clean
193 ##############################
195 # UAVObjects
197 ##############################
199 UAVOBJGENERATOR_DIR := $(BUILD_DIR)/uavobjgenerator
200 DIRS += $(UAVOBJGENERATOR_DIR)
202 .PHONY: uavobjgenerator
203 uavobjgenerator: $(UAVOBJGENERATOR)
205 $(UAVOBJGENERATOR): | $(UAVOBJGENERATOR_DIR)
206 $(V1) cd $(UAVOBJGENERATOR_DIR) && \
207 ( [ -f Makefile ] || $(QMAKE) $(ROOT_DIR)/ground/uavobjgenerator/uavobjgenerator.pro \
208 CONFIG+='$(GCS_BUILD_CONF) $(GCS_EXTRA_CONF)' ) && \
209 $(MAKE) --no-print-directory -w
211 UAVOBJ_TARGETS := gcs flight arduino python matlab java wireshark
213 .PHONY: uavobjects
214 uavobjects: $(addprefix uavobjects_, $(UAVOBJ_TARGETS))
216 UAVOBJ_XML_DIR := $(ROOT_DIR)/shared/uavobjectdefinition
217 UAVOBJ_OUT_DIR := $(BUILD_DIR)/uavobject-synthetics
219 uavobjects_%: $(UAVOBJGENERATOR)
220 @$(MKDIR) -p $(UAVOBJ_OUT_DIR)/$*
221 $(V1) ( cd $(UAVOBJ_OUT_DIR)/$* && \
222 $(UAVOBJGENERATOR) -$* $(UAVOBJ_XML_DIR) $(ROOT_DIR) ; \
225 OBJECTCOUNT := $(shell find $(ROOT_DIR)/python/librepilot/uavobjects/ -name '*.py' | wc -l)
226 uavobjects_python_install:
227 $(V1) if [ $(OBJECTCOUNT) -gt 2 ]; then echo "UAVObjects already exist"; else make uavobjects_python; fi
228 $(V1) mkdir -p $(ROOT_DIR)/python/librepilot/uavobjects/
229 $(V1) ( touch $(ROOT_DIR)/python/librepilot/uavobjects/__init__.py )
230 $(V1) ( cp $(UAVOBJ_OUT_DIR)/python/* $(ROOT_DIR)/python/librepilot/uavobjects/ )
231 $(V1) ( cd $(ROOT_DIR)/python/ && sudo python setup.py build && sudo python setup.py install)
233 uavobjects_python_clean:
234 @$(ECHO) " CLEAN $(call toprel, $(ROOT_DIR)/python/librepilot/uavobjects/)"
235 $(V1) [ ! -d "$(ROOT_DIR)/python/librepilot/uavobjects/" ] || $(RM) -r "$(ROOT_DIR)/python/librepilot/uavobjects/"
236 @$(ECHO) " CLEAN $(call toprel, $(ROOT_DIR)/python/librepilot/build/)"
237 $(V1) [ ! -d "$(ROOT_DIR)/python/librepilot/build/" ] || sudo $(RM) -r "$(ROOT_DIR)/python/librepilot/build/"
238 @$(ECHO) " CLEAN $(call toprel, $(UAVOBJ_OUT_DIR)/python/)"
239 $(V1) [ ! -d "$(UAVOBJ_OUT_DIR)/python/" ] || $(RM) -r "$(UAVOBJ_OUT_DIR)/python/"
242 uavobjects_test: $(UAVOBJGENERATOR)
243 $(V1) $(UAVOBJGENERATOR) -v $(UAVOBJ_XML_DIR) $(ROOT_DIR)
245 uavobjects_clean:
246 @$(ECHO) " CLEAN $(call toprel, $(UAVOBJ_OUT_DIR))"
247 $(V1) [ ! -d "$(UAVOBJ_OUT_DIR)" ] || $(RM) -r "$(UAVOBJ_OUT_DIR)"
249 ##############################
251 # Flight related components
253 ##############################
256 # When building any of the "all_*" targets, tell all sub makefiles to display
257 # additional details on each line of output to describe which build and target
258 # that each line applies to. The same applies also to all, fw_resource,
259 # package targets
260 ifneq ($(strip $(filter all_% all fw_resource package,$(MAKECMDGOALS))),)
261 export ENABLE_MSG_EXTRA := yes
262 endif
264 # When building more than one goal in a single make invocation, also
265 # enable the extra context for each output line
266 ifneq ($(word 2,$(MAKECMDGOALS)),)
267 export ENABLE_MSG_EXTRA := yes
268 endif
270 FLIGHT_OUT_DIR := $(BUILD_DIR)/firmware
271 DIRS += $(FLIGHT_OUT_DIR)
273 # Might not be here in source package
274 -include $(ROOT_DIR)/flight/Makefile
276 ##############################
278 # GCS related components
280 ##############################
282 .PHONY: all_ground
283 all_ground: gcs uploader
285 ifneq ($(V), 1)
286 GCS_EXTRA_CONF += silent
287 endif
289 GCS_DIR := $(BUILD_DIR)/$(GCS_SMALL_NAME)_$(GCS_BUILD_CONF)
290 DIRS += $(GCS_DIR)
292 GCS_MAKEFILE := $(GCS_DIR)/Makefile
294 .PHONY: gcs_qmake
295 gcs_qmake $(GCS_MAKEFILE): | $(GCS_DIR)
296 $(V1) cd $(GCS_DIR) && \
297 $(QMAKE) $(ROOT_DIR)/ground/gcs/gcs.pro \
298 -r CONFIG+='$(GCS_BUILD_CONF) $(GCS_EXTRA_CONF)' \
299 'GCS_BIG_NAME="$(GCS_BIG_NAME)"' GCS_SMALL_NAME=$(GCS_SMALL_NAME) \
300 'ORG_BIG_NAME="$(ORG_BIG_NAME)"' ORG_SMALL_NAME=$(ORG_SMALL_NAME) \
301 'WIKI_URL_ROOT="$(WIKI_URL_ROOT)"' \
302 'USAGETRACKER_URL="$(USAGETRACKER_URL)"' \
303 'GCS_LIBRARY_BASENAME=$(libbasename)' \
304 $(GCS_QMAKE_OPTS)
306 .PHONY: gcs
307 gcs: $(UAVOBJGENERATOR) $(GCS_MAKEFILE)
308 $(V1) $(MAKE) -w -C $(GCS_DIR)/$(MAKE_DIR);
310 .PHONY: gcs_clean
311 gcs_clean:
312 @$(ECHO) " CLEAN $(call toprel, $(GCS_DIR))"
313 $(V1) [ ! -d "$(GCS_DIR)" ] || $(RM) -r "$(GCS_DIR)"
317 ################################
319 # Serial Uploader tool
321 ################################
323 UPLOADER_DIR := $(BUILD_DIR)/uploader_$(GCS_BUILD_CONF)
324 DIRS += $(UPLOADER_DIR)
326 UPLOADER_MAKEFILE := $(UPLOADER_DIR)/Makefile
328 .PHONY: uploader_qmake
329 uploader_qmake $(UPLOADER_MAKEFILE): | $(UPLOADER_DIR)
330 $(V1) cd $(UPLOADER_DIR) && \
331 $(QMAKE) $(ROOT_DIR)/ground/gcs/src/experimental/USB_UPLOAD_TOOL/upload.pro \
332 -r CONFIG+='$(GCS_BUILD_CONF) $(GCS_EXTRA_CONF)' $(GCS_QMAKE_OPTS)
334 .PHONY: uploader
335 uploader: $(UPLOADER_MAKEFILE)
336 $(V1) $(MAKE) -w -C $(UPLOADER_DIR)
338 .PHONY: uploader_clean
339 uploader_clean:
340 @$(ECHO) " CLEAN $(call toprel, $(UPLOADER_DIR))"
341 $(V1) [ ! -d "$(UPLOADER_DIR)" ] || $(RM) -r "$(UPLOADER_DIR)"
345 ##############################
347 # Packaging components
349 ##############################
350 # Firmware files to package
351 PACKAGE_FW_TARGETS := fw_coptercontrol fw_revolution fw_revonano fw_sparky2
352 PACKAGE_FW_TARGETS += fw_oplinkmini
353 PACKAGE_FW_TARGETS += fw_gpsplatinum
354 PACKAGE_FW_TARGETS += fw_osd
355 PACKAGE_FW_TARGETS += fw_revoproto
356 PACKAGE_FW_TARGETS += fw_spracingf3evo fw_spracingf3 fw_nucleof303re fw_pikoblx fw_tinyfish
358 # Rules to generate GCS resources used to embed firmware binaries into the GCS.
359 # They are used later by the vehicle setup wizard to update board firmware.
360 # To open a firmware image use ":/firmware/fw_coptercontrol.opfw"
361 FW_RESOURCE := $(GCS_SYNTH_DIR)/fw_resource.qrc
363 ifeq ($(WITH_PREBUILT_FW),)
364 FIRMWARE_DIR := $(FLIGHT_OUT_DIR)
365 # We need to build the FW targets
366 $(FW_RESOURCE): $(PACKAGE_FW_TARGETS)
367 else
368 FIRMWARE_DIR := $(WITH_PREBUILT_FW)
369 endif
371 FW_FILES := $(foreach fw_targ, $(PACKAGE_FW_TARGETS), $(FIRMWARE_DIR)/$(fw_targ)/$(fw_targ).opfw)
372 FW_CONTENTS := \
373 <!DOCTYPE RCC><RCC version="1.0"> \
374 <qresource prefix="/firmware"> \
375 $(foreach fw_file, $(FW_FILES), <file alias="$(notdir $(fw_file))">$(call system_path,$(fw_file))</file>) \
376 </qresource> \
377 </RCC>
379 .PHONY: fw_resource
380 fw_resource: $(FW_RESOURCE)
381 fw_resource: $(FW_RESOURCE)
383 $(FW_RESOURCE): | $(GCS_SYNTH_DIR)
384 @$(ECHO) Generating FW resource file $(call toprel, $@)
385 $(V1) $(ECHO) $(QUOTE)$(FW_CONTENTS)$(QUOTE) > $@
387 # If fw_resource or all firmware are requested, GCS should depend on the resource
388 ifneq ($(strip $(filter fw_resource all all_fw all_flight package,$(MAKECMDGOALS))),)
389 $(GCS_MAKEFILE): $(FW_RESOURCE)
390 endif
392 # Packaging targets: package
393 # - builds all firmware, fw_resource, gcs
394 # - copies firmware into a package directory
395 # - calls paltform-specific packaging script
397 # Define some variables
398 PACKAGE_LBL := $(shell $(VERSION_INFO) --format=\$${LABEL})
399 PACKAGE_NAME := $(subst $(SPACE),,$(ORG_BIG_NAME))
400 PACKAGE_SEP := -
401 PACKAGE_FULL_NAME := $(PACKAGE_NAME)$(PACKAGE_SEP)$(PACKAGE_LBL)
403 # Source distribution is never dirty because it uses git archive
404 DIST_LBL := $(subst -dirty,,$(PACKAGE_LBL))
405 DIST_NAME := $(PACKAGE_NAME)$(PACKAGE_SEP)$(DIST_LBL)
406 DIST_TAR := $(DIST_DIR)/$(DIST_NAME).tar
407 DIST_TAR_GZ := $(DIST_TAR).gz
408 FW_DIST_NAME := $(DIST_NAME)_firmware
409 FW_DIST_TAR := $(DIST_DIR)/$(FW_DIST_NAME).tar
410 FW_DIST_TAR_GZ := $(FW_DIST_TAR).gz
411 DIST_VER_INFO := $(DIST_DIR)/version-info.json
413 include $(ROOT_DIR)/package/$(UNAME).mk
415 ##############################
417 # Source for distribution
419 ##############################
420 FORCE:
422 $(DIST_VER_INFO): FORCE | $(DIST_DIR)
423 $(V1) $(VERSION_INFO) --jsonpath="$(DIST_DIR)"
425 $(DIST_TAR): $(DIST_VER_INFO) | $(DIST_DIR)
426 @$(ECHO) " SOURCE FOR DISTRIBUTION $(call toprel, $(DIST_TAR))"
427 $(V1) git archive --prefix="$(PACKAGE_NAME)/" -o "$(DIST_TAR)" HEAD
428 $(V1) tar --append --file="$(DIST_TAR)" \
429 --owner=root --group=root --mtime="`git show -s --format=%ci`" \
430 --transform='s,.*version-info.json,$(PACKAGE_NAME)/version-info.json,' \
431 $(call toprel, "$(DIST_VER_INFO)")
433 $(DIST_TAR_GZ): $(DIST_TAR)
434 @$(ECHO) " SOURCE FOR DISTRIBUTION $(call toprel, $(DIST_TAR_GZ))"
435 $(V1) gzip -knf "$(DIST_TAR)"
437 .PHONY: dist_tar_gz
438 dist_tar_gz: $(DIST_TAR_GZ)
440 .PHONY: dist
441 dist: dist_tar_gz
444 $(FW_DIST_TAR): $(PACKAGE_FW_TARGETS) | $(DIST_DIR)
445 @$(ECHO) " FIRMWARE FOR DISTRIBUTION $(call toprel, $(FW_DIST_TAR))"
446 $(V1) tar -c --file="$(FW_DIST_TAR)" --directory=$(FLIGHT_OUT_DIR) \
447 --owner=root --group=root --mtime="`git show -s --format=%ci`" \
448 --transform='s,^,firmware/,' \
449 --force-local \
450 $(foreach fw_targ,$(PACKAGE_FW_TARGETS),$(fw_targ)/$(fw_targ).opfw)
452 $(FW_DIST_TAR_GZ): $(FW_DIST_TAR)
453 @$(ECHO) " FIRMWARE FOR DISTRIBUTION $(call toprel, $(FW_DIST_TAR_GZ))"
454 $(V1) gzip -knf "$(FW_DIST_TAR)"
456 .PHONY: fw_dist_tar_gz
457 fw_dist_tar_gz: $(FW_DIST_TAR_GZ)
459 .PHONY: fw_dist
460 fw_dist: fw_dist_tar_gz
463 ##############################
465 # Source code formatting
467 ##############################
469 UNCRUSTIFY_TARGETS := flight ground
471 # $(1) = Uncrustify target (e.g flight or ground)
472 # $(2) = Target root directory
473 define UNCRUSTIFY_TEMPLATE
475 .PHONY: uncrustify_$(1)
476 uncrustify_$(1):
477 @$(ECHO) "Auto-formatting $(1) source code"
478 $(V1) UNCRUSTIFY_CONFIG="$(ROOT_DIR)/make/uncrustify/uncrustify.cfg" $(SHELL) make/scripts/uncrustify.sh $(call toprel, $(2))
480 .PHONY: pretty_$(1)
481 pretty_$(1): uncrustify_$(1)
482 endef
484 $(foreach uncrustify_targ, $(UNCRUSTIFY_TARGETS), $(eval $(call UNCRUSTIFY_TEMPLATE,$(uncrustify_targ),$(ROOT_DIR)/$(uncrustify_targ))))
486 .PHONY: uncrustify_all
487 uncrustify_all: $(addprefix uncrustify_,$(UNCRUSTIFY_TARGETS))
489 .PHONY: pretty
490 pretty: $(addprefix pretty_,$(UNCRUSTIFY_TARGETS))
492 ##############################
494 # Doxygen documentation
496 # Each target should have own Doxyfile.$(target) with build directory build/docs/$(target),
497 # proper source directory (e.g. $(target)) and appropriate other doxygen options.
499 ##############################
501 DOCS_TARGETS := flight ground uavobjects
503 # $(1) = Doxygen target (e.g flight or ground)
504 define DOXYGEN_TEMPLATE
506 .PHONY: docs_$(1)
507 docs_$(1): docs_$(1)_clean
508 @$(ECHO) "Generating $(1) documentation"
509 $(V1) $(MKDIR) -p $(BUILD_DIR)/docs/$(1)
510 $(V1) $(DOXYGEN) $(ROOT_DIR)/make/doxygen/Doxyfile.$(1)
512 .PHONY: docs_$(1)_clean
513 docs_$(1)_clean:
514 @$(ECHO) " CLEAN $(call toprel, $(BUILD_DIR)/docs/$(1))"
515 $(V1) [ ! -d "$(BUILD_DIR)/docs/$(1)" ] || $(RM) -r "$(BUILD_DIR)/docs/$(1)"
517 endef
519 $(foreach docs_targ, $(DOCS_TARGETS), $(eval $(call DOXYGEN_TEMPLATE,$(docs_targ))))
521 .PHONY: docs_all
522 docs_all: $(addprefix docs_,$(DOCS_TARGETS))
524 .PHONY: docs_all_clean
525 docs_all_clean:
526 @$(ECHO) " CLEAN $(call toprel, $(BUILD_DIR)/docs)"
527 $(V1) [ ! -d "$(BUILD_DIR)/docs" ] || $(RM) -rf "$(BUILD_DIR)/docs"
529 ##############################
531 # Build info
533 ##############################
535 .PHONY: build-info
536 build-info: | $(BUILD_DIR)
537 @$(ECHO) " BUILD-INFO $(call toprel, $(BUILD_DIR)/$@.txt)"
538 $(V1) $(VERSION_INFO) \
539 --uavodir=$(ROOT_DIR)/shared/uavobjectdefinition \
540 --template="make/templates/$@.txt" \
541 --outfile="$(BUILD_DIR)/$@.txt"
543 ##############################
545 # Config
547 ##############################
549 CONFIG_OPTS := $(subst \$(SPACE),%SPACE_PLACEHOLDER%,$(MAKEOVERRIDES))
550 CONFIG_OPTS := $(addprefix override%SPACE_PLACEHOLDER%,$(CONFIG_OPTS))
551 CONFIG_OPTS := $(subst $(SPACE),\n,$(CONFIG_OPTS))\n
552 CONFIG_OPTS := $(subst %SPACE_PLACEHOLDER%,$(SPACE),$(CONFIG_OPTS))
554 .PHONY: config_new
555 config_new:
556 @printf '$(CONFIG_OPTS)' > $(CONFIG_FILE)
558 .PHONY: config_append
559 config_append:
560 @printf '$(CONFIG_OPTS)' >> $(CONFIG_FILE)
562 .PHONY: config_show
563 config_show:
564 @cat $(CONFIG_FILE) | sed 's/override *//'
566 .PHONY: config_clean
567 config_clean:
568 rm -f $(CONFIG_FILE)
570 .PHONY: config_help
571 config_help:
572 @$(ECHO) " The build system has a simple system for persistent configuration"
573 @$(ECHO)
574 @$(ECHO) " To set persistent configuration variables you, for example, do:"
575 @$(ECHO) " $(MAKE) config_new CCACHE=ccache GCS_WITH_OSG=0"
576 @$(ECHO)
577 @$(ECHO) " To add to the existing configuration do:"
578 @$(ECHO) " $(MAKE) config_append GCS_BUILD_CONF=debug"
579 @$(ECHO)
580 @$(ECHO) " To reset the configuration to defaults do:"
581 @$(ECHO) " $(MAKE) config_clean"
582 @$(ECHO)
583 @$(ECHO) " To show the current configuration:"
584 @$(ECHO) " $(MAKE) config_show"
585 @$(ECHO)
586 @$(ECHO) " You can override any make variable this way, but these are the useful ones"
587 @$(ECHO) " shown with their current (or default values):"
588 @$(ECHO)
589 @$(ECHO) " GCS_BUILD_CONF=$(GCS_BUILD_CONF)"
590 @$(ECHO) " GCS build type"
591 @$(ECHO) " Options: debug or release"
592 @$(ECHO)
593 @$(ECHO) " GCS_WITH_OSG=$(GCS_WITH_OSG)"
594 @$(ECHO) " Build the GCS with OpenSceneGraph support, this enables the PFD Model View"
595 @$(ECHO) " Options: 0 or 1"
596 @$(ECHO)
597 @$(ECHO) " GCS_WITH_OSGEARTH=$(GCS_WITH_OSGEARTH)"
598 @$(ECHO) " Build the GCS with osgEarth support, this enables extra PFD terrain views"
599 @$(ECHO) " Options: 0 or 1"
600 @$(ECHO)
601 @$(ECHO) " GCS_COPY_OSG=$(GCS_COPY_OSG)"
602 @$(ECHO) " Copy OpenSceneGraph/osgEarth libraries into the build"
603 @$(ECHO) " (Needed unless using system versions)"
604 @$(ECHO) " Options: 0 or 1"
605 @$(ECHO)
606 @$(ECHO) " GCS_WITH_GSTREAMER=$(GCS_WITH_GSTREAMER)"
607 @$(ECHO) " Build the GCS with GStreamer support, this enables the video gadget and extra PFD video views"
608 @$(ECHO) " Options: 0 or 1"
609 @$(ECHO)
610 @$(ECHO) " CCACHE=$(CCACHE)"
611 @$(ECHO) " A prefix to compiler invocations, usually 'ccache' or 'path/to/ccache'"
612 @$(ECHO)
613 @$(ECHO) " QMAKE=$(QMAKE)"
614 @$(ECHO) " How to invoke qmake, usually 'qmake', 'qmake-qt5' or 'path/to/qmake'"
615 @$(ECHO)
616 @$(ECHO) " WITH_PREBUILT_FIRMWARE=$(WITH_PREBUILT_FIRMWARE)"
617 @$(ECHO) " Set to path of prebuilt firmware or empty to build firmware when needed"
618 # TODO: add other things like downloads and tools directories, linux make install parameters
622 ##############################
624 # Directories
626 ##############################
628 $(DIRS):
629 $(V1) $(MKDIR) -p $@
632 ##############################
634 # Help message, the default Makefile goal
636 ##############################
638 .DEFAULT_GOAL := help
640 .PHONY: help
641 help:
642 @$(ECHO)
643 @$(ECHO) " This Makefile is known to work on Linux and Mac in a standard shell environment."
644 @$(ECHO) " It also works on Windows by following the instructions given on this wiki page:"
645 @$(ECHO) " $(WIKI_URL_ROOT)Windows+Building+and+Packaging"
646 @$(ECHO)
647 @$(ECHO) " Here is a summary of the available targets:"
648 @$(ECHO)
649 @$(ECHO) " [Source tree preparation]"
650 @$(ECHO) " prepare - Install GIT commit message template"
651 @$(ECHO) " [Tool Installers]"
652 @$(ECHO) " arm_sdk_install - Install the GNU ARM gcc toolchain"
653 @$(ECHO) " qt_sdk_install - Install the QT development tools"
654 @$(ECHO) " nsis_install - Install the NSIS Unicode (Windows only)"
655 @$(ECHO) " mesawin_install - Install the OpenGL32 DLL (Windows only)"
656 @$(ECHO) " uncrustify_install - Install the Uncrustify source code beautifier"
657 @$(ECHO) " doxygen_install - Install the Doxygen documentation generator"
658 @$(ECHO) " gtest_install - Install the GoogleTest framework"
659 @$(ECHO) " ccache_install - Install ccache"
660 @$(ECHO) " These targets are not updated yet and are probably broken:"
661 @$(ECHO) " openocd_install - Install the OpenOCD JTAG daemon"
662 @$(ECHO) " stm32flash_install - Install the stm32flash tool for unbricking F1-based boards"
663 @$(ECHO) " dfuutil_install - Install the dfu-util tool for unbricking F4-based boards"
664 @$(ECHO) " Install all available tools:"
665 @$(ECHO) " all_sdk_install - Install all of above (platform-dependent)"
666 @$(ECHO) " build_sdk_install - Install only essential for build tools (platform-dependent)"
667 @$(ECHO)
668 @$(ECHO) " Other tool options are:"
669 @$(ECHO) " <tool>_version - Display <tool> version"
670 @$(ECHO) " <tool>_clean - Remove installed <tool>"
671 @$(ECHO) " <tool>_distclean - Remove downloaded <tool> distribution file(s)"
672 @$(ECHO)
673 @$(ECHO) " [Big Hammer]"
674 @$(ECHO) " all - Generate UAVObjects, build $(ORG_BIG_NAME) firmware and gcs"
675 @$(ECHO) " all_flight - Build all firmware, bootloaders and bootloader updaters"
676 @$(ECHO) " all_fw - Build only firmware for all boards"
677 @$(ECHO) " all_bl - Build only bootloaders for all boards"
678 @$(ECHO) " all_bu - Build only bootloader updaters for all boards"
679 @$(ECHO)
680 @$(ECHO) " all_clean - Remove your build directory ($(BUILD_DIR))"
681 @$(ECHO) " all_flight_clean - Remove all firmware, bootloaders and bootloader updaters"
682 @$(ECHO) " all_fw_clean - Remove firmware for all boards"
683 @$(ECHO) " all_bl_clean - Remove bootloaders for all boards"
684 @$(ECHO) " all_bu_clean - Remove bootloader updaters for all boards"
685 @$(ECHO)
686 @$(ECHO) " all_<board> - Build all available images for <board>"
687 @$(ECHO) " all_<board>_clean - Remove all available images for <board>"
688 @$(ECHO)
689 @$(ECHO) " all_ut - Build all unit tests"
690 @$(ECHO) " all_ut_tap - Run all unit tests and capture all TAP output to files"
691 @$(ECHO) " all_ut_run - Run all unit tests and dump TAP output to console"
692 @$(ECHO)
693 @$(ECHO) " [Firmware]"
694 @$(ECHO) " <board> - Build firmware for <board>"
695 @$(ECHO) " Supported boards are ($(ALL_BOARDS))"
696 @$(ECHO) " fw_<board> - Build firmware for <board>"
697 @$(ECHO) " Supported boards are ($(FW_BOARDS))"
698 @$(ECHO) " fw_<board>_clean - Remove firmware for <board>"
699 @$(ECHO) " fw_<board>_program - Use OpenOCD + JTAG to write firmware to <board>"
700 @$(ECHO)
701 @$(ECHO) " [Bootloader]"
702 @$(ECHO) " bl_<board> - Build bootloader for <board>"
703 @$(ECHO) " Supported boards are ($(BL_BOARDS))"
704 @$(ECHO) " bl_<board>_clean - Remove bootloader for <board>"
705 @$(ECHO) " bl_<board>_program - Use OpenOCD + JTAG to write bootloader to <board>"
706 @$(ECHO)
707 @$(ECHO) " [Entire Flash]"
708 @$(ECHO) " ef_<board> - Build entire flash image for <board>"
709 @$(ECHO) " Supported boards are ($(EF_BOARDS))"
710 @$(ECHO) " ef_<board>_clean - Remove entire flash image for <board>"
711 @$(ECHO) " ef_<board>_program - Use OpenOCD + JTAG to write entire flash image to <board>"
712 @$(ECHO)
713 @$(ECHO) " [Bootloader Updater]"
714 @$(ECHO) " bu_<board> - Build bootloader updater for <board>"
715 @$(ECHO) " Supported boards are ($(BU_BOARDS))"
716 @$(ECHO) " bu_<board>_clean - Remove bootloader updater for <board>"
717 @$(ECHO)
718 @$(ECHO) " [Unbrick a board]"
719 @$(ECHO) " unbrick_<board> - Use the STM32's built in boot ROM to write a bootloader to <board>"
720 @$(ECHO) " Supported boards are ($(BL_BOARDS))"
721 @$(ECHO) " [Unittests]"
722 @$(ECHO) " ut_<test> - Build unit test <test>"
723 @$(ECHO) " ut_<test>_xml - Run test and capture XML output into a file"
724 @$(ECHO) " ut_<test>_run - Run test and dump output to console"
725 @$(ECHO)
726 @$(ECHO) " [Simulation]"
727 @$(ECHO) " sim_osx - Build $(ORG_BIG_NAME) simulation firmware for OSX"
728 @$(ECHO) " sim_osx_clean - Delete all build output for the osx simulation"
729 @$(ECHO) " sim_win32 - Build $(ORG_BIG_NAME) simulation firmware for Windows"
730 @$(ECHO) " using mingw and msys"
731 @$(ECHO) " sim_win32_clean - Delete all build output for the win32 simulation"
732 @$(ECHO)
733 @$(ECHO) " [GCS]"
734 @$(ECHO) " gcs - Build the Ground Control System (GCS) application (debug|release)"
735 @$(ECHO) " Compile specific directory: MAKE_DIR=<dir>"
736 @$(ECHO) " Example: make gcs MAKE_DIR=src/plugins/coreplugin"
737 @$(ECHO) " gcs_qmake - Run qmake for the Ground Control System (GCS) application (debug|release)"
738 @$(ECHO) " gcs_clean - Remove the Ground Control System (GCS) application (debug|release)"
739 @$(ECHO) " Supported build configurations: GCS_BUILD_CONF=debug|release (default is $(GCS_BUILD_CONF))"
740 @$(ECHO)
741 @$(ECHO) " [Uploader Tool]"
742 @$(ECHO) " uploader - Build the serial uploader tool (debug|release)"
743 @$(ECHO) " uploader_qmake - Run qmake for the serial uploader tool (debug|release)"
744 @$(ECHO) " uploader_clean - Remove the serial uploader tool (debug|release)"
745 @$(ECHO) " Supported build configurations: GCS_BUILD_CONF=debug|release (default is $(GCS_BUILD_CONF))"
746 @$(ECHO)
747 @$(ECHO)
748 @$(ECHO) " [UAVObjects]"
749 @$(ECHO) " uavobjects - Generate source files from the UAVObject definition XML files"
750 @$(ECHO) " uavobjects_test - Parse xml-files - check for valid, duplicate ObjId's, ..."
751 @$(ECHO) " uavobjects_<group> - Generate source files from a subset of the UAVObject definition XML files"
752 @$(ECHO) " Supported groups are ($(UAVOBJ_TARGETS))"
753 @$(ECHO) " uavobjects_python_install"
754 @$(ECHO) " - Install generated python files as eggs for use with example Python scripts"
755 @$(ECHO) " uavobjects_python_clean"
756 @$(ECHO) " - Remove generated python UAVOs from build directory & pyuavtalk folder"
757 @$(ECHO)
758 @$(ECHO) " [Packaging]"
759 @$(ECHO) " package - Build and package the platform-dependent package (no clean)"
760 @$(ECHO) " fw_resource - Generate resources to embed firmware binaries into the GCS"
761 @$(ECHO) " dist - Generate source archive for distribution"
762 @$(ECHO) " fw_dist - Generate archive of firmware"
763 @$(ECHO) " install - Install GCS to \"DESTDIR\" with prefix \"prefix\" (Linux only)"
764 @$(ECHO)
765 @$(ECHO) " [Code Formatting]"
766 @$(ECHO) " pretty_<source> - Reformat <source> code according to the project's standards"
767 @$(ECHO) " Supported sources are ($(UNCRUSTIFY_TARGETS))"
768 @$(ECHO) " pretty - Reformat all source code"
769 @$(ECHO)
770 @$(ECHO) " [Code Documentation]"
771 @$(ECHO) " docs_<source> - Generate HTML documentation for <source>"
772 @$(ECHO) " Supported sources are ($(DOCS_TARGETS))"
773 @$(ECHO) " docs_all - Generate HTML documentation for all"
774 @$(ECHO) " docs_<source>_clean - Delete generated documentation for <source>"
775 @$(ECHO) " docs_all_clean - Delete all generated documentation"
776 @$(ECHO)
777 @$(ECHO) " [Configuration]"
778 @$(ECHO) " config_help - Show information on how to configure the build"
779 @$(ECHO) " config_new - Place your make arguments in the config file"
780 @$(ECHO) " config_append - Place your make arguments in the config file but append"
781 @$(ECHO) " config_clean - Removes the config file"
782 @$(ECHO)
783 @$(ECHO) " Hint: Add V=1 to your command line to see verbose build output."
784 @$(ECHO)
785 @$(ECHO) " Notes: All tool distribution files will be downloaded into $(DL_DIR)"
786 @$(ECHO) " All tools will be installed into $(TOOLS_DIR)"
787 @$(ECHO) " All build output will be placed in $(BUILD_DIR)"
788 @$(ECHO)
789 @$(ECHO) " Tool download and install directories can be changed using environment variables:"
790 @$(ECHO) " DL_DIR full path to downloads directory [downloads if not set]"
791 @$(ECHO) " TOOLS_DIR full path to installed tools directory [tools if not set]"
792 @$(ECHO) " More info: $(WIKI_URL_ROOT)LibrePilot+Build+System+Overview"
793 @$(ECHO)