mirror of
https://github.com/mmueller41/genode.git
synced 2026-01-21 12:32:56 +01:00
216 lines
6.9 KiB
Makefile
216 lines
6.9 KiB
Makefile
#
|
|
# The following externally defined variables are evaluated:
|
|
#
|
|
# QMAKE_PROJECT_FILE: path to the qmake project file (for applications with target.mk)
|
|
# QMAKE_TARGET_BINARIES binaries to be stripped and linked into 'bin' and 'debug' directories
|
|
# QT5_PORT_LIBS: Qt5 libraries used from port (for example libQt5Core)
|
|
#
|
|
|
|
QT_TOOLS_DIR = /usr/local/genode/qt5/22.08
|
|
QMAKE = $(QT_TOOLS_DIR)/bin/qmake
|
|
|
|
ifeq ($(filter-out $(SPECS),arm),)
|
|
QMAKE_PLATFORM = genode-arm-g++
|
|
else ifeq ($(filter-out $(SPECS),arm_64),)
|
|
QMAKE_PLATFORM = genode-aarch64-g++
|
|
else ifeq ($(filter-out $(SPECS),x86_32),)
|
|
QMAKE_PLATFORM = genode-x86_32-g++
|
|
else ifeq ($(filter-out $(SPECS),x86_64),)
|
|
QMAKE_PLATFORM = genode-x86_64-g++
|
|
else
|
|
$(error Error: unsupported platform)
|
|
endif
|
|
|
|
ifeq ($(CONTRIB_DIR),)
|
|
QT_DIR = $(call select_from_repositories,src/lib/qt5)
|
|
QT_API_DIR = $(call select_from_repositories,mkspecs)/..
|
|
else
|
|
QT_PORT_DIR = $(call select_from_ports,qt5)
|
|
QT_DIR = $(QT_PORT_DIR)/src/lib/qt5
|
|
QT_API_DIR = $(QT_DIR)/genode/api
|
|
endif
|
|
|
|
ifneq ($(VERBOSE),)
|
|
QT5_OUTPUT_FILTER = > /dev/null
|
|
endif
|
|
|
|
#
|
|
# Genode libraries to be linked to Qt applications and libraries
|
|
#
|
|
|
|
QT5_GENODE_LIBS_APP = libc.lib.so libm.lib.so stdcxx.lib.so qt5_component.lib.so
|
|
QT5_GENODE_LIBS_SHLIB = libc.lib.so libm.lib.so stdcxx.lib.so
|
|
|
|
#
|
|
# flags to be passed to qmake via env.sh and mkspecs/common/genode.conf
|
|
#
|
|
|
|
GENODE_QMAKE_CFLAGS = \
|
|
-D__FreeBSD__=12 \
|
|
-D__GENODE__ \
|
|
-ffunction-sections \
|
|
-fno-strict-aliasing \
|
|
$(CC_OPT_NOSTDINC) \
|
|
$(CC_MARCH) \
|
|
$(CC_OPT_PIC) \
|
|
$(filter-out -I.,$(INCLUDES)) \
|
|
-I$(CURDIR)/qmake_root/include/QtCore/spec/$(QMAKE_PLATFORM)
|
|
|
|
GENODE_QMAKE_LFLAGS_APP = \
|
|
$(addprefix $(LD_OPT_PREFIX),$(LD_MARCH)) \
|
|
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_GC_SECTIONS)) \
|
|
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_ALIGN_SANE)) \
|
|
$(addprefix $(LD_OPT_PREFIX),--dynamic-list=$(BASE_DIR)/src/ld/genode_dyn.dl) \
|
|
$(LD_OPT_NOSTDLIB) \
|
|
-Wl,-Ttext=0x01000000 \
|
|
$(CC_MARCH) \
|
|
-Wl,--dynamic-linker=$(DYNAMIC_LINKER).lib.so \
|
|
-Wl,--eh-frame-hdr \
|
|
-Wl,-rpath-link=. \
|
|
-Wl,-T -Wl,$(LD_SCRIPT_DYN) \
|
|
-L$(CURDIR)/qmake_root/lib \
|
|
-Wl,--whole-archive \
|
|
-Wl,--start-group \
|
|
$(addprefix -l:,$(QT5_GENODE_LIBS_APP)) \
|
|
-Wl,--end-group \
|
|
-Wl,--no-whole-archive
|
|
|
|
GENODE_QMAKE_LFLAGS_SHLIB = \
|
|
$(LD_OPT_NOSTDLIB) \
|
|
-Wl,-shared \
|
|
-Wl,--eh-frame-hdr \
|
|
$(addprefix $(LD_OPT_PREFIX),$(LD_MARCH)) \
|
|
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_GC_SECTIONS)) \
|
|
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_ALIGN_SANE)) \
|
|
-Wl,-T -Wl,$(LD_SCRIPT_SO) \
|
|
$(addprefix $(LD_OPT_PREFIX),--entry=0x0) \
|
|
-L$(CURDIR)/qmake_root/lib \
|
|
-Wl,--whole-archive \
|
|
-Wl,--start-group \
|
|
$(addprefix -l:,$(QT5_GENODE_LIBS_SHLIB)) \
|
|
-l:ldso_so_support.lib.a \
|
|
-Wl,--end-group \
|
|
-Wl,--no-whole-archive
|
|
|
|
#
|
|
# libgcc must appear on the command line after all other libs
|
|
# (including those added by qmake) and using the QMAKE_LIBS
|
|
# variable achieves this, fortunately
|
|
#
|
|
GENODE_QMAKE_LIBS = \
|
|
$(shell $(CC) $(CC_MARCH) -print-libgcc-file-name)
|
|
|
|
ifeq ($(CONTRIB_DIR),)
|
|
GENODE_QMAKE_INCDIR_OPENGL = $(call select_from_repositories,include/GL)/..
|
|
GENODE_QMAKE_INCDIR_EGL = $(call select_from_repositories,include/EGL)/..
|
|
else
|
|
GENODE_QMAKE_INCDIR_OPENGL = $(call select_from_ports,mesa)/include
|
|
GENODE_QMAKE_INCDIR_EGL = $(call select_from_ports,mesa)/include
|
|
endif
|
|
|
|
GENODE_QMAKE_LIBS_OPENGL = $(CURDIR)/qmake_root/lib/mesa.lib.so
|
|
GENODE_QMAKE_LIBS_EGL = $(CURDIR)/qmake_root/lib/egl.lib.so
|
|
|
|
#
|
|
# export variables for qmake.conf
|
|
#
|
|
|
|
env.sh:
|
|
$(VERBOSE)rm -f $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_CC='$(CC)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_CXX='$(CXX)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_LINK='$(CXX)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_AR='$(AR)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_OBJCOPY='$(OBJCOPY)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_NM='$(NM)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_STRIP='$(STRIP)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_CFLAGS='$(GENODE_QMAKE_CFLAGS)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_LFLAGS_APP='$(GENODE_QMAKE_LFLAGS_APP)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_LFLAGS_SHLIB='$(GENODE_QMAKE_LFLAGS_SHLIB)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_LIBS='$(GENODE_QMAKE_LIBS)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_INCDIR_OPENGL='$(GENODE_QMAKE_INCDIR_OPENGL)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_LIBS_OPENGL='$(GENODE_QMAKE_LIBS_OPENGL)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_INCDIR_EGL='$(GENODE_QMAKE_INCDIR_EGL)'" >> $@
|
|
$(VERBOSE)echo "export GENODE_QMAKE_LIBS_EGL='$(GENODE_QMAKE_LIBS_EGL)'" >> $@
|
|
|
|
|
|
#
|
|
# prepare a directory named 'qmake_root' where qmake can find needed files
|
|
#
|
|
|
|
qmake_root:
|
|
$(VERBOSE)mkdir -p $@
|
|
|
|
qmake_root/bin: qmake_root
|
|
$(VERBOSE)mkdir -p $@
|
|
$(VERBOSE)ln -sf $(QT_TOOLS_DIR)/bin/* $@/
|
|
|
|
qmake_root/include: qmake_root
|
|
$(VERBOSE)mkdir -p $@
|
|
$(VERBOSE)ln -snf $(QT_API_DIR)/include/* $@/
|
|
|
|
qmake_root/lib: qmake_root
|
|
$(VERBOSE)mkdir -p $@
|
|
|
|
qmake_root/lib/%.lib.so: qmake_root/lib
|
|
$(VERBOSE)ln -sf $(BUILD_BASE_DIR)/var/libcache/$*/$*.abi.so $@
|
|
|
|
qmake_root/lib/%.lib.a: qmake_root/lib
|
|
$(VERBOSE)ln -sf $(BUILD_BASE_DIR)/var/libcache/$*/$*.lib.a $@
|
|
|
|
qmake_root/mkspecs: qmake_root
|
|
$(VERBOSE)mkdir -p $@
|
|
$(VERBOSE)ln -sf $(QT_API_DIR)/mkspecs/* $@/
|
|
$(VERBOSE)rm -f $@/modules
|
|
$(VERBOSE)mkdir $@/modules
|
|
$(VERBOSE)ln -snf $(QT_API_DIR)/mkspecs/modules/* $@/modules/
|
|
$(VERBOSE)ln -sf $(QMAKE_PLATFORM)/qconfig.pri $@/
|
|
$(VERBOSE)ln -sf $(QMAKE_PLATFORM)/qmodule.pri $@/
|
|
|
|
qmake_prepared.tag: env.sh \
|
|
qmake_root/bin \
|
|
qmake_root/include \
|
|
qmake_root/lib/libc.lib.so \
|
|
qmake_root/lib/libm.lib.so \
|
|
qmake_root/lib/egl.lib.so \
|
|
qmake_root/lib/mesa.lib.so \
|
|
qmake_root/lib/qt5_component.lib.so \
|
|
qmake_root/lib/stdcxx.lib.so \
|
|
qmake_root/lib/ldso_so_support.lib.a \
|
|
qmake_root/mkspecs
|
|
# add symlinks for Qt5 libraries listed in the 'QT5_PORT_LIBS' variable
|
|
ifeq ($(CONTRIB_DIR),)
|
|
$(VERBOSE)for qt5_lib in $(QT5_PORT_LIBS); do \
|
|
ln -sf $(BUILD_BASE_DIR)/var/libcache/$${qt5_lib}/$${qt5_lib}.abi.so qmake_root/lib/$${qt5_lib}.lib.so; \
|
|
done
|
|
else
|
|
$(VERBOSE)for qt5_lib in $(QT5_PORT_LIBS); do \
|
|
ln -sf $(BUILD_BASE_DIR)/bin/$${qt5_lib}.lib.so qmake_root/lib/; \
|
|
done
|
|
endif
|
|
$(VERBOSE)touch $@
|
|
|
|
.PHONY: build_with_qmake
|
|
|
|
build_with_qmake: qmake_prepared.tag
|
|
|
|
$(VERBOSE)source env.sh && $(QMAKE) \
|
|
-qtconf qmake_root/mkspecs/$(QMAKE_PLATFORM)/qt.conf \
|
|
$(QMAKE_PROJECT_FILE) \
|
|
$(QT5_OUTPUT_FILTER)
|
|
|
|
$(VERBOSE)source env.sh && $(MAKE) $(QT5_OUTPUT_FILTER)
|
|
|
|
$(VERBOSE)for qmake_target_binary in $(QMAKE_TARGET_BINARIES); do \
|
|
$(STRIP) $${qmake_target_binary} -o $${qmake_target_binary}.stripped; \
|
|
ln -sf $(CURDIR)/$${qmake_target_binary}.stripped $(PWD)/bin/$${qmake_target_binary}; \
|
|
ln -sf $(CURDIR)/$${qmake_target_binary} $(PWD)/debug/; \
|
|
done
|
|
|
|
#
|
|
# build applications with qmake
|
|
#
|
|
TARGET ?= $(notdir $(QMAKE_PROJECT_FILE)).qmake_target
|
|
.PHONY: $(TARGET)
|
|
$(TARGET): build_with_qmake
|