summaryrefslogtreecommitdiffstats
path: root/tools/qmake/mkspecs/features/gn_generator.prf
blob: c5f283a99fb7b99115727f016a583a9a7b5efad3 (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
load(moc)
load(resources)

defineReplace(getTargetType) {
    equals(TEMPLATE, "app"):return("executable")
    equals(TEMPLATE, "lib") {
       CONFIG(static): return("static_library")
       return("shared_library")
  }
  return("none")
}

isEmpty(GN_FILE): GN_FILE = $$system_path($$_PRO_FILE_PWD_/BUILD.gn)
isEmpty(GN_RUN_BINARY_SCRIPT): GN_RUN_BINARY_SCRIPT = "//build/gn_run_binary.py"
isEmpty(GN_FIND_MOCABLES_SCRIPT): GN_FIND_MOCABLES_SCRIPT = "//build/gn_find_mocables.py"

# MOC SETUP

GN_CONTENTS += "moc_source_h_files = exec_script(\"$$GN_FIND_MOCABLES_SCRIPT\","
GN_CONTENTS += "  [ \"$$_PRO_FILE_PWD_\","
for (headerfile, HEADERS): GN_CONTENTS += "    \"$$GN_SRC_DIR/$$headerfile\","
GN_CONTENTS += "  ], \"list lines\", [\"$$system_path($$_PRO_FILE_)\"]"\
               ")"
GN_CONTENTS += "moc_source_cpp_files = exec_script(\"$$GN_FIND_MOCABLES_SCRIPT\","
GN_CONTENTS += "  [ \"$$_PRO_FILE_PWD_\","
for (sourcefile, SOURCES): GN_CONTENTS += "    \"$$GN_SRC_DIR/$$sourcefile\","
GN_CONTENTS += "  ], \"list lines\", [\"$$system_path($$_PRO_FILE_)\"]"\
               ")"

DEFINES_LIST = $$join(DEFINES, " -D", "-D")
INCLUDE_LIST = $$join(INCLUDEPATH, " -I", "-I")

# we don't generate a moc_predef file yet.
MOC_PREDEF_FILE =
MOC_COMMAND = $$clean_path($$mocCmdBase())
MOC_COMMAND = $$replace(MOC_COMMAND, $$re_escape("$(DEFINES)"), $$DEFINES_LIST)
MOC_COMMAND = $$replace(MOC_COMMAND, $$re_escape("$(INCPATH)"), $$INCLUDE_LIST)
MOC_COMMAND = $$eval($$list($$MOC_COMMAND))

GN_CONTENTS += "if (moc_source_h_files != []) {"
GN_CONTENTS += "  action_foreach(\"generate_h_mocs\") {"\
               "    script = \"$$GN_RUN_BINARY_SCRIPT\""
GN_CONTENTS += "    sources =  moc_source_h_files" \
               "    outputs = [ \"$target_gen_dir/.moc/moc_{{source_name_part}}.cpp\" ]"
GN_CONTENTS += "    inputs = [ \"$$system_path($$_PRO_FILE_)\" ]" \
               "    args = ["
for(token, MOC_COMMAND): GN_CONTENTS += "      \"$$replace(token,\',)\","
GN_CONTENTS += "      \"{{source}}\"," \
               "      \"-o\"," \
               "      rebase_path(\"$target_gen_dir/.moc/moc_{{source_name_part}}.cpp\")"\
               "    ]"
GN_CONTENTS += "  }"
GN_CONTENTS += "}"
GN_CONTENTS += "if (moc_source_cpp_files != []) {"
GN_CONTENTS += "  action_foreach(\"generate_cpp_mocs\") {"\
               "    script = \"$$GN_RUN_BINARY_SCRIPT\""
GN_CONTENTS += "    sources =  moc_source_cpp_files" \
               "    outputs = [ \"$target_gen_dir/.moc/{{source_name_part}}.moc\" ]"
GN_CONTENTS += "    inputs = [ \"$$system_path($$_PRO_FILE_)\" ]" \
               "    args = ["
for(token, MOC_COMMAND): GN_CONTENTS += "      \"$$replace(token,\',)\","
GN_CONTENTS += "      \"{{source}}\"," \
               "      \"-o\"," \
               "      rebase_path(\"$target_gen_dir/.moc/{{source_name_part}}.moc\")"\
               "    ]"
GN_CONTENTS += "  }"
GN_CONTENTS += "}"

# RESOURCES SETUP

CLEAN_QMAKE_RCC = $$clean_path($$QMAKE_RCC)

GN_CONTENTS += "action_foreach(\"generate_resources\") {"\
               "  script = \"$$GN_RUN_BINARY_SCRIPT\""
GN_CONTENTS += "  sources = ["
for (sourcefile, RESOURCES): GN_CONTENTS += "    \"$$GN_SRC_DIR/$$sourcefile\","
GN_CONTENTS += "  ]" \
               "  outputs = [ \"$target_gen_dir/.rcc/qrc_{{source_name_part}}.cpp\" ]"
GN_CONTENTS += "  inputs = [ \"$$system_path($$_PRO_FILE_)\" ]" \
               "  args = [" \
               "    \"$$replace(CLEAN_QMAKE_RCC,\',)\","
for(resource_flag, $$QMAKE_RESOURCE_FLAGS): GN_CONTENTS += "    \"$$resource_flag\""
GN_CONTENTS += "    \"-name\"," \
               "    \"{{source_name_part}}\"," \
               "    \"{{source}}\"," \
               "    \"-o\"," \
               "    rebase_path(\"$target_gen_dir/.rcc/qrc_{{source_name_part}}.cpp\")"\
               "   ]"
GN_CONTENTS += "}"

# TARGET SETUP

TARGET_TYPE = $$getTargetType()

GN_CONTENTS += "$${TARGET_TYPE}(\"$$TARGET\") {"

!isEmpty(GN_IMPORTS) {
for (imp, GN_IMPORTS): GN_CONTENTS += "  import(\"$$imp\")"
}

!isEmpty(QMAKE_FRAMEWORKPATH) {
    GN_CONTENTS += "  mac_framework_dirs = ["
    for(path, QMAKE_FRAMEWORKPATH): GN_CONTENTS += "    \"$$path\","
    GN_CONTENTS += "  ]"
}

!isEmpty(QMAKE_CFLAGS) {
    GN_CONTENTS += "  cflags = ["
    for(flag, QMAKE_CFLAGS): GN_CONTENTS += "    \"$$flag\","
    GN_CONTENTS += "  ]"
}
!isEmpty(QMAKE_CXXFLAGS) {
    GN_CONTENTS += "  cflags_cc = ["
    for(flag, QMAKE_CXXFLAGS): GN_CONTENTS += "    \"$$flag\","
    GN_CONTENTS += "  ]"
}

GN_CONTENTS += "  if (!defined(defines)) {"\
               "    defines = []"\
               "  }"
GN_CONTENTS += "  defines += ["
for (define, DEFINES): GN_CONTENTS += "    \"$$define\","
!isEmpty(QMAKE_LIBDIR_EGL):
    GN_CONTENTS += "    \"QT_LIBDIR_EGL=\\\"$${QMAKE_DIR_SEP}$$relative_path($$QMAKE_LIBDIR_EGL, $$[QT_SYSROOT])\\\"\","
!isEmpty(QMAKE_LIBDIR_OPENGL_ES2)
    GN_CONTENTS += "    \"QT_LIBDIR_GLES2=\\\"$${QMAKE_DIR_SEP}$$relative_path($$QMAKE_LIBDIR_OPENGL_ES2, $$[QT_SYSROOT])\\\"\","
GN_CONTENTS += "  ]"

# Source files to compile
GN_CONTENTS += "  sources = ["
for (sourcefile, SOURCES): GN_CONTENTS += "    \"$$GN_SRC_DIR/$$sourcefile\","
for (headerfile, HEADERS): GN_CONTENTS += "    \"$$GN_SRC_DIR/$$headerfile\","
GN_CONTENTS += "  ]"

# Add Sources generated by rcc from qrc files.
!isEmpty(RESOURCES): GN_CONTENTS += "  sources += get_target_outputs(\":generate_resources\")"

GN_CONTENTS += "  if (!defined(include_dirs)) {"\
               "    include_dirs = []"\
               "  }"
GN_CONTENTS += "  include_dirs += ["
for (path, INCLUDEPATH): GN_CONTENTS += "    \"$$path\","
GN_CONTENTS += "    rebase_path(\"$target_gen_dir/.moc/\")"
GN_CONTENTS += "  ]"

GN_CONTENTS += "  if (!defined(ldflags)) {"\
               "    ldflags = []"\
               "  }"
GN_CONTENTS += "  ldflags += ["
for (flag, QMAKE_LFLAGS): GN_CONTENTS += "    \"$$flag\","
for (flag, GN_FLAGS): GN_CONTENTS += "    \"$$flag\","
!isEmpty(QMAKE_RPATHDIR): GN_CONTENTS += "    \"-Wl,-rpath=$${QMAKE_RPATHDIR}\","
!isEmpty(QMAKE_RPATHLINKDIR): GN_CONTENTS += "    \"-Wl,-rpath-link=$${QMAKE_RPATHLINKDIR}\","
GN_CONTENTS += "  ]"

GN_CONTENTS += "  if (!defined(lib_dirs)) {"\
               "    lib_dirs = []"\
               "  }"
GN_CONTENTS += "  lib_dirs += ["
lib_dirs = $$find(LIBS, ^-L.*)
lib_dirs = $$unique(lib_dirs)
for (lib_dir, lib_dirs): GN_CONTENTS += "    \"$$replace(lib_dir, -L, )\","
GN_CONTENTS += "  ]"

GN_CONTENTS += "  if (!defined(libs)) {"\
               "    libs = []"\
               "  }"
GN_CONTENTS += "  libs += ["
for (lib, GN_LIBS): GN_CONTENTS += "    \"$$lib\","
libs = $$find(LIBS, ^-l.*)
libs = $$unique(libs)
for (lib, libs): GN_CONTENTS += "    \"$$replace(lib, -l, )\","
GN_CONTENTS += "  ]"

GN_CONTENTS += "  if (!defined(deps)) {"\
               "    deps = []"\
               "  }"
GN_CONTENTS += "  deps += ["
!isEmpty(RESOURCES): GN_CONTENTS += "      \":generate_resources\","
GN_CONTENTS += "  ]"
GN_CONTENTS += "  if (moc_source_h_files != []) {"
GN_CONTENTS += "    deps += ["
GN_CONTENTS += "        \":generate_h_mocs\","
GN_CONTENTS += "    ]"
# Add moc output files to compile
GN_CONTENTS += "    sources += get_target_outputs(\":generate_h_mocs\")"
GN_CONTENTS += "  }"
GN_CONTENTS += "  if (moc_source_cpp_files != []) {"
GN_CONTENTS += "    deps += ["
GN_CONTENTS += "        \":generate_cpp_mocs\","
GN_CONTENTS += "    ]"
GN_CONTENTS += "  }"
GN_CONTENTS += "}"
!isEmpty(GN_INCLUDES) {
    for (inc, GN_INCLUDES): GN_CONTENTS += $$cat($$inc,lines)
}

!build_pass: write_file($$GN_FILE, GN_CONTENTS)

# The generated Makefile shouldn't build anything by itself, just re-run qmake if necessary
TEMPLATE = aux
SOURCES =
HEADERS =
RESOURCES =