Update WHATSNEW.txt for rel-16.09 RC1
[librepilot.git] / Makefile
blobff952865c530c486d45547816f9ca2b97c7059f4
2 # Top level Makefile for the LibrePilot Project build system.
3 # Copyright (c) 2015, 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 OPGCSSYNTHDIR := $(BUILD_DIR)/gcs-synthetics
55 DIRS := $(DL_DIR) $(TOOLS_DIR) $(BUILD_DIR) $(PACKAGE_DIR) $(DIST_DIR) $(OPGCSSYNTHDIR)
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 else ifeq ($(UNAME), Darwin)
135 UAVOBJGENERATOR := $(BUILD_DIR)/uavobjgenerator/uavobjgenerator
136 GCS_WITH_OSG := 1
137 GCS_WITH_OSGEARTH := 0
138 GCS_COPY_OSG := 1
139 else ifeq ($(UNAME), Windows)
140 UAVOBJGENERATOR := $(BUILD_DIR)/uavobjgenerator/uavobjgenerator.exe
141 GCS_WITH_OSG := 1
142 GCS_WITH_OSGEARTH := 1
143 GCS_COPY_OSG := 1
144 endif
146 export UAVOBJGENERATOR
148 # Set up default build configurations (debug | release)
149 GCS_BUILD_CONF := release
151 # Set extra configuration
152 ifeq ($(GCS_WITH_OSG), 1)
153 GCS_EXTRA_CONF += osg
154 ifeq ($(GCS_COPY_OSG), 1)
155 GCS_EXTRA_CONF += copy_osg
156 endif
157 ifeq ($(GCS_WITH_OSGEARTH), 1)
158 GCS_EXTRA_CONF += osgearth
159 endif
160 endif
162 ##############################
164 # All targets
166 ##############################
168 .PHONY: all
169 all: uavobjects all_ground all_flight
171 .PHONY: all_clean
172 all_clean:
173 @$(ECHO) " CLEAN $(call toprel, $(BUILD_DIR))"
174 $(V1) [ ! -d "$(BUILD_DIR)" ] || $(RM) -rf "$(BUILD_DIR)"
176 .PHONY: clean
177 clean: all_clean
180 ##############################
182 # UAVObjects
184 ##############################
186 UAVOBJGENERATOR_DIR := $(BUILD_DIR)/uavobjgenerator
187 DIRS += $(UAVOBJGENERATOR_DIR)
189 .PHONY: uavobjgenerator
190 uavobjgenerator: $(UAVOBJGENERATOR)
192 $(UAVOBJGENERATOR): | $(UAVOBJGENERATOR_DIR)
193 $(V1) cd $(UAVOBJGENERATOR_DIR) && \
194 ( [ -f Makefile ] || $(QMAKE) $(ROOT_DIR)/ground/uavobjgenerator/uavobjgenerator.pro \
195 CONFIG+='$(GCS_BUILD_CONF) $(GCS_EXTRA_CONF)' ) && \
196 $(MAKE) --no-print-directory -w
198 UAVOBJ_TARGETS := gcs flight python matlab java wireshark
200 .PHONY: uavobjects
201 uavobjects: $(addprefix uavobjects_, $(UAVOBJ_TARGETS))
203 UAVOBJ_XML_DIR := $(ROOT_DIR)/shared/uavobjectdefinition
204 UAVOBJ_OUT_DIR := $(BUILD_DIR)/uavobject-synthetics
206 uavobjects_%: $(UAVOBJGENERATOR)
207 @$(MKDIR) -p $(UAVOBJ_OUT_DIR)/$*
208 $(V1) ( cd $(UAVOBJ_OUT_DIR)/$* && \
209 $(UAVOBJGENERATOR) -$* $(UAVOBJ_XML_DIR) $(ROOT_DIR) ; \
212 uavobjects_test: $(UAVOBJGENERATOR)
213 $(V1) $(UAVOBJGENERATOR) -v $(UAVOBJ_XML_DIR) $(ROOT_DIR)
215 uavobjects_clean:
216 @$(ECHO) " CLEAN $(call toprel, $(UAVOBJ_OUT_DIR))"
217 $(V1) [ ! -d "$(UAVOBJ_OUT_DIR)" ] || $(RM) -r "$(UAVOBJ_OUT_DIR)"
219 ##############################
221 # Flight related components
223 ##############################
226 # When building any of the "all_*" targets, tell all sub makefiles to display
227 # additional details on each line of output to describe which build and target
228 # that each line applies to. The same applies also to all, opfw_resource,
229 # package targets
230 ifneq ($(strip $(filter all_% all opfw_resource package,$(MAKECMDGOALS))),)
231 export ENABLE_MSG_EXTRA := yes
232 endif
234 # When building more than one goal in a single make invocation, also
235 # enable the extra context for each output line
236 ifneq ($(word 2,$(MAKECMDGOALS)),)
237 export ENABLE_MSG_EXTRA := yes
238 endif
240 FLIGHT_OUT_DIR := $(BUILD_DIR)/firmware
241 DIRS += $(FLIGHT_OUT_DIR)
243 # Might not be here in source package
244 -include $(ROOT_DIR)/flight/Makefile
246 ##############################
248 # GCS related components
250 ##############################
252 .PHONY: all_ground
253 all_ground: gcs uploader
255 ifneq ($(V), 1)
256 GCS_EXTRA_CONF += silent
257 endif
259 GCS_DIR := $(BUILD_DIR)/$(GCS_SMALL_NAME)_$(GCS_BUILD_CONF)
260 DIRS += $(GCS_DIR)
262 GCS_MAKEFILE := $(GCS_DIR)/Makefile
264 .PHONY: gcs_qmake
265 gcs_qmake $(GCS_MAKEFILE): | $(GCS_DIR)
266 $(V1) cd $(GCS_DIR) && \
267 $(QMAKE) $(ROOT_DIR)/ground/gcs/gcs.pro \
268 -r CONFIG+='$(GCS_BUILD_CONF) $(GCS_EXTRA_CONF)' \
269 'GCS_BIG_NAME="$(GCS_BIG_NAME)"' GCS_SMALL_NAME=$(GCS_SMALL_NAME) \
270 'ORG_BIG_NAME="$(ORG_BIG_NAME)"' ORG_SMALL_NAME=$(ORG_SMALL_NAME) \
271 'WIKI_URL_ROOT="$(WIKI_URL_ROOT)"' \
272 'USAGETRACKER_URL="$(USAGETRACKER_URL)"' \
273 'GCS_LIBRARY_BASENAME=$(libbasename)' \
274 $(GCS_QMAKE_OPTS)
276 .PHONY: gcs
277 gcs: $(UAVOBJGENERATOR) $(GCS_MAKEFILE)
278 $(V1) $(MAKE) -w -C $(GCS_DIR)/$(MAKE_DIR);
280 .PHONY: gcs_clean
281 gcs_clean:
282 @$(ECHO) " CLEAN $(call toprel, $(GCS_DIR))"
283 $(V1) [ ! -d "$(GCS_DIR)" ] || $(RM) -r "$(GCS_DIR)"
287 ################################
289 # Serial Uploader tool
291 ################################
293 UPLOADER_DIR := $(BUILD_DIR)/uploader_$(GCS_BUILD_CONF)
294 DIRS += $(UPLOADER_DIR)
296 UPLOADER_MAKEFILE := $(UPLOADER_DIR)/Makefile
298 .PHONY: uploader_qmake
299 uploader_qmake $(UPLOADER_MAKEFILE): | $(UPLOADER_DIR)
300 $(V1) cd $(UPLOADER_DIR) && \
301 $(QMAKE) $(ROOT_DIR)/ground/gcs/src/experimental/USB_UPLOAD_TOOL/upload.pro \
302 -r CONFIG+='$(GCS_BUILD_CONF) $(GCS_EXTRA_CONF)' $(GCS_QMAKE_OPTS)
304 .PHONY: uploader
305 uploader: $(UPLOADER_MAKEFILE)
306 $(V1) $(MAKE) -w -C $(UPLOADER_DIR)
308 .PHONY: uploader_clean
309 uploader_clean:
310 @$(ECHO) " CLEAN $(call toprel, $(UPLOADER_DIR))"
311 $(V1) [ ! -d "$(UPLOADER_DIR)" ] || $(RM) -r "$(UPLOADER_DIR)"
315 ##############################
317 # Packaging components
319 ##############################
320 # Firmware files to package
321 PACKAGE_FW_TARGETS := fw_coptercontrol fw_oplinkmini fw_revolution fw_osd fw_revoproto fw_gpsplatinum fw_revonano fw_sparky2
323 # Rules to generate GCS resources used to embed firmware binaries into the GCS.
324 # They are used later by the vehicle setup wizard to update board firmware.
325 # To open a firmware image use ":/firmware/fw_coptercontrol.opfw"
326 OPFW_RESOURCE := $(OPGCSSYNTHDIR)/opfw_resource.qrc
328 ifeq ($(WITH_PREBUILT_FW),)
329 FIRMWARE_DIR := $(FLIGHT_OUT_DIR)
330 # We need to build the FW targets
331 $(OPFW_RESOURCE): $(PACKAGE_FW_TARGETS)
332 else
333 FIRMWARE_DIR := $(WITH_PREBUILT_FW)
334 endif
336 OPFW_FILES := $(foreach fw_targ, $(PACKAGE_FW_TARGETS), $(FIRMWARE_DIR)/$(fw_targ)/$(fw_targ).opfw)
337 OPFW_CONTENTS := \
338 <!DOCTYPE RCC><RCC version="1.0"> \
339 <qresource prefix="/firmware"> \
340 $(foreach fw_file, $(OPFW_FILES), <file alias="$(notdir $(fw_file))">$(call system_path,$(fw_file))</file>) \
341 </qresource> \
342 </RCC>
344 .PHONY: opfw_resource
345 opfw_resource: $(OPFW_RESOURCE)
347 $(OPFW_RESOURCE): | $(OPGCSSYNTHDIR)
348 @$(ECHO) Generating OPFW resource file $(call toprel, $@)
349 $(V1) $(ECHO) $(QUOTE)$(OPFW_CONTENTS)$(QUOTE) > $@
351 # If opfw_resource or all firmware are requested, GCS should depend on the resource
352 ifneq ($(strip $(filter opfw_resource all all_fw all_flight package,$(MAKECMDGOALS))),)
353 $(GCS_MAKEFILE): $(OPFW_RESOURCE)
354 endif
356 # Packaging targets: package
357 # - builds all firmware, opfw_resource, gcs
358 # - copies firmware into a package directory
359 # - calls paltform-specific packaging script
361 # Define some variables
362 PACKAGE_LBL := $(shell $(VERSION_INFO) --format=\$${LABEL})
363 PACKAGE_NAME := $(subst $(SPACE),,$(ORG_BIG_NAME))
364 PACKAGE_SEP := -
365 PACKAGE_FULL_NAME := $(PACKAGE_NAME)$(PACKAGE_SEP)$(PACKAGE_LBL)
367 # Source distribution is never dirty because it uses git archive
368 DIST_LBL := $(subst -dirty,,$(PACKAGE_LBL))
369 DIST_NAME := $(PACKAGE_NAME)$(PACKAGE_SEP)$(DIST_LBL)
370 DIST_TAR := $(DIST_DIR)/$(DIST_NAME).tar
371 DIST_TAR_GZ := $(DIST_TAR).gz
372 FW_DIST_NAME := $(DIST_NAME)_firmware
373 FW_DIST_TAR := $(DIST_DIR)/$(FW_DIST_NAME).tar
374 FW_DIST_TAR_GZ := $(FW_DIST_TAR).gz
375 DIST_VER_INFO := $(DIST_DIR)/version-info.json
377 include $(ROOT_DIR)/package/$(UNAME).mk
379 ##############################
381 # Source for distribution
383 ##############################
384 FORCE:
386 $(DIST_VER_INFO): FORCE | $(DIST_DIR)
387 $(V1) $(VERSION_INFO) --jsonpath="$(DIST_DIR)"
389 $(DIST_TAR): $(DIST_VER_INFO) | $(DIST_DIR)
390 @$(ECHO) " SOURCE FOR DISTRIBUTION $(call toprel, $(DIST_TAR))"
391 $(V1) git archive --prefix="$(PACKAGE_NAME)/" -o "$(DIST_TAR)" HEAD
392 $(V1) tar --append --file="$(DIST_TAR)" \
393 --owner=root --group=root --mtime="`git show -s --format=%ci`" \
394 --transform='s,.*version-info.json,$(PACKAGE_NAME)/version-info.json,' \
395 $(call toprel, "$(DIST_VER_INFO)")
397 $(DIST_TAR_GZ): $(DIST_TAR)
398 @$(ECHO) " SOURCE FOR DISTRIBUTION $(call toprel, $(DIST_TAR_GZ))"
399 $(V1) gzip -knf "$(DIST_TAR)"
401 .PHONY: dist_tar_gz
402 dist_tar_gz: $(DIST_TAR_GZ)
404 .PHONY: dist
405 dist: dist_tar_gz
408 $(FW_DIST_TAR): $(PACKAGE_FW_TARGETS) | $(DIST_DIR)
409 @$(ECHO) " FIRMWARE FOR DISTRIBUTION $(call toprel, $(FW_DIST_TAR))"
410 $(V1) tar -c --file="$(FW_DIST_TAR)" --directory=$(FLIGHT_OUT_DIR) \
411 --owner=root --group=root --mtime="`git show -s --format=%ci`" \
412 --transform='s,^,firmware/,' \
413 $(foreach fw_targ,$(PACKAGE_FW_TARGETS),$(fw_targ)/$(fw_targ).opfw)
415 $(FW_DIST_TAR_GZ): $(FW_DIST_TAR)
416 @$(ECHO) " FIRMWARE FOR DISTRIBUTION $(call toprel, $(FW_DIST_TAR_GZ))"
417 $(V1) gzip -knf "$(FW_DIST_TAR)"
419 .PHONY: fw_dist_tar_gz
420 fw_dist_tar_gz: $(FW_DIST_TAR_GZ)
422 .PHONY: fw_dist
423 fw_dist: fw_dist_tar_gz
426 ##############################
428 # Source code formatting
430 ##############################
432 UNCRUSTIFY_TARGETS := flight ground
434 # $(1) = Uncrustify target (e.g flight or ground)
435 # $(2) = Target root directory
436 define UNCRUSTIFY_TEMPLATE
438 .PHONY: uncrustify_$(1)
439 uncrustify_$(1):
440 @$(ECHO) "Auto-formatting $(1) source code"
441 $(V1) UNCRUSTIFY_CONFIG="$(ROOT_DIR)/make/uncrustify/uncrustify.cfg" $(SHELL) make/scripts/uncrustify.sh $(call toprel, $(2))
443 .PHONY: pretty_$(1)
444 pretty_$(1): uncrustify_$(1)
445 endef
447 $(foreach uncrustify_targ, $(UNCRUSTIFY_TARGETS), $(eval $(call UNCRUSTIFY_TEMPLATE,$(uncrustify_targ),$(ROOT_DIR)/$(uncrustify_targ))))
449 .PHONY: uncrustify_all
450 uncrustify_all: $(addprefix uncrustify_,$(UNCRUSTIFY_TARGETS))
452 .PHONY: pretty
453 pretty: $(addprefix pretty_,$(UNCRUSTIFY_TARGETS))
455 ##############################
457 # Doxygen documentation
459 # Each target should have own Doxyfile.$(target) with build directory build/docs/$(target),
460 # proper source directory (e.g. $(target)) and appropriate other doxygen options.
462 ##############################
464 DOCS_TARGETS := flight ground uavobjects
466 # $(1) = Doxygen target (e.g flight or ground)
467 define DOXYGEN_TEMPLATE
469 .PHONY: docs_$(1)
470 docs_$(1): docs_$(1)_clean
471 @$(ECHO) "Generating $(1) documentation"
472 $(V1) $(MKDIR) -p $(BUILD_DIR)/docs/$(1)
473 $(V1) $(DOXYGEN) $(ROOT_DIR)/make/doxygen/Doxyfile.$(1)
475 .PHONY: docs_$(1)_clean
476 docs_$(1)_clean:
477 @$(ECHO) " CLEAN $(call toprel, $(BUILD_DIR)/docs/$(1))"
478 $(V1) [ ! -d "$(BUILD_DIR)/docs/$(1)" ] || $(RM) -r "$(BUILD_DIR)/docs/$(1)"
480 endef
482 $(foreach docs_targ, $(DOCS_TARGETS), $(eval $(call DOXYGEN_TEMPLATE,$(docs_targ))))
484 .PHONY: docs_all
485 docs_all: $(addprefix docs_,$(DOCS_TARGETS))
487 .PHONY: docs_all_clean
488 docs_all_clean:
489 @$(ECHO) " CLEAN $(call toprel, $(BUILD_DIR)/docs)"
490 $(V1) [ ! -d "$(BUILD_DIR)/docs" ] || $(RM) -rf "$(BUILD_DIR)/docs"
492 ##############################
494 # Build info
496 ##############################
498 .PHONY: build-info
499 build-info: | $(BUILD_DIR)
500 @$(ECHO) " BUILD-INFO $(call toprel, $(BUILD_DIR)/$@.txt)"
501 $(V1) $(VERSION_INFO) \
502 --uavodir=$(ROOT_DIR)/shared/uavobjectdefinition \
503 --template="make/templates/$@.txt" \
504 --outfile="$(BUILD_DIR)/$@.txt"
506 ##############################
508 # Config
510 ##############################
512 CONFIG_OPTS := $(subst \$(SPACE),%SPACE_PLACEHOLDER%,$(MAKEOVERRIDES))
513 CONFIG_OPTS := $(addprefix override%SPACE_PLACEHOLDER%,$(CONFIG_OPTS))
514 CONFIG_OPTS := $(subst $(SPACE),\n,$(CONFIG_OPTS))\n
515 CONFIG_OPTS := $(subst %SPACE_PLACEHOLDER%,$(SPACE),$(CONFIG_OPTS))
517 .PHONY: config_new
518 config_new:
519 @printf '$(CONFIG_OPTS)' > $(CONFIG_FILE)
521 .PHONY: config_append
522 config_append:
523 @printf '$(CONFIG_OPTS)' >> $(CONFIG_FILE)
525 .PHONY: config_show
526 config_show:
527 @cat $(CONFIG_FILE) | sed 's/override *//'
529 .PHONY: config_clean
530 config_clean:
531 rm -f $(CONFIG_FILE)
533 .PHONY: config_help
534 config_help:
535 @$(ECHO) " The build system has a simple system for persistent configuration"
536 @$(ECHO)
537 @$(ECHO) " To set persistent configuration variables you, for example, do:"
538 @$(ECHO) " $(MAKE) config_new CCACHE=ccache GCS_WITH_OSG=0"
539 @$(ECHO)
540 @$(ECHO) " To add to the existing configuration do:"
541 @$(ECHO) " $(MAKE) config_append GCS_BUILD_CONF=debug"
542 @$(ECHO)
543 @$(ECHO) " To reset the configuration to defaults do:"
544 @$(ECHO) " $(MAKE) config_clean"
545 @$(ECHO)
546 @$(ECHO) " To show the current configuration:"
547 @$(ECHO) " $(MAKE) config_show"
548 @$(ECHO)
549 @$(ECHO) " You can override any make variable this way, but these are the useful ones"
550 @$(ECHO) " shown with their current (or default values):"
551 @$(ECHO)
552 @$(ECHO) " GCS_BUILD_CONF=$(GCS_BUILD_CONF)"
553 @$(ECHO) " GCS build type"
554 @$(ECHO) " Options: debug or release"
555 @$(ECHO)
556 @$(ECHO) " GCS_WITH_OSG=$(GCS_WITH_OSG)"
557 @$(ECHO) " Build the GCS with OpenSceneGraph support, this enables the PFD Model View"
558 @$(ECHO) " Options: 0 or 1"
559 @$(ECHO)
560 @$(ECHO) " GCS_WITH_OSGEARTH=$(GCS_WITH_OSGEARTH)"
561 @$(ECHO) " Build the GCS with osgEarth support, this enables extra PFD terrain views"
562 @$(ECHO) " Options: 0 or 1"
563 @$(ECHO)
564 @$(ECHO) " GCS_COPY_OSG=$(GCS_COPY_OSG)"
565 @$(ECHO) " Copy OpenSceneGraph/osgEarth libraries into the build"
566 @$(ECHO) " (Needed unless using system versions)"
567 @$(ECHO) " Options: 0 or 1"
568 @$(ECHO)
569 @$(ECHO) " CCACHE=$(CCACHE)"
570 @$(ECHO) " A prefix to compiler invocations, usually 'ccache' or 'path/to/ccache'"
571 @$(ECHO)
572 @$(ECHO) " QMAKE=$(QMAKE)"
573 @$(ECHO) " How to invoke qmake, usually 'qmake', 'qmake-qt5' or 'path/to/qmake'"
574 @$(ECHO)
575 @$(ECHO) " WITH_PREBUILT_FIRMWARE=$(WITH_PREBUILT_FIRMWARE)"
576 @$(ECHO) " Set to path of prebuilt firmware or empty to build firmware when needed"
577 # TODO: add other things like downloads and tools directories, linux make install parameters
581 ##############################
583 # Directories
585 ##############################
587 $(DIRS):
588 $(V1) $(MKDIR) -p $@
591 ##############################
593 # Help message, the default Makefile goal
595 ##############################
597 .DEFAULT_GOAL := help
599 .PHONY: help
600 help:
601 @$(ECHO)
602 @$(ECHO) " This Makefile is known to work on Linux and Mac in a standard shell environment."
603 @$(ECHO) " It also works on Windows by following the instructions given on this wiki page:"
604 @$(ECHO) " $(WIKI_ROOT_URL)Windows+Building+and+Packaging"
605 @$(ECHO)
606 @$(ECHO) " Here is a summary of the available targets:"
607 @$(ECHO)
608 @$(ECHO) " [Source tree preparation]"
609 @$(ECHO) " prepare - Install GIT commit message template"
610 @$(ECHO) " [Tool Installers]"
611 @$(ECHO) " arm_sdk_install - Install the GNU ARM gcc toolchain"
612 @$(ECHO) " qt_sdk_install - Install the QT development tools"
613 @$(ECHO) " nsis_install - Install the NSIS Unicode (Windows only)"
614 @$(ECHO) " mesawin_install - Install the OpenGL32 DLL (Windows only)"
615 @$(ECHO) " uncrustify_install - Install the Uncrustify source code beautifier"
616 @$(ECHO) " doxygen_install - Install the Doxygen documentation generator"
617 @$(ECHO) " gtest_install - Install the GoogleTest framework"
618 @$(ECHO) " ccache_install - Install ccache"
619 @$(ECHO) " These targets are not updated yet and are probably broken:"
620 @$(ECHO) " openocd_install - Install the OpenOCD JTAG daemon"
621 @$(ECHO) " stm32flash_install - Install the stm32flash tool for unbricking F1-based boards"
622 @$(ECHO) " dfuutil_install - Install the dfu-util tool for unbricking F4-based boards"
623 @$(ECHO) " Install all available tools:"
624 @$(ECHO) " all_sdk_install - Install all of above (platform-dependent)"
625 @$(ECHO) " build_sdk_install - Install only essential for build tools (platform-dependent)"
626 @$(ECHO)
627 @$(ECHO) " Other tool options are:"
628 @$(ECHO) " <tool>_version - Display <tool> version"
629 @$(ECHO) " <tool>_clean - Remove installed <tool>"
630 @$(ECHO) " <tool>_distclean - Remove downloaded <tool> distribution file(s)"
631 @$(ECHO)
632 @$(ECHO) " [Big Hammer]"
633 @$(ECHO) " all - Generate UAVObjects, build $(ORG_BIG_NAME) firmware and gcs"
634 @$(ECHO) " all_flight - Build all firmware, bootloaders and bootloader updaters"
635 @$(ECHO) " all_fw - Build only firmware for all boards"
636 @$(ECHO) " all_bl - Build only bootloaders for all boards"
637 @$(ECHO) " all_bu - Build only bootloader updaters for all boards"
638 @$(ECHO)
639 @$(ECHO) " all_clean - Remove your build directory ($(BUILD_DIR))"
640 @$(ECHO) " all_flight_clean - Remove all firmware, bootloaders and bootloader updaters"
641 @$(ECHO) " all_fw_clean - Remove firmware for all boards"
642 @$(ECHO) " all_bl_clean - Remove bootloaders for all boards"
643 @$(ECHO) " all_bu_clean - Remove bootloader updaters for all boards"
644 @$(ECHO)
645 @$(ECHO) " all_<board> - Build all available images for <board>"
646 @$(ECHO) " all_<board>_clean - Remove all available images for <board>"
647 @$(ECHO)
648 @$(ECHO) " all_ut - Build all unit tests"
649 @$(ECHO) " all_ut_tap - Run all unit tests and capture all TAP output to files"
650 @$(ECHO) " all_ut_run - Run all unit tests and dump TAP output to console"
651 @$(ECHO)
652 @$(ECHO) " [Firmware]"
653 @$(ECHO) " <board> - Build firmware for <board>"
654 @$(ECHO) " Supported boards are ($(ALL_BOARDS))"
655 @$(ECHO) " fw_<board> - Build firmware for <board>"
656 @$(ECHO) " Supported boards are ($(FW_BOARDS))"
657 @$(ECHO) " fw_<board>_clean - Remove firmware for <board>"
658 @$(ECHO) " fw_<board>_program - Use OpenOCD + JTAG to write firmware to <board>"
659 @$(ECHO)
660 @$(ECHO) " [Bootloader]"
661 @$(ECHO) " bl_<board> - Build bootloader for <board>"
662 @$(ECHO) " Supported boards are ($(BL_BOARDS))"
663 @$(ECHO) " bl_<board>_clean - Remove bootloader for <board>"
664 @$(ECHO) " bl_<board>_program - Use OpenOCD + JTAG to write bootloader to <board>"
665 @$(ECHO)
666 @$(ECHO) " [Entire Flash]"
667 @$(ECHO) " ef_<board> - Build entire flash image for <board>"
668 @$(ECHO) " Supported boards are ($(EF_BOARDS))"
669 @$(ECHO) " ef_<board>_clean - Remove entire flash image for <board>"
670 @$(ECHO) " ef_<board>_program - Use OpenOCD + JTAG to write entire flash image to <board>"
671 @$(ECHO)
672 @$(ECHO) " [Bootloader Updater]"
673 @$(ECHO) " bu_<board> - Build bootloader updater for <board>"
674 @$(ECHO) " Supported boards are ($(BU_BOARDS))"
675 @$(ECHO) " bu_<board>_clean - Remove bootloader updater for <board>"
676 @$(ECHO)
677 @$(ECHO) " [Unbrick a board]"
678 @$(ECHO) " unbrick_<board> - Use the STM32's built in boot ROM to write a bootloader to <board>"
679 @$(ECHO) " Supported boards are ($(BL_BOARDS))"
680 @$(ECHO) " [Unittests]"
681 @$(ECHO) " ut_<test> - Build unit test <test>"
682 @$(ECHO) " ut_<test>_xml - Run test and capture XML output into a file"
683 @$(ECHO) " ut_<test>_run - Run test and dump output to console"
684 @$(ECHO)
685 @$(ECHO) " [Simulation]"
686 @$(ECHO) " sim_osx - Build $(ORG_BIG_NAME) simulation firmware for OSX"
687 @$(ECHO) " sim_osx_clean - Delete all build output for the osx simulation"
688 @$(ECHO) " sim_win32 - Build $(ORG_BIG_NAME) simulation firmware for Windows"
689 @$(ECHO) " using mingw and msys"
690 @$(ECHO) " sim_win32_clean - Delete all build output for the win32 simulation"
691 @$(ECHO)
692 @$(ECHO) " [GCS]"
693 @$(ECHO) " gcs - Build the Ground Control System (GCS) application (debug|release)"
694 @$(ECHO) " Compile specific directory: MAKE_DIR=<dir>"
695 @$(ECHO) " Example: make gcs MAKE_DIR=src/plugins/coreplugin"
696 @$(ECHO) " gcs_qmake - Run qmake for the Ground Control System (GCS) application (debug|release)"
697 @$(ECHO) " gcs_clean - Remove the Ground Control System (GCS) application (debug|release)"
698 @$(ECHO) " Supported build configurations: GCS_BUILD_CONF=debug|release (default is $(GCS_BUILD_CONF))"
699 @$(ECHO)
700 @$(ECHO) " [Uploader Tool]"
701 @$(ECHO) " uploader - Build the serial uploader tool (debug|release)"
702 @$(ECHO) " uploader_qmake - Run qmake for the serial uploader tool (debug|release)"
703 @$(ECHO) " uploader_clean - Remove the serial uploader tool (debug|release)"
704 @$(ECHO) " Supported build configurations: GCS_BUILD_CONF=debug|release (default is $(GCS_BUILD_CONF))"
705 @$(ECHO)
706 @$(ECHO)
707 @$(ECHO) " [UAVObjects]"
708 @$(ECHO) " uavobjects - Generate source files from the UAVObject definition XML files"
709 @$(ECHO) " uavobjects_test - Parse xml-files - check for valid, duplicate ObjId's, ..."
710 @$(ECHO) " uavobjects_<group> - Generate source files from a subset of the UAVObject definition XML files"
711 @$(ECHO) " Supported groups are ($(UAVOBJ_TARGETS))"
712 @$(ECHO)
713 @$(ECHO) " [Packaging]"
714 @$(ECHO) " package - Build and package the platform-dependent package (no clean)"
715 @$(ECHO) " opfw_resource - Generate resources to embed firmware binaries into the GCS"
716 @$(ECHO) " dist - Generate source archive for distribution"
717 @$(ECHO) " fw_dist - Generate archive of firmware"
718 @$(ECHO) " install - Install GCS to \"DESTDIR\" with prefix \"prefix\" (Linux only)"
719 @$(ECHO)
720 @$(ECHO) " [Code Formatting]"
721 @$(ECHO) " pretty_<source> - Reformat <source> code according to the project's standards"
722 @$(ECHO) " Supported sources are ($(UNCRUSTIFY_TARGETS))"
723 @$(ECHO) " pretty - Reformat all source code"
724 @$(ECHO)
725 @$(ECHO) " [Code Documentation]"
726 @$(ECHO) " docs_<source> - Generate HTML documentation for <source>"
727 @$(ECHO) " Supported sources are ($(DOCS_TARGETS))"
728 @$(ECHO) " docs_all - Generate HTML documentation for all"
729 @$(ECHO) " docs_<source>_clean - Delete generated documentation for <source>"
730 @$(ECHO) " docs_all_clean - Delete all generated documentation"
731 @$(ECHO)
732 @$(ECHO) " [Configuration]"
733 @$(ECHO) " config_help - Show information on how to configure the build"
734 @$(ECHO) " config_new - Place your make arguments in the config file"
735 @$(ECHO) " config_append - Place your make arguments in the config file but append"
736 @$(ECHO) " config_clean - Removes the config file"
737 @$(ECHO)
738 @$(ECHO) " Hint: Add V=1 to your command line to see verbose build output."
739 @$(ECHO)
740 @$(ECHO) " Notes: All tool distribution files will be downloaded into $(DL_DIR)"
741 @$(ECHO) " All tools will be installed into $(TOOLS_DIR)"
742 @$(ECHO) " All build output will be placed in $(BUILD_DIR)"
743 @$(ECHO)
744 @$(ECHO) " Tool download and install directories can be changed using environment variables:"
745 @$(ECHO) " DL_DIR full path to downloads directory [downloads if not set]"
746 @$(ECHO) " TOOLS_DIR full path to installed tools directory [tools if not set]"
747 @$(ECHO) " More info: $(WIKI_URL_ROOT)LibrePilot+Build+System+Overview"
748 @$(ECHO)