2 # Kmscon - Global Makefile
3 # Copyright (c) 2012-2013 David Herrmann <dh.herrmann@googlemail.com>
7 # Global Configurations and Initializations
10 ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
11 AM_MAKEFLAGS = --no-print-directory
12 AUTOMAKE_OPTIONS = color-tests
13 AM_DISTCHECK_CONFIGURE_FLAGS = --enable-all
25 docs/kmsconvt@.service
27 pkgconfigdir = $(libdir)/pkgconfig
39 moduledir = $(libdir)/kmscon
44 # Make all files include "config.h" by default. This shouldn't cause any
45 # problems and we cannot forget to include it anymore.
47 # Also make the linker discard all unused symbols.
49 # When compiling in debug mode, we enable debug symbols so debugging with gdb
50 # is easier. If optimizations are disabled, we pass -O0 to the compiler.
51 # Otherwise, we use standard optimizations -O2.
59 -fdiagnostics-show-option \
60 -fno-strict-aliasing \
66 -DBUILD_MODULE_DIR='"$(moduledir)"' \
67 -include $(top_builddir)/config.h \
79 if BUILD_ENABLE_OPTIMIZATIONS
87 # The file ./src/shl_githead.c contains a constant "shl_git_head" which is
88 # defined to the string returned by "git describe". We need to adjust this
89 # string for every build and correctly rebuild any sources that depend on it.
90 # Therefore, you should use this file rarely as it causes rebuilds on every
93 # We have a helper-script ./src/genversion.sh that takes as argument the source
94 # file and creates it if necessary. It updates it only if the new git-describe
95 # string is different to the old one. So the file is only modified on changes.
96 # Hence, we can use it as normal dependency in this Makefile.
97 # However, we need to run this script on _every_ "make" invocation before any
98 # recipy is executed. To achieve this, we use $(shell ...) and assign it to a
99 # "simply expanded" variable (:=) so the shell command is executed on
100 # variable-declaration and not during expansion.
102 # Note that we must not clean ./src/shl_githead.c ever! If we would, a
103 # distribution tarball might delete that file and have no way to recreate it.
104 # We could delete it on something like "make maintainerclean", but then again,
105 # it seems unnecessary so lets simply not clean it at all.
107 # If the helper-script is executed in a directory that is not a git-repository
108 # (like a distribution tarball) and shl_githead.c exists, then it does nothing
109 # as it expects shl_githead.c to be correctly written by "make dist".
110 # However, if shl_githead.c does not exist, it will print a warning and write
111 # an unknown random git-revision.
112 # This guarantees, that shl_githead.c is always present and has the most correct
113 # value that we can get under any conditions.
115 # The $(emptyvariable) expansion below is used for broken $(shell ...)
116 # syntax-highlighting algorithms in many existing editors.
119 EXTRA_DIST += src/genversion.sh
120 GITHEAD:=$(shell $(emptyvariable)"$(srcdir)/src/genversion.sh" "$(srcdir)/src/shl_githead.c")
123 # Binary File Compiler
124 # This target gets as input a binary file *.bin and produces an ELF/etc. output
125 # object file *.bin.o and the corresponding libtool file *.bin.lo.
126 # Note that we fake the libtool object files as there is no way to make libtool
127 # create it. The comments in the .lo file are mandatory so don't remove them!
130 CLEANFILES += src/*.bin.lo src/*.bin.o
132 src/%.bin.lo: src/%.bin
133 $(AM_V_GEN)$(LD) -r -o "src/$*.bin.o" -z noexecstack --format=binary "$<"
134 $(AM_V_at)$(OBJCOPY) --rename-section .data=.rodata,alloc,load,readonly,data,contents "src/$*.bin.o"
135 $(AM_V_at)echo "# $@ - a libtool object file" >"$@"
136 $(AM_V_at)echo "# Generated by $(shell $(LIBTOOL) --version | head -n 1)" >>"$@"
137 $(AM_V_at)echo "#" >>"$@"
138 $(AM_V_at)echo "# Please DO NOT delete this file!" >>"$@"
139 $(AM_V_at)echo "# It is necessary for linking the library." >>"$@"
140 $(AM_V_at)echo >>"$@"
141 $(AM_V_at)echo "# Name of the PIC object." >>"$@"
142 $(AM_V_at)echo "pic_object='$*.bin.o'" >>"$@"
143 $(AM_V_at)echo >>"$@"
144 $(AM_V_at)echo "# Name of the non-PIC object" >>"$@"
145 $(AM_V_at)echo "non_pic_object='$*.bin.o'" >>"$@"
146 $(AM_V_at)echo >>"$@"
150 # We use a few built-in shader files. To reduce memory-consumption, this helper
151 # removes useless lines from the shaders before they are compiled into an object
154 # Following regexp are used to remove characters/lines:
155 # ^/*.*$ Start of multi-line comment
156 # ^ *.*$ Multi-line comment body
157 # ^[ \t]* Indentation whitespace
161 CLEANFILES += src/*.vert.bin src/*.frag.bin
162 SHADER_SED = -e 's/^\/\*.*$$//' -e 's/^ \*.*$$//' -e 's/^[ \t]*//'
163 SHADER_TR = -d "\r\n"
165 src/%.vert.bin: $(top_srcdir)/src/%.vert
166 $(AM_V_at)$(SED) $(SHADER_SED) "$<" | tr $(SHADER_TR) >"$@"
168 src/%.frag.bin: $(top_srcdir)/src/%.frag
169 $(AM_V_at)$(SED) $(SHADER_SED) "$<" | tr $(SHADER_TR) >"$@"
172 # XKB Fallback Converter
173 # We use a static built-in XKB fallback keymap. To avoid huge memory consumption
174 # we remove useless lines/characters first.
175 # We also append an ASCII 0 character so it can be used as regular C-string.
177 # Following regexp are used to remove characters/lines:
178 # *= * Whitespace around assignments
179 # *, * Whitespace around commatas
180 # *[][{}()] * Whitespace around braces
181 # ^[ \t]* Indentation whitespace
185 CLEANFILES += src/*.xkb.bin
186 XKB_SED = -e 's/^[ \t]*//' -e 's/ *\([,=]\) */\1/g' -e 's/ *\([][{}()]\) */\1/g'
189 src/%.xkb.bin: $(top_srcdir)/src/%.xkb
190 $(AM_V_at)$(SED) $(XKB_SED) "$<" | tr $(XKB_TR) >"$@"
191 $(AM_V_at)echo -ne "\x00" >>"$@"
194 # SHL - Static Helper Library
195 # The SHL subsystem contains several small code pieces used all over kmscon and
196 # other applications.
199 noinst_LTLIBRARIES += libshl.la
201 libshl_la_SOURCES = \
206 src/shl_hashtable.h \
218 libshl_la_CPPFLAGS = \
220 $(XKBCOMMON_CFLAGS) \
222 libshl_la_LDFLAGS = \
230 libshl_la_SOURCES += src/shl_gl.h src/shl_gl_shader.c src/shl_gl_math.c
231 libshl_la_CPPFLAGS += $(GLES2_CFLAGS)
232 libshl_la_LIBADD += $(GLES2_LIBS)
237 # This library contains the whole event-loop implementation of kmscon. It is
238 # compiled into a separate object to allow using it in several other programs.
241 noinst_LTLIBRARIES += libeloop.la
243 libeloop_la_SOURCES = \
247 libeloop_la_LIBADD = libshl.la
248 libeloop_la_CPPFLAGS = $(AM_CPPFLAGS)
249 libeloop_la_LDFLAGS = $(AM_LDFLAGS)
253 # The uterm library provides helpers to create terminals in user-space. They
254 # are not limited to text-based terminals but rather provide graphics contexts
255 # so arbitrary output can be displayed. Additionally, they provide VT
256 # abstractions and an input layer
259 noinst_LTLIBRARIES += libuterm.la
261 libuterm_la_SOURCES = \
263 src/uterm_monitor.h \
266 src/uterm_input_internal.h \
267 src/uterm_video_internal.h \
268 src/uterm_systemd_internal.h \
270 src/uterm_monitor.c \
273 src/uterm_input_uxkb.c
275 nodist_libuterm_la_SOURCES =
277 libuterm_la_CPPFLAGS = \
281 libuterm_la_LIBADD = \
286 src/uterm_input_fallback.xkb.bin.lo
287 libuterm_la_LDFLAGS = \
290 if BUILD_ENABLE_MULTI_SEAT
291 libuterm_la_SOURCES += src/uterm_systemd.c
292 libuterm_la_CPPFLAGS += $(SYSTEMD_CFLAGS)
293 libuterm_la_LIBADD += $(SYSTEMD_LIBS)
296 if BUILD_ENABLE_VIDEO_FBDEV
297 libuterm_la_SOURCES += \
298 src/uterm_fbdev_internal.h \
299 src/uterm_fbdev_video.c \
300 src/uterm_fbdev_render.c
303 if BUILD_ENABLE_VIDEO_DRM2D
304 libuterm_la_SOURCES += \
305 src/uterm_drm2d_internal.h \
306 src/uterm_drm2d_video.c \
307 src/uterm_drm2d_render.c
308 libuterm_la_CPPFLAGS += $(DRM_CFLAGS)
309 libuterm_la_LIBADD += $(DRM_LIBS)
312 if BUILD_ENABLE_VIDEO_DRM3D
313 libuterm_la_SOURCES += \
314 src/uterm_drm3d_internal.h \
315 src/uterm_drm3d_video.c \
316 src/uterm_drm3d_render.c
317 libuterm_la_CPPFLAGS += \
322 libuterm_la_LIBADD += \
327 src/uterm_drm3d_blend.vert.bin.lo \
328 src/uterm_drm3d_blend.frag.bin.lo \
329 src/uterm_drm3d_blit.vert.bin.lo \
330 src/uterm_drm3d_blit.frag.bin.lo \
331 src/uterm_drm3d_fill.vert.bin.lo \
332 src/uterm_drm3d_fill.frag.bin.lo
335 # add shared sources only once
336 UTERM_DRM_SHARED_SRC = \
337 src/uterm_drm_shared_internal.h \
338 src/uterm_drm_shared.c
339 if BUILD_ENABLE_VIDEO_DRM2D
340 libuterm_la_SOURCES += $(UTERM_DRM_SHARED_SRC)
342 if BUILD_ENABLE_VIDEO_DRM3D
343 libuterm_la_SOURCES += $(UTERM_DRM_SHARED_SRC)
349 # This generates the unifont sources from raw hex-encoded font data.
352 UNIFONT = $(top_srcdir)/src/font_unifont_data.hex
353 UNIFONT_BIN = src/font_unifont_data.bin
354 UNIFONT_LT = src/font_unifont_data.bin.lo
356 EXTRA_DIST += $(UNIFONT)
357 CLEANFILES += $(UNIFONT_BIN)
358 genunifont_SOURCES = src/genunifont.c
360 genunifont$(BUILD_EXEEXT) $(genunifont_OBJECTS): CC = $(CC_FOR_BUILD)
361 genunifont$(BUILD_EXEEXT) $(genunifont_OBJECTS): CFLAGS = $(CFLAGS_FOR_BUILD)
362 genunifont$(BUILD_EXEEXT): LDFLAGS = $(LDFLAGS_FOR_BUILD)
364 $(UNIFONT_BIN): $(UNIFONT) genunifont$(BUILD_EXEEXT)
365 $(AM_V_GEN)./genunifont$(BUILD_EXEEXT) $(UNIFONT_BIN) $(UNIFONT)
371 if BUILD_ENABLE_FONT_UNIFONT
372 module_LTLIBRARIES += mod-unifont.la
373 noinst_PROGRAMS += genunifont
376 mod_unifont_la_SOURCES = \
377 src/kmscon_module_interface.h \
379 src/kmscon_mod_unifont.c
380 mod_unifont_la_LIBADD = \
383 mod_unifont_la_LDFLAGS = \
388 if BUILD_ENABLE_FONT_PANGO
389 module_LTLIBRARIES += mod-pango.la
392 mod_pango_la_SOURCES = \
393 src/kmscon_module_interface.h \
395 src/kmscon_mod_pango.c
396 mod_pango_la_CPPFLAGS = \
400 mod_pango_la_LIBADD = \
405 mod_pango_la_LDFLAGS = \
410 if BUILD_ENABLE_RENDERER_BBULK
411 module_LTLIBRARIES += mod-bbulk.la
414 mod_bbulk_la_SOURCES = \
415 src/kmscon_module_interface.h \
417 src/kmscon_mod_bbulk.c
418 mod_bbulk_la_CPPFLAGS = \
421 mod_bbulk_la_LIBADD = \
424 mod_bbulk_la_LDFLAGS = \
429 if BUILD_ENABLE_RENDERER_GLTEX
430 module_LTLIBRARIES += mod-gltex.la
433 mod_gltex_la_SOURCES = \
434 src/kmscon_module_interface.h \
436 src/kmscon_mod_gltex.c
437 mod_gltex_la_CPPFLAGS = \
441 mod_gltex_la_LIBADD = \
445 src/text_gltex_atlas.vert.bin.lo \
446 src/text_gltex_atlas.frag.bin.lo
447 mod_gltex_la_LDFLAGS = \
452 if BUILD_ENABLE_RENDERER_PIXMAN
453 module_LTLIBRARIES += mod-pixman.la
456 mod_pixman_la_SOURCES = \
457 src/kmscon_module_interface.h \
459 src/kmscon_mod_pixman.c
460 mod_pixman_la_CPPFLAGS = \
463 mod_pixman_la_LIBADD = \
466 mod_pixman_la_LDFLAGS = \
473 # These are the sources for the main binaries and test programs. They mostly
474 # consists of a single source file only and include all the libraries that are
475 # built as part of kmscon.
478 bin_PROGRAMS += kmscon
484 MANPAGES += docs/man/kmscon.1
497 src/kmscon_module_interface.h \
498 src/kmscon_module.h \
499 src/kmscon_module.c \
500 src/kmscon_terminal.h \
507 nodist_kmscon_SOURCES =
511 $(XKBCOMMON_CFLAGS) \
525 if BUILD_ENABLE_SESSION_DUMMY
526 kmscon_SOURCES += src/kmscon_dummy.c
529 if BUILD_ENABLE_SESSION_TERMINAL
530 kmscon_SOURCES += src/kmscon_terminal.c
549 test_output_SOURCES = \
552 test_output_CPPFLAGS = $(test_cflags)
553 test_output_LDADD = \
560 test_vt_CPPFLAGS = $(test_cflags)
565 test_input_SOURCES = \
568 test_input_CPPFLAGS = $(test_cflags)
576 test_key_CPPFLAGS = $(test_cflags)
577 test_key_LDADD = $(test_libs)
584 EXTRA_DIST += ${patsubst %.1,%.xml,${patsubst %.3,%.xml,${patsubst %.5,%.xml,${patsubst %.7,%.xml,$(MANPAGES)}}}}
585 CLEANFILES += $(MANPAGES) $(MANPAGES_ALIASES) .man_fixup
587 if BUILD_HAVE_XSLTPROC
588 if BUILD_HAVE_MANPAGES_STYLESHEET
590 man_MANS += $(MANPAGES) $(MANPAGES_ALIASES)
593 --stringparam man.authors.section.enabled 0 \
594 --stringparam man.copyright.section.enabled 0 \
595 --stringparam funcsynopsis.style ansi \
596 --stringparam man.output.quietly 1 \
599 XSLTPROC_PROCESS_MAN = \
600 $(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
601 $(XSLTPROC) -o "$@" $(XSLTPROC_FLAGS) $(BUILD_MANPAGES_STYLESHEET) "$<" && \
604 # Force .man_fixup if $(MANPAGES) are not built
605 .man_fixup: | $(MANPAGES)
608 $(MANPAGES_ALIASES): $(MANPAGES) .man_fixup
609 $(AM_V_GEN)if test -n "$@" ; then $(SED) -i -e 's/^\.so \([a-z_]\+\)\.\([0-9]\)$$/\.so man\2\/\1\.\2/' "$@" ; fi
611 docs/man/%.1: docs/man/%.xml
612 $(XSLTPROC_PROCESS_MAN)
614 docs/man/%.3: docs/man/%.xml
615 $(XSLTPROC_PROCESS_MAN)
617 docs/man/%.5: docs/man/%.xml
618 $(XSLTPROC_PROCESS_MAN)
620 docs/man/%.7: docs/man/%.xml
621 $(XSLTPROC_PROCESS_MAN)
623 endif # BUILD_HAVE_MANPAGES_STYLESHEET
624 endif # BUILD_HAVE_XSLTPROC
633 # Empty .SECONDARY target causes alle intermediate files to be treated as
634 # secondary files. That is, they don't get deleted after make finished.