aboutsummaryrefslogtreecommitdiffstats
path: root/src/tools/ivigenerator/qface_internal_build.pri
blob: 99b84a752687980e78e9d1fced80520ecd0d5f80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
QFACE_SOURCE_DIR = $$QTIVI_ROOT/src/3rdparty/qface

# only create the environment once
debug_and_release:build_pass:CONFIG(release, debug|release) {
    return();
}

!exists($$QFACE_SOURCE_DIR/setup.py): error("Couldn't find $$QFACE_SOURCE_DIR: Please make sure all submodules are initialized")

include($$shadowed($$PWD/../../ivicore/qtivicore-config.pri))

VIRTUALENV_EXE = $$shell_quote($$QMAKE_PYTHON3_LOCATION) -m virtualenv
# virtualenv is always using the default interpreter, which is python2 on many systems"
# by adding -p we enforce that the python3 interpreter is used and make sure python3 is installed in the virtualenv
VIRTUALENV_EXE += " -p $$shell_quote($$QMAKE_PYTHON3_LOCATION)"

# Use a Python virtualenv for installing qface, so we don't pollute the user environment
# On some systems virtualenv --always-copy doesn't work (https://github.com/pypa/virtualenv/issues/565).
# To workaround the problem, we need to manually create the folder and create the virtualenv from
# inside
equals(QMAKE_HOST.os, Windows): qtivi_qface_virtualenv.target = qtivi_qface_virtualenv/Scripts/python.exe
else:  qtivi_qface_virtualenv.target = qtivi_qface_virtualenv/bin/python
qtivi_qface_virtualenv.commands = \
    $(MKDIR) qtivi_qface_virtualenv $$escape_expand(\n\t) \
    cd qtivi_qface_virtualenv && $$VIRTUALENV_EXE --always-copy . $$escape_expand(\n\t) \
    cd qtivi_qface_virtualenv && $$VIRTUALENV_EXE --relocatable . $$escape_expand(\n\t) \
    @echo "Set up virtualenv for qface, name: qtivi_qface_virtualenv"
QMAKE_EXTRA_TARGETS += qtivi_qface_virtualenv

# This helper adds a target for the qtivi_qface_virtualenv folder
# This target is needed for any target which has the folder as a dependency but not the python executable
qtivi_qface_virtualenv_helper.target = qtivi_qface_virtualenv
qtivi_qface_virtualenv_helper.depends = $${qtivi_qface_virtualenv.target}
QMAKE_EXTRA_TARGETS += qtivi_qface_virtualenv_helper

equals(QMAKE_HOST.os, Windows): VIRTUALENV_ACTIVATION = qtivi_qface_virtualenv\Scripts\activate &&
else: VIRTUALENV_ACTIVATION = . qtivi_qface_virtualenv/bin/activate &&

# Create the forceRebuild file during the qmake run.
# This file is used as a dependency in other Makefiles.
# Once the virtualenv is created and setup the file will
# be touched to recreate theses Makefiles.
write_file($$OUT_PWD/forceRebuild)

PYTHON3_SHORT_VERSION_SPLITTED = $$split(QMAKE_PYTHON3_VERSION, .)
PYTHON3_SHORT_VERSION = $$member(PYTHON3_SHORT_VERSION_SPLITTED, 0).$$member(PYTHON3_SHORT_VERSION_SPLITTED, 1)

# On the CI we use the special wheel folder when available to not download all packages again on each build
PYTHON3_WHEEL_CACHE=$$(PYTHON3_WHEEL_CACHE)
!isEmpty(PYTHON3_WHEEL_CACHE): PIP3_INSTALL_COMMAND = pip3 install --no-index --find-links=$$shell_path($$PYTHON3_WHEEL_CACHE) $$shell_path($$QFACE_SOURCE_DIR) --verbose
else: PIP3_INSTALL_COMMAND = pip3 install --upgrade $$shell_path($$QFACE_SOURCE_DIR)

# Always run this target
equals(QMAKE_HOST.os, Windows): qtivi_qface_install.target = qtivi_qface_virtualenv/Lib/site-packages/qface
else: qtivi_qface_install.target = qtivi_qface_virtualenv/lib/python$${PYTHON3_SHORT_VERSION}/site-packages/qface
qtivi_qface_install.depends = $${qtivi_qface_virtualenv.target}
qtivi_qface_install.depends += $$QFACE_SOURCE_DIR/setup.py
qtivi_qface_install.depends += $$QFACE_SOURCE_DIR/requirements.txt
qtivi_qface_install.depends += $$QFACE_SOURCE_DIR/qface/__about__.py
qtivi_qface_install.commands = $$VIRTUALENV_ACTIVATION \
        $$PIP3_INSTALL_COMMAND $$escape_expand(\n\t) \
        @echo "Installed qface development version into qtivi_qface_virtualenv" $$escape_expand(\n\t)
equals(QMAKE_HOST.os, Windows): qtivi_qface_install.commands += @COPY /B $$shell_path($$OUT_PWD/forceRebuild)+,, $$shell_path($$OUT_PWD/forceRebuild) >NUL
else: qtivi_qface_install.commands += @touch $$OUT_PWD/forceRebuild
QMAKE_EXTRA_TARGETS += qtivi_qface_install

# We need to make the virtualenv first deployable
# Otherwise it still needs some modules from the system
deploy_virtualenv.target = .stamp-deploy_virtualenv
equals(QMAKE_HOST.os, Windows) {
    deploy_virtualenv.commands = $$shell_path($$PWD/deploy-virtualenv.bat) qtivi_qface_virtualenv $$escape_expand(\n\t)
    deploy_virtualenv.commands += @type nul > $$shell_path($$OUT_PWD/.stamp-deploy_virtualenv)
} else {
    deploy_virtualenv.commands = $$PWD/deploy-virtualenv.sh qtivi_qface_virtualenv $$escape_expand(\n\t)
    deploy_virtualenv.commands += @touch $$OUT_PWD/.stamp-deploy_virtualenv
}
deploy_virtualenv.depends = $${qtivi_qface_install.target}
QMAKE_EXTRA_TARGETS += deploy_virtualenv
PRE_TARGETDEPS += $${deploy_virtualenv.target}

virtualenv.files = $$OUT_PWD/qtivi_qface_virtualenv
virtualenv.path = $$[QT_HOST_BINS]/ivigenerator
virtualenv.depends = deploy_virtualenv
virtualenv.CONFIG = no_check_exist directory no_build

INSTALLS += virtualenv

# On osx the hidden .Python file is needed in the installed virtualenv as well
# this file is not installed by the directory config, so we need to install it manually
equals(QMAKE_HOST.os, Darwin) {
    virtualenv-python.files = $$OUT_PWD/qtivi_qface_virtualenv/.Python
    virtualenv-python.path = $$[QT_HOST_BINS]/ivigenerator/qtivi_qface_virtualenv
    # In case the file doesn't exist, touch creates it and fixes the install target
    virtualenv-python.extra = @touch $$OUT_PWD/qtivi_qface_virtualenv/.Python
    virtualenv-python.CONFIG = no_check_exist
    virtualenv-python.depends = install_virtualenv
    INSTALLS += virtualenv-python
}

# Create the ivigenerator when the prepare_docs target is run, to generate the code
# and have it ready when qdoc parses it for the documentation
prepare_docs {
    prepare_docs.depends += $${deploy_virtualenv.target}
    QMAKE_EXTRA_TARGETS += prepare_docs
}