Sync Mk with ports
[dports.git] / Mk / bsd.wx.mk
1 # bsd.wx.mk - Support for wxWidgets based ports.
2 #
3 # Created by: Alejandro Pulver <alepulver@FreeBSD.org>
4 #
5 # The following variables can be defined in a port that uses the wxWidgets
6 # library, contributed libraries, WxPython and/or more wxWidgets related
7 # components (with run and/or build dependencies). It can be used after and/or
8 # before bsd.port.pre.mk, but Python components will only work if Python
9 # variables (e.g. USE_PYTHON) are defined before it (this is a bsd.python.mk
10 # limitation), at least it is manually included.
11 #
12 # USE_WX        - Set to the list of wxWidgets versions that can be used by
13 #                 the port. The syntax allows the following elements:
14 #                 - Single version (e.g. "3.0").
15 #                 - Range of versions (e.g. "2.8-3.0"). Must be ascending.
16 #                 - Partial range: single version and upper (e.g. "2.8+").
17 #                 - Partial range: single version and lower (e.g. "-2.8").
18 #                 Multiple elements can be specified separated by spaces.
19 # USE_WX_NOT    - Set to the list of wxWidgets versions that can't be used by
20 #                 the port. In other words, it removes some versions from
21 #                 USE_WX. If the latter is not defined, it will have the value
22 #                 of all the possible versions. The syntax is like USE_WX.
23 # WX_COMPS      - Set to the list of wxWidgets components the port uses.
24 #                 Several components can be specified separated by spaces. By
25 #                 default it will have the value of "wx". Suffixes in the form
26 #                 ":xxx" may be added to the components to determine the
27 #                 dependency type.
28 #                 The available components are:
29 #                 wx            - The wxWidgets library.
30 #                 contrib       - The wxWidgets contributed libraries.
31 #                 python        - The wxWidgets API for Python.
32 #                 The available dependency types are:
33 #                 build         - Requires component for building.
34 #                 lib           - Requires component for building and running.
35 #                 run           - Requires component for running.
36 #                 If no suffix is present then "run" will be used for "python"
37 #                 and "lib" for others.
38 # WX_CONF_ARGS  - Set to "absolute" or "relative" if the port needs configure
39 #                 arguments in addition to the WX_CONFIG environment variable.
40 #                 It determines the type of parameters that have to be passed
41 #                 to the configure script. In the first case it adds
42 #                 "--with-wx-config=${WX_CONFIG}" (absolute path of
43 #                 WX_CONFIG), and in second one "--with-wx=${LOCALBASE}" plus
44 #                 "--with-wx-config=${WX_CONFIG:T} (prefix and name).
45 # WX_PREMK      - Define to determine version and define WX_CONFIG/WX_VERSION
46 #                 after <bsd.port.pre.mk> (in case the port needs to manually
47 #                 run the script).
48 # WANT_WX       - Set to "yes" or a valid single version (no ranges, etc).
49 #                 In both cases it will detect the installed wxWidgets
50 #                 components and add them to the variable HAVE_WX. If a
51 #                 version is selected, HAVE_WX will contain a list of
52 #                 components in the other case it will contain a list of
53 #                 "component-version" pairs (e.g. wx-2.8, contrib-2.8, etc).
54 #                 It has to be used before bsd.port.pre.mk.
55 # WANT_WX_VER   - Set to the preferred wxWidgets version for the port. It must
56 #                 be present in USE_WX or missing in USE_WX_NOT. This is
57 #                 overridden by the user variable WITH_WX_VER if set. It can
58 #                 contain multiple versions in order of preference (last ones
59 #                 are tried first).
60 # WANT_WXGTK_VER - Set to the preferred GTK+ version, "2" or "3", "3" being
61 #                 the default (only applicable to wxWidgets 3.0 for now).
62 #
63 # The following variables are intended for the user and can be defined in
64 # make.conf.
65 # WITH_WX_VER   - Define to the list of preferred versions in reverse order.
66 #
67 # The following variables are defined by this file, to be read from the port.
68 # WX_CONFIG     - The path to the wx-config program (with different name).
69 # WXRC_CMD      - The path to the wxrc program (with different name).
70 # WX_VERSION    - The wxWidgets version that is going to be used.
71 # HAVE_WX       - The list of wxWidgets components installed, if WANT_WX was
72 #                 defined. The components will have version suffix if it was
73 #                 set to "yes".
74 #
75 # Examples:
76 # - A port that needs wxWidgets 2.8 and contributed libraries
77 #       USE_WX=         2.8
78 #       WX_COMPS=       wx contrib
79 # - A port that needs WxPython 2.8 for running.
80 #       USE_PYTHON=     yes
81 #       USE_WX=         2.8
82 #       WX_COMPS=       python:run
83 # - A port that needs WxPython 2.8 or 3.0 for building.
84 #       USE_PYTHON=     yes
85 #       USE_WX=         2.8 3.0
86 #       WX_COMPS=       python:build
87 # - A port that needs wxWidgets version 2.8 or higher and contributed
88 #       libraries.
89 #       USE_WX=         2.8+
90 #       WX_COMPS=       wx contrib
91 # - A port that needs wxWidgets of any version other than 2.8.
92 #       USE_WX_NOT=     2.8
93 #
94
95 WX_Include_MAINTAINER=  ports@FreeBSD.org
96
97 #
98 # Global definitions.
99 #
100
101 .if !defined(_WX_Definitions_Done)
102 _WX_Definitions_Done=   yes
103
104 #
105 # Common variables:
106 # _WX_COMPS_ALL         - List of valid components.
107 # _WX_DEP_TYPES_ALL     - List of valid dependency types.
108 # _WX_VERS_ALL          - List of supported versions.
109 # _WX_VERS_UC_ALL       - List of Unicode capable versions.
110 # _WX_VERS_LISTS        - Reverse lists preference order.
111 #
112
113 _WX_COMPS_ALL=          wx contrib python
114 _WX_DEP_TYPES_ALL=      build lib run
115 _WX_VERS_ALL=           2.8 3.0 3.1
116 _WX_VERS_UC_ALL=        2.8 3.0 3.1
117 _WX_VERS_SKIP=          3.0 3.1
118 _WX_VERS_LISTS=         WANT_WX_VER WITH_WX_VER _WX_VER_INSTALLED
119
120 #
121 # Variables used to determine what is needed:
122 # _WX_PORT_comp_ver     - Port directory.
123 # _WX_LIB_comp_ver      - Name of the shared library (optional).
124 # _WX_SHVER_comp_ver    - Shared library version (optional).
125 # _WX_FILE_comp_ver     - File installed by that component.
126 # _WX_DEPTYPE_comp_ver  - Default dependency type (optional).
127 #
128
129 # wxgtk 2.8
130 _WX_PORT_wx_2.8=        x11-toolkits/wxgtk28
131 _WX_LIB_wx_2.8=         wx_base${_WX_UC}-2.8
132
133 _WX_PORT_contrib_2.8=   x11-toolkits/wxgtk28-contrib
134 _WX_LIB_contrib_2.8=    wx_gtk2${_WX_UC}_fl-2.8
135
136 # wxgtk 3.0
137 _WX_PORT_wx_3.0=        x11-toolkits/wxgtk30@${_GTKFLAVOR}
138 _WX_LIB_wx_3.0=         wx_baseu-3.0
139
140 _WX_PORT_python_3.1=    x11-toolkits/py-wxPython4@${PY_FLAVOR}
141 _WX_FILE_python_3.1=    ${PYTHON_SITELIBDIR}/wx/__init__.py
142
143 # wxgtk 3.1
144 _WX_PORT_wx_3.1=        x11-toolkits/wxgtk31
145 _WX_LIB_wx_3.1=         wx_baseu-3.1
146
147 # Set _WX_SHVER_comp_ver to 0 and _WX_FILE_comp_ver for libs appropriately.
148 # Set _WX_DEPTYPE_comp_ver for "python" to "run", and others to "lib".
149
150 .  for comp in ${_WX_COMPS_ALL}
151 _WX_COMP=               ${comp}
152 .    for ver in ${_WX_VERS_ALL}
153 .      if defined(_WX_LIB_${comp}_${ver})
154 _WX_SHVER_${comp}_${ver}=       0
155 _WX_FILE_${comp}_${ver}=        ${LOCALBASE}/lib/lib${_WX_LIB_${comp}_${ver}}.so.${_WX_SHVER_${comp}_${ver}}
156 .      endif
157 .      if ${_WX_COMP} == "python"
158 _WX_DEPTYPE_${comp}_${ver}=     run
159 .      else
160 _WX_DEPTYPE_${comp}_${ver}=     lib
161 .      endif
162 .    endfor
163 .  endfor
164 .endif          # !_WX_Defined_Done
165
166 #
167 # Check if we are going to determine the version.
168 #
169
170 .if !defined(_WX_Version_Done) && (defined(_POSTMKINCLUDED) || \
171     (defined(WX_PREMK) && defined(BEFOREPORTMK) && \
172     (defined(USE_WX) || defined(USE_WX_NOT))))
173 _WX_Need_Version=       yes
174 .endif
175
176 #
177 # Check for present components.
178 #
179
180 # Requested by the user.
181
182 .if defined(WANT_WX) && defined(BEFOREPORTMK)
183 _WANT_WX=               ${WANT_WX}
184 .endif
185
186 # Used for autodetection of installed versions.
187
188 .if defined(_WX_Need_Version)
189 _WANT_WX=               yes
190 .endif
191
192 .if defined(_WANT_WX)
193
194 # These variables are reprocessed later so they won't affect other parts.
195
196 _WX_VER_FINAL=          ${_WX_VERS_UC_ALL}
197 _WX_UC=                 u
198 _WX_PYSUFX=             -unicode
199
200 # Fill _HAVE_WX with the installed components.
201
202 .       undef _HAVE_WX
203 .  for __WANT_WX in ${_WANT_WX}
204 # Check if _WANT_WX contains more than one word.
205 .    if defined(_HAVE_WX)
206 IGNORE?=                selected multiple values for WANT_WX: ${_WANT_WX}
207 .    endif
208 _HAVE_WX=               #
209 # Check for all versions.
210 .    if ${_WANT_WX:tl} == "yes"
211 .      for comp in ${_WX_COMPS_ALL}
212 .        for ver in ${_WX_VER_FINAL}
213 _WX_COMP=               _WX_FILE_${comp}_${ver}
214 .          if defined(${_WX_COMP}) && exists(${${_WX_COMP}})
215 _HAVE_WX+=              ${comp}-${ver}
216 .          endif
217 .        endfor
218 .      endfor
219 # Check for a specific version.
220 .    elif ${_WX_VERS_ALL:M${__WANT_WX}}
221 .      for comp in ${_WX_COMPS_ALL}
222 .        if exists(${_WX_FILE_${comp}_${__WANT_WX}})
223 _HAVE_WX+=              ${comp}
224 .        endif
225 .      endfor
226 .    else
227 IGNORE?=                selected an invalid value for WANT_WX: ${__WANT_WX}
228 .    endif
229 .  endfor
230 .endif          # _WANT_WX
231
232 # Requested by the user.
233
234 .if defined(WANT_WX) && defined(BEFOREPORTMK)
235 HAVE_WX:=               ${_HAVE_WX}
236 .endif
237
238 # Used for autodetection of installed versions.
239
240 .if defined(_WX_Need_Version)
241 _WX_VER_INSTALLED:=     ${_HAVE_WX:Mwx-*:S/wx-//}
242 .endif
243
244 #
245 # Select wxWidgets version.
246 #
247
248 .if defined(_WX_Need_Version)
249 _WX_Version_Done=       yes
250
251 #
252 # Basic component parsing (ignores dependency types).
253 #
254 # The variables used are:
255 # _WX_COMP              - Component part.
256 # _WX_COMPS_FINAL       - Final list of components.
257 #
258
259 # Detect duplicated components.
260
261 _WX_COMPS_FINAL=        #
262 .  for comp in ${WX_COMPS}
263 _WX_COMP=               ${comp:C/:([[:alpha:]]+)$//}
264 .    for __WX_COMP in ${_WX_COMP}
265 .      if ${_WX_COMPS_ALL:M${__WX_COMP}} == ""
266 IGNORE?=                selected an invalid wxWidgets component: ${__WX_COMP}
267 .      endif
268 .    endfor
269 .    for newcomp in ${_WX_COMP}
270 .      if ${_WX_COMPS_FINAL:M${newcomp}} == "" && !defined(IGNORE)
271 _WX_COMPS_FINAL+=       ${newcomp}
272 .      endif
273 .    endfor
274 .  endfor
275
276 # Set defaults (if one isn't present).
277
278 USE_WX?=                ${_WX_VERS_ALL}
279 USE_WX_NOT?=            #
280
281 #
282 # Make lists of valid and invalid versions.
283 #
284 # The following variables are used:
285 # _WX_VER_CHECK         - If the version is a single one, express in a range.
286 # _WX_VER_MIN           - Lower version of the range.
287 # _WX_VER_MAX           - Higher version of the range.
288 # _WX_VER_LIST          - List of requested versions.
289 # _WX_VER_NOT_LIST      - List of disallowed versions.
290 # _WX_VER_MERGED        - List of requested version without disallowed ones.
291 #
292
293 .  for list in VER VER_NOT
294 _WX_${list}_LIST=       #
295 .    for ver in ${USE_WX${list:C/VER//}}
296 _WX_VER_CHECK:=         ${ver:C/^([[:digit:]]+(\.[[:digit:]]+)*)$/\1-\1/}
297 _WX_VER_MIN:=           ${_WX_VER_CHECK:C/([[:digit:]]+(\.[[:digit:]]+)*)[-+].*/\1/}
298 _WX_VER_MAX:=           ${_WX_VER_CHECK:C/.*-([[:digit:]]+(\.[[:digit:]]+)*)/\1/}
299 # Minimum version not specified.
300 .      if ${_WX_VER_MIN} == ${_WX_VER_CHECK}
301 .                       undef _WX_VER_MIN
302 .        for v in ${_WX_VERS_ALL}
303 .          if ${_WX_VER_CHECK:C/[-+]//} == ${v} || ${_WX_VERS_SKIP:M${v}} == ""
304 _WX_VER_MIN?=           ${v}
305 .          endif
306 .        endfor
307 .      endif
308 # Maximum version not specified.
309 .      if ${_WX_VER_MAX} == ${_WX_VER_CHECK}
310 .        for v in ${_WX_VERS_ALL}
311 .          if ${_WX_VER_CHECK:C/[-+]//} == ${v} || ${_WX_VERS_SKIP:M${v}} == ""
312 _WX_VER_MAX=            ${v}
313 .          endif
314 .        endfor
315 .      endif
316 # Expand versions and add valid ones to each list.
317 .      for v in ${_WX_VERS_ALL}
318 .        if ${_WX_VER_MIN} <= ${v} && ${_WX_VER_MAX} >= ${v} && \
319                            ${_WX_${list}_LIST:M${v}} == ""
320 _WX_${list}_LIST+=      ${v}
321 .        endif
322 .      endfor
323 .    endfor
324 .  endfor
325
326 # Merge the lists into a single list of valid versions.
327
328 _WX_VER_MERGED=         #
329 .  for ver in ${_WX_VER_LIST}
330 .    if ${_WX_VER_NOT_LIST:M${ver}} == ""
331 _WX_VER_MERGED+=        ${ver}
332 .    endif
333 .  endfor
334
335 # Check for a null version.
336
337 .  if empty(_WX_VER_MERGED)
338 IGNORE?=                selected a null or invalid wxWidgets version
339 .  endif
340
341 # Avoid versions which have unavailable components.
342
343 .  for ver in ${_WX_VER_MERGED}
344 .    for comp in ${_WX_COMPS_FINAL}
345 .      if !defined(_WX_PORT_${comp}_${ver})
346 _WX_WRONG_COMPS+=       ${comp}
347 _WX_WRONG_VERS+=        ${ver}
348 _WX_VER_MERGED:=        ${_WX_VER_MERGED:N${ver}}
349 .      endif
350 .    endfor
351 .  endfor
352
353 .  if empty(_WX_VER_MERGED)
354 IGNORE?=                selected wxWidgets versions (${_WX_WRONG_VERS}) which do not have the selected components (${_WX_WRONG_COMPS})
355 .  endif
356
357 #
358 # Unicode support.
359 #
360
361 # Create a list of capable versions.
362
363 _WX_VER_UC=             #
364 .  for ver in ${_WX_VER_MERGED}
365 .    if ${_WX_VERS_UC_ALL:M${ver}} != ""
366 _WX_VER_UC+=            ${ver}
367 .    endif
368 .  endfor
369
370 # Set Unicode variables.
371
372 _WX_VER_FINAL=          ${_WX_VER_UC}
373 _WX_UC=                 u
374 _WX_PYSUFX=             -unicode
375
376 # Remove unusable installed versions.
377
378 .  for ver in ${_WX_VER_INSTALLED}
379 .    if ${_WX_VER_FINAL:M${ver}} == ""
380 _WX_VER_INSTALLED:=     ${_WX_VER_INSTALLED:N${ver}}
381 .    endif
382 .  endfor
383
384 #
385 # Choose final version.
386 #
387
388 #
389 # Check for the following (in order):
390 # 1) WITH_WX_VER        - User preference.
391 # 2) WANT_WX_VER        - Port preference.
392 # 3) _WX_VER_INSTALLED  - Installed versions.
393 # 4) _WX_VER_FINAL      - Available versions.
394
395
396 .  for list in _WX_VER_FINAL ${_WX_VERS_LISTS}
397 .    if defined(${list})
398 .      for ver in ${${list}}
399 .        if ${_WX_VER_FINAL:M${ver}} != ""
400 _WX_VER=                ${ver}
401 .        endif
402 .      endfor
403 .    endif
404 .  endfor
405
406 #
407 # Set variables.
408 #
409
410 .  if ${_WX_VER} == 3.1
411 _GTKVER=        3
412 .  elif ${_WX_VER} == 3.0
413 _GTKVER=        ${WANT_WXGTK_VER:U3}
414 _GTKFLAVOR=     gtk${_GTKVER}
415 .  else
416 _GTKVER=        2
417 .  endif
418
419 WX_CONFIG?=             ${LOCALBASE}/bin/wxgtk${_GTKVER}${_WX_UC}-${_WX_VER}-config
420 WXRC_CMD?=              ${LOCALBASE}/bin/wxrc-gtk${_GTKVER}${_WX_UC}-${_WX_VER}
421 WX_VERSION?=            ${_WX_VER}
422
423 .endif          # _WX_Need_Version
424
425 #
426 # Process components list and add dependencies, variables, etc.
427 #
428
429 .if defined(_POSTMKINCLUDED)
430
431 #
432 # Component parsing.
433 #
434 # The variables used are:
435 # _WX_COMP              - Component part.
436 # _WX_DEP_TYPE          - Dependency type part.
437 # _WX_COMP_NEW          - Component + dependency type.
438 # _WX_COMPS_FINAL       - Final list of components with dependency types.
439 #
440
441 # Default components.
442
443 WX_COMPS?=              wx
444
445 # Detect invalid and duplicated components.
446
447 _WX_COMPS_FINAL=        #
448 .  for comp in ${WX_COMPS}
449 _WX_COMP=               ${comp:C/:([[:alpha:]]+)$//}
450 .    if ${_WX_COMP} == ${comp}
451 _WX_DEP_TYPE=           ${_WX_DEPTYPE_${comp}_${_WX_VER}}
452 .    else
453 _WX_DEP_TYPE=           ${comp:C/.+:([[:alpha:]]+)$/\1/}
454 .    endif
455 _WX_COMP_NEW=           ${_WX_COMP}_${_WX_DEP_TYPE}
456 .    for __WX_COMP in ${_WX_COMP}
457 .      if ${_WX_COMPS_ALL:M${__WX_COMP}} == ""
458 IGNORE?=                selected an invalid wxWidgets component: ${__WX_COMP}
459 .      endif
460 .    endfor
461 .    for __WX_DEP_TYPE in ${_WX_DEP_TYPE}
462 .      if ${_WX_DEP_TYPES_ALL:M${__WX_DEP_TYPE}} == ""
463 IGNORE?=                selected an invalid wxWidgets dependency type: ${__WX_DEP_TYPE}
464 .      endif
465 .    endfor
466 .    if !defined(_WX_PORT_${_WX_COMP}_${_WX_VER})
467 IGNORE?=                selected a wxWidgets component (${_WX_COMP}) which is not available for the selected version (${_WX_VER})
468 .    endif
469 .    for newcomp in ${_WX_COMP_NEW}
470 .      if ${_WX_COMPS_FINAL:M${newcomp}} == "" && !defined(IGNORE)
471 _WX_COMPS_FINAL+=       ${newcomp}
472 .      endif
473 .    endfor
474 .  endfor
475
476 # Add dependencies.
477 #
478 # The variable used are:
479 # _WX_COMP              - Component part.
480 # _WX_DEP_TYPE          - Dependency type part.
481
482 .  for comp in ${_WX_COMPS_FINAL}
483 _WX_COMP=               ${comp:C/_([[:alpha:]]+)$//}
484 _WX_DEP_TYPE=           ${comp:C/.+_([[:alpha:]]+)$/\1/}
485 # XXX Need a .for loop here so the variable is expanded before the assignment.
486 .    for comp_part in ${_WX_COMP}
487 .      if ${_WX_DEP_TYPE} == "lib"
488 .        if defined(_WX_LIB_${_WX_COMP}_${_WX_VER})
489 LIB_DEPENDS+=           lib${_WX_LIB_${comp_part}_${_WX_VER}}.so:${_WX_PORT_${comp_part}_${_WX_VER}}
490 .        else
491 BUILD_DEPENDS+=         ${_WX_FILE_${comp_part}_${_WX_VER}}:${_WX_PORT_${comp_part}_${_WX_VER}}
492 RUN_DEPENDS+=           ${_WX_FILE_${comp_part}_${_WX_VER}}:${_WX_PORT_${comp_part}_${_WX_VER}}
493 .        endif
494 .      else
495 ${_WX_DEP_TYPE:tu}_DEPENDS+=    ${_WX_FILE_${comp_part}_${_WX_VER}}:${_WX_PORT_${comp_part}_${_WX_VER}}
496 .      endif
497 .    endfor
498 .  endfor
499
500 #
501 # Set build related variables.
502 #
503
504 MAKE_ENV+=              WX_CONFIG=${WX_CONFIG}
505 CONFIGURE_ENV+=         WX_CONFIG=${WX_CONFIG}
506
507 .  if defined(WX_CONF_ARGS)
508 .    if ${WX_CONF_ARGS:tl} == "absolute"
509 CONFIGURE_ARGS+=        --with-wx-config=${WX_CONFIG}
510 .    elif ${WX_CONF_ARGS:tl} == "relative"
511 CONFIGURE_ARGS+=        --with-wx=${LOCALBASE} \
512                         --with-wx-config=${WX_CONFIG:T}
513 .    else
514 IGNORE?=                selected an invalid wxWidgets configure argument type: ${WX_CONF_ARGS}
515 .    endif
516 .  endif
517
518 .endif          # _POSTMKINCLUDED