1#############################################################################
2# $Id: CMake.NCBIptb.cmake 620014 2020-11-13 18:30:31Z gouriano $
3#############################################################################
4#############################################################################
5##
6##  NCBI CMake wrapper
7##    Author: Andrei Gourianov, gouriano@ncbi
8##
9##---------------------------------------------------------------------------
10##  in CMakeLists.txt:
11##    NCBI_add_subdirectory( list of subdirectories)
12##    NCBI_add_library(      list of libraries)
13##    NCBI_add_app(          list of apps)
14##---------------------------------------------------------------------------
15##  the following calls in CMakeLists.txt affect all projects in current dir and all subdirs
16##    NCBI_headers( list of headers)
17##    NCBI_disable_pch() / NCBI_enable_pch()
18##    NCBI_requires( list of components)
19##    NCBI_optional_components(  list of components)
20##    NCBI_add_definitions(         list of compiler definitions)
21##    NCBI_add_include_directories( list of directories)
22##    NCBI_uses_toolkit_libraries(  list of libraries)
23##    NCBI_uses_external_libraries( list of libraries)
24##    NCBI_project_tags(list of tags)
25##
26##---------------------------------------------------------------------------
27##  in CMakeLists.xxx.[lib|app].txt - all calls affect current project only
28##    NCBI_begin_lib(name) or NCBI_begin_app(name)
29##
30##      NCBI_sources(   list of source files)
31##      NCBI_generated_sources(   list of source files) - file extension is mandatory
32##      NCBI_headers(   list of header files) - only relative paths and masks are allowed
33##      NCBI_resources( list of resource files) - file extension is mandatory
34##      NCBI_dataspecs( list of data specs - ASN, DTD, XSD etc) - file extension is mandatory
35##
36##      NCBI_requires( list of components)
37##      NCBI_optional_components(  list of components)
38##
39##      NCBI_enable_pch() / NCBI_disable_pch() - no arguments
40##      NCBI_disable_pch_for( list of source files)
41##      NCBI_set_pch_header( header file)
42##      NCBI_set_pch_define( macro to define)
43##
44##      NCBI_uses_toolkit_libraries(  list of libraries)
45##      NCBI_uses_external_libraries( list of libraries)
46##      NCBI_add_definitions(         list of compiler definitions)
47##      NCBI_add_include_directories( list of directories)
48##
49##      NCBI_hosts_projects(list of parts) - used to assemble composite shared libraries
50##
51##      NCBI_set_property(property value)
52##      NCBI_project_tags(     list of tags)
53##      NCBI_project_watchers( list of watchers)
54##
55##      Testing:
56##      short form
57##          NCBI_add_test( test command) - empty command means run the app with no arguments
58##      long form
59##          NCBI_begin_test(name) - name is optional
60##              NCBI_set_test_command(command, maybe with arguments)
61##           OR NCBI_set_test_arguments(arguments only)
62##              NCBI_set_test_assets(list of assets) - required files and directories
63##              NCBI_set_test_timeout(seconds)
64##              NCBI_set_test_requires(list of components)
65##              NCBI_set_test_resources(list of test resources)
66##              NCBI_set_test_labels(list of labels)
67##          NCBI_end_test()
68##
69##    NCBI_end_lib(result) or NCBI_end_app(result) - argument 'result' is optional
70##
71##---------------------------------------------------------------------------
72##  custom targets
73##  in CMakeLists.txt:
74##    NCBI_add_target( list of targets)
75##
76##  in CMakeLists.xxx.txt - add function which defines target, then add target:
77##    function(xxx_definition)      - the function name must be unique
78##      ...
79##      add_custom_target(name ...) - the same name as in NCBI_begin_custom_target
80##    endfunction()
81##
82##    NCBI_begin_custom_target(name)
83##      NCBI_requires( list of components)
84##      NCBI_custom_target_dependencies(list of toolkit libraries or apps)
85##      NCBI_custom_target_definition( xxx_definition) - function name defined above
86##    NCBI_end_custom_target(result) - argument 'result' is optional
87##
88##---------------------------------------------------------------------------
89##  extensions
90##    NCBI_register_hook(event callback_function)
91##      events:
92##        TARGET_PARSED - a project is parsed
93##        ALL_PARSED    - all projects in the source tree are parsed
94##        COLLECTED     - all build targets are collected
95##        TARGET_ADDED  - build target is added
96##        ALL_ADDED     - all targets are added
97##        DATASPEC      - process data specification
98##
99#############################################################################
100
101
102#############################################################################
103# deprecated
104macro(NCBI_add_root_subdirectory)
105    message(WARNING "NCBI_add_root_subdirectory is deprecated, use NCBI_add_subdirectory instead")
106    NCBI_add_subdirectory(${ARGV})
107endmacro()
108
109#############################################################################
110function(NCBI_add_subdirectory)
111    if(NCBI_PTBMODE_PARTS)
112        return()
113    endif()
114
115    if(NOT DEFINED NCBI_CURRENT_SOURCE_DIR)
116        set(NCBI_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
117    endif()
118    if("${NCBI_CURRENT_SOURCE_DIR}" STREQUAL "${NCBITK_SRC_ROOT}")
119        set(NCBI_TREE_ROOT    ${NCBITK_TREE_ROOT})
120        set(NCBI_SRC_ROOT     ${NCBITK_SRC_ROOT})
121        set(NCBI_INC_ROOT     ${NCBITK_INC_ROOT})
122    elseif("${NCBI_CURRENT_SOURCE_DIR}" STREQUAL "${NCBITK_TREE_ROOT}")
123        set(NCBI_TREE_ROOT    ${NCBITK_TREE_ROOT})
124        set(NCBI_SRC_ROOT     ${NCBITK_TREE_ROOT})
125        set(NCBI_INC_ROOT     ${NCBITK_TREE_ROOT})
126    endif()
127
128    if(NOT NCBI_PTB_HAS_ROOT)
129        NCBI_internal_analyze_tree()
130    endif()
131
132    if(NCBI_PTBMODE_COLLECT_DEPS)
133        set(_curdir ${NCBI_CURRENT_SOURCE_DIR})
134        foreach(_sub IN LISTS ARGV)
135            if (EXISTS "${_curdir}/${_sub}/CMakeLists.txt")
136                set(NCBI_CURRENT_SOURCE_DIR ${_curdir}/${_sub})
137                NCBI_internal_include("${_curdir}/${_sub}/CMakeLists.txt")
138            else()
139                message("WARNING: directory not found: ${_curdir}/${_sub}")
140            endif()
141        endforeach()
142    else()
143        foreach(_sub IN LISTS ARGV)
144            set(NCBI_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${_sub})
145            if(DEFINED NCBI_PTB_ALLOWED_DIRS)
146                set(_is_good FALSE)
147                foreach(_dir IN LISTS NCBI_PTB_ALLOWED_DIRS)
148                    string(FIND ${_dir} ${NCBI_CURRENT_SOURCE_DIR} _pos)
149                    if(${_pos} EQUAL 0)
150                        set(_is_good TRUE)
151                        break()
152                    endif()
153                endforeach()
154            else()
155                NCBI_internal_process_project_filters( _is_good)
156                if(NOT _is_good)
157                    if(NOT "${NCBI_PTBCFG_PROJECT_LIST}" STREQUAL "")
158                        foreach(_dir IN LISTS NCBI_PTBCFG_PROJECT_LIST)
159                            string(FIND "${NCBI_SRC_ROOT}/${_dir}" "${NCBI_CURRENT_SOURCE_DIR}" _pos)
160                            if(${_pos} EQUAL 0)
161                                set(_is_good TRUE)
162                                break()
163                            endif()
164                        endforeach()
165                    endif()
166                endif()
167            endif()
168            if (_is_good AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${_sub}/CMakeLists.txt")
169                add_subdirectory(${_sub})
170            endif()
171        endforeach()
172    endif()
173endfunction()
174
175#############################################################################
176function(NCBI_add_library)
177    if(NCBI_PTBMODE_PARTS)
178        return()
179    endif()
180    if(NOT NCBI_PTBMODE_COLLECT_DEPS)
181        set(NCBI_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
182    endif()
183    set(NCBI_PROJECT_expected library)
184    foreach(_lib IN LISTS ARGV)
185        if (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_lib}.lib.txt)
186            NCBI_internal_include(${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_lib}.lib.txt)
187        elseif (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_lib}.asn.txt)
188            NCBI_internal_include(${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_lib}.asn.txt)
189        elseif (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/${_lib} AND NOT IS_DIRECTORY ${NCBI_CURRENT_SOURCE_DIR}/${_lib})
190            NCBI_internal_include(${NCBI_CURRENT_SOURCE_DIR}/${_lib})
191        else()
192            message("WARNING: Library project not found: ${_lib} (${NCBI_CURRENT_SOURCE_DIR})")
193        endif()
194    endforeach()
195    unset(NCBI_PROJECT_expected)
196endfunction()
197
198#############################################################################
199function(NCBI_add_app)
200    if(NCBI_PTBMODE_PARTS)
201        return()
202    endif()
203    if(NOT NCBI_PTBMODE_COLLECT_DEPS)
204        set(NCBI_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
205    endif()
206    set(NCBI_PROJECT_expected app)
207    foreach(_app IN LISTS ARGV)
208        if (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_app}.app.txt)
209            NCBI_internal_include(${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_app}.app.txt)
210        elseif (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/${_app} AND NOT IS_DIRECTORY ${NCBI_CURRENT_SOURCE_DIR}/${_app})
211            NCBI_internal_include(${NCBI_CURRENT_SOURCE_DIR}/${_app})
212        else()
213            message("WARNING: App project not found: ${_app} (${NCBI_CURRENT_SOURCE_DIR})")
214        endif()
215    endforeach()
216    unset(NCBI_PROJECT_expected)
217endfunction()
218
219#############################################################################
220function(NCBI_add_target)
221    if(NCBI_PTBMODE_PARTS)
222        return()
223    endif()
224    if(NOT NCBI_PTBMODE_COLLECT_DEPS)
225        set(NCBI_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
226    endif()
227    foreach(_prj IN LISTS ARGV)
228        if (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_prj}.txt)
229            NCBI_internal_include(${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.${_prj}.txt)
230        elseif (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/${_prj} AND NOT IS_DIRECTORY ${NCBI_CURRENT_SOURCE_DIR}/${_prj})
231            NCBI_internal_include(${NCBI_CURRENT_SOURCE_DIR}/${_prj})
232        else()
233            message("WARNING: Target not found: ${_prj} (${NCBI_CURRENT_SOURCE_DIR})")
234        endif()
235    endforeach()
236endfunction()
237
238#############################################################################
239macro(NCBI_begin_lib _name)
240    if( NOT NCBI_PTBMODE_PARTS AND NOT "${NCBI_PROJECT_expected}" STREQUAL "" AND NOT "${NCBI_PROJECT_expected}" STREQUAL "library")
241        message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unexpected NCBI_begin_lib call")
242    endif()
243    if(NCBI_PTBMODE_PARTS)
244        set(_libname ${_name}.part)
245    else()
246        set(_libname ${_name})
247    endif()
248    if (DEFINED NCBI_EXTERNAL_TREE_ROOT AND TARGET ${_name})
249        set(_libname ${_libname}.local)
250        if (NCBI_PTBMODE_COLLECT_DEPS)
251            set_property(GLOBAL PROPERTY NCBI_PTBPROP_LOCAL_${_name} "${_libname}")
252            message(STATUS "Imported target ${_name} will be replaced with local ${_libname} (${NCBI_CURRENT_SOURCE_DIR})")
253        endif()
254    endif()
255    set(NCBI_PROJECT_lib ${_libname})
256    set(NCBI_PROJECT ${_libname})
257    set(NCBI_${NCBI_PROJECT}_OUTPUT ${_name})
258    if ("${ARGC}" GREATER "1")
259        if (NOT "${ARGV1}" STREQUAL "STATIC" AND NOT "${ARGV1}" STREQUAL "SHARED")
260            message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unsupported lib type: ${ARGV1}")
261        endif()
262        if(BUILD_SHARED_LIBS)
263            set(NCBI_${NCBI_PROJECT}_TYPE ${ARGV1})
264        else()
265            set(NCBI_${NCBI_PROJECT}_TYPE STATIC)
266        endif()
267    else()
268        if(BUILD_SHARED_LIBS)
269            if(WIN32 OR XCODE)
270                set(NCBI_${NCBI_PROJECT}_TYPE STATIC)
271            else()
272                set(NCBI_${NCBI_PROJECT}_TYPE SHARED)
273            endif()
274        else()
275            set(NCBI_${NCBI_PROJECT}_TYPE STATIC)
276        endif()
277    endif()
278    set(NCBI_PROJECT_PARTNAME ${_name})
279    set(NCBI_PROJECT_ID ${_name}.${NCBI_${NCBI_PROJECT}_TYPE})
280endmacro()
281
282#############################################################################
283macro(NCBI_end_lib)
284    if(NOT DEFINED NCBI_PROJECT_lib)
285        message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unexpected NCBI_end_lib call")
286    endif()
287    NCBI_internal_add_project(${ARGV})
288    unset(NCBI_PROJECT)
289endmacro()
290
291#############################################################################
292macro(NCBI_begin_app _name)
293    if( NOT NCBI_PTBMODE_PARTS AND NOT "${NCBI_PROJECT_expected}" STREQUAL "" AND NOT "${NCBI_PROJECT_expected}" STREQUAL "app")
294        message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unexpected NCBI_begin_app call")
295    endif()
296    if(NCBI_PTBMODE_PARTS)
297        set(_appname ${_name}.part)
298    else()
299        set(_appname ${_name})
300    endif()
301    if (DEFINED NCBI_EXTERNAL_TREE_ROOT AND TARGET ${_name})
302        set(_appname ${_appname}.local)
303        if (NCBI_PTBMODE_COLLECT_DEPS)
304            set_property(GLOBAL PROPERTY NCBI_PTBPROP_LOCAL_${_name} "${_appname}")
305            message(STATUS "Imported target ${_name} will be replaced with local ${_appname} (${NCBI_CURRENT_SOURCE_DIR})")
306        endif()
307    endif()
308    set(NCBI_PROJECT_app ${_appname})
309    if (NOT DEFINED NCBI_EXTERNAL_TREE_ROOT)
310        get_property(_dir GLOBAL PROPERTY NCBI_PTBPROP_DIR_${_name})
311        if (NOT ${_dir} STREQUAL "")
312            if (NCBI_PTBMODE_COLLECT_DEPS OR TARGET ${_name})
313                set(_appname ${_appname}-app)
314            endif()
315        elseif(NOT NCBI_PTBCFG_ENABLE_COLLECTOR)
316            if (TARGET ${_name})
317                set(_appname ${_appname}-app)
318            endif()
319        endif()
320    endif()
321    set(NCBI_PROJECT ${_appname})
322    set(NCBI_${NCBI_PROJECT}_OUTPUT ${_name})
323    if ("${ARGC}" GREATER "1")
324        if ("${ARGV1}" STREQUAL "GUI")
325            set(NCBI_${NCBI_PROJECT}_TYPE GUIAPP)
326        elseif ("${ARGV1}" STREQUAL "CONSOLE")
327            set(NCBI_${NCBI_PROJECT}_TYPE CONSOLEAPP)
328        else()
329            message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unsupported app type: ${ARGV1}")
330        endif()
331    else()
332        set(NCBI_${NCBI_PROJECT}_TYPE CONSOLEAPP)
333    endif()
334    set(NCBI_PROJECT_PARTNAME ${_name})
335    set(NCBI_PROJECT_ID ${_name}.${NCBI_${NCBI_PROJECT}_TYPE})
336endmacro()
337
338#############################################################################
339macro(NCBI_end_app)
340    if(NOT DEFINED NCBI_PROJECT_app)
341        message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unexpected NCBI_end_app call")
342    endif()
343    NCBI_internal_add_project(${ARGV})
344    unset(NCBI_PROJECT)
345endmacro()
346
347#############################################################################
348macro(NCBI_begin_custom_target _name)
349    set(NCBI_PROJECT_custom ${_name})
350    set(NCBI_PROJECT ${_name})
351    set(NCBI_${NCBI_PROJECT}_TYPE CUSTOM)
352    set(NCBI_PROJECT_ID ${_name}.${NCBI_${NCBI_PROJECT}_TYPE})
353endmacro()
354
355#############################################################################
356macro(NCBI_end_custom_target)
357    if(NOT DEFINED NCBI_PROJECT_custom)
358        message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unexpected NCBI_end_custom_target call")
359    endif()
360    if(NOT DEFINED NCBI_${NCBI_PROJECT}_DEFINITION)
361        message(FATAL_ERROR "${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}): Custom project definition not provided")
362    endif()
363    NCBI_internal_add_project(${ARGV})
364    unset(NCBI_PROJECT)
365endmacro()
366
367#############################################################################
368macro(NCBI_custom_target_definition _def)
369    set(NCBI_${NCBI_PROJECT}_DEFINITION ${_def})
370endmacro()
371
372#############################################################################
373macro(NCBI_custom_target_dependencies)
374    set(NCBI_${NCBI_PROJECT}_NCBILIB ${NCBI_${NCBI_PROJECT}_NCBILIB} "${ARGV}")
375endmacro()
376
377#############################################################################
378macro(NCBI_sources)
379    set(NCBI_${NCBI_PROJECT}_SOURCES ${NCBI_${NCBI_PROJECT}_SOURCES} "${ARGV}")
380endmacro()
381macro(NCBI_generated_sources)
382    set(NCBI_${NCBI_PROJECT}_GENERATED_SOURCES ${NCBI_${NCBI_PROJECT}_GENERATED_SOURCES} "${ARGV}")
383endmacro()
384
385#############################################################################
386macro(NCBI_headers)
387    set(NCBI_${NCBI_PROJECT}_HEADERS ${NCBI_${NCBI_PROJECT}_HEADERS} "${ARGV}")
388endmacro()
389
390#############################################################################
391macro(NCBI_resources)
392    set(NCBI_${NCBI_PROJECT}_RESOURCES ${NCBI_${NCBI_PROJECT}_RESOURCES} "${ARGV}")
393endmacro()
394
395#############################################################################
396macro(NCBI_dataspecs)
397    set(NCBI_${NCBI_PROJECT}_DATASPEC ${NCBI_${NCBI_PROJECT}_DATASPEC} "${ARGV}")
398endmacro()
399
400#############################################################################
401macro(NCBI_hosts_projects)
402    set(NCBI_${NCBI_PROJECT}_PARTS ${NCBI_${NCBI_PROJECT}_PARTS} "${ARGV}")
403    if(NOT DEFINED NCBI_PROJECT_ID_COMPOSITE)
404        set(NCBI_PROJECT_ID_COMPOSITE ${NCBI_PROJECT_ID})
405        set(NCBI_PROJECT_ID ${NCBI_PROJECT_ID}.COMPOSITE)
406    endif()
407endmacro()
408
409macro(NCBI_hosts_virtual_projects)
410    set(NCBI_${NCBI_PROJECT}_VIRTPARTS ${NCBI_${NCBI_PROJECT}_VIRTPARTS} "${ARGV}")
411endmacro()
412
413#############################################################################
414macro(NCBI_requires)
415    set(NCBI_${NCBI_PROJECT}_REQUIRES ${NCBI_${NCBI_PROJECT}_REQUIRES} "${ARGV}")
416endmacro()
417
418#############################################################################
419macro(NCBI_optional_components)
420    set(NCBI_${NCBI_PROJECT}_COMPONENTS ${NCBI_${NCBI_PROJECT}_COMPONENTS} "${ARGV}")
421endmacro()
422
423#############################################################################
424macro(NCBI_enable_pch)
425    set(NCBI_${NCBI_PROJECT}_USEPCH ${NCBI_DEFAULT_USEPCH})
426endmacro()
427macro(NCBI_disable_pch)
428    set(NCBI_${NCBI_PROJECT}_USEPCH OFF)
429endmacro()
430
431#############################################################################
432macro(NCBI_disable_pch_for)
433    set(NCBI_${NCBI_PROJECT}_NOPCH ${NCBI_${NCBI_PROJECT}_NOPCH} "${ARGV}")
434endmacro()
435
436#############################################################################
437macro(NCBI_set_pch_header)
438    set(NCBI_${NCBI_PROJECT}_PCH "${ARGV}")
439endmacro()
440
441#############################################################################
442macro(NCBI_set_pch_define)
443    set(NCBI_${NCBI_PROJECT}_PCH_DEFINE "${ARGV}")
444endmacro()
445
446#############################################################################
447macro(NCBI_set_dllentry)
448    set(NCBI_${NCBI_PROJECT}_DLLENTRY "${ARGV}")
449endmacro()
450
451#############################################################################
452macro(NCBI_set_guientry)
453    set(NCBI_${NCBI_PROJECT}_GUIENTRY "${ARGV}")
454endmacro()
455
456#############################################################################
457macro(NCBI_uses_toolkit_libraries)
458    set(NCBI_${NCBI_PROJECT}_NCBILIB ${NCBI_${NCBI_PROJECT}_NCBILIB} "${ARGV}")
459endmacro()
460
461#############################################################################
462macro(NCBI_uses_external_libraries)
463    set(NCBI_${NCBI_PROJECT}_EXTLIB ${NCBI_${NCBI_PROJECT}_EXTLIB} "${ARGV}")
464endmacro()
465
466#############################################################################
467macro(NCBI_add_include_directories)
468    set(NCBI_${NCBI_PROJECT}_INCLUDES ${NCBI_${NCBI_PROJECT}_INCLUDES} "${ARGV}")
469endmacro()
470
471#############################################################################
472macro(NCBI_add_definitions)
473    set(NCBI_${NCBI_PROJECT}_DEFINES ${NCBI_${NCBI_PROJECT}_DEFINES} "${ARGV}")
474endmacro()
475
476#############################################################################
477macro(NCBI_set_property _property _value)
478    set(NCBI_${NCBI_PROJECT}_PROPERTY_${_property} ${_value})
479endmacro()
480
481#############################################################################
482macro(NCBI_project_tags)
483    set(NCBI_${NCBI_PROJECT}_PROJTAG ${NCBI_${NCBI_PROJECT}_PROJTAG} "${ARGV}")
484endmacro()
485
486#############################################################################
487macro(NCBI_project_watchers)
488    set(NCBI_${NCBI_PROJECT}_WATCHER ${NCBI_${NCBI_PROJECT}_WATCHER} "${ARGV}")
489endmacro()
490
491#############################################################################
492#############################################################################
493#############################################################################
494macro(NCBI_begin_test)
495    if(DEFINED NCBI_${NCBI_PROJECT}_TEST)
496        message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}: Unexpected NCBI_begin_test call")
497    endif()
498    if (DEFINED NCBITEST_${NCBI_PROJECT}_NUM)
499        math(EXPR NCBITEST_${NCBI_PROJECT}_NUM "${NCBITEST_${NCBI_PROJECT}_NUM} + 1")
500    endif()
501    set(_testalias "")
502    if ("${ARGC}" GREATER "0")
503        set(_testname "${ARGV}")
504        set(_testalias "${_testname}")
505        if ( "${_testname}" STREQUAL "")
506            set(_testname "${NCBI_PROJECT}${NCBITEST_${NCBI_PROJECT}_NUM}")
507        endif()
508    else()
509        set(_testname "${NCBI_PROJECT}${NCBITEST_${NCBI_PROJECT}_NUM}")
510    endif()
511    set(NCBI_${NCBI_PROJECT}_TEST "${_testname}")
512    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_TESTALIAS "${_testalias}")
513    if (NOT DEFINED NCBITEST_${NCBI_PROJECT}_NUM)
514        set(NCBITEST_${NCBI_PROJECT}_NUM "1")
515    endif()
516endmacro()
517
518##############################################################################
519macro(NCBI_set_test_command)
520    set( _args ${ARGV})
521    list(GET _args 0 _cmd)
522    list(REMOVE_AT _args 0)
523    if ( "${_cmd}" STREQUAL "${NCBI_PROJECT}")
524        set(_cmd "${NCBI_${NCBI_PROJECT}_OUTPUT}")
525        if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "CONSOLEAPP" OR ${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "GUIAPP")
526           set(_cmd "${_cmd}${CMAKE_EXECUTABLE_SUFFIX}")
527        endif()
528    endif()
529    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_CMD "${_cmd}")
530    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_ARG "${_args}")
531endmacro()
532
533##############################################################################
534macro(NCBI_set_test_arguments)
535    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_ARG "${ARGV}")
536endmacro()
537
538##############################################################################
539macro(NCBI_set_test_assets)
540    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_ASSETS "${ARGV}")
541endmacro()
542
543##############################################################################
544macro(NCBI_set_test_timeout)
545    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_TIMEOUT "${ARGV}")
546endmacro()
547
548##############################################################################
549macro(NCBI_set_test_requires)
550    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_REQUIRES "${ARGV}")
551endmacro()
552
553##############################################################################
554macro(NCBI_set_test_resources)
555    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_RESOURCES "${ARGV}")
556endmacro()
557
558##############################################################################
559macro(NCBI_set_test_labels)
560    set(NCBITEST_${NCBI_${NCBI_PROJECT}_TEST}_LABELS "${ARGV}")
561endmacro()
562
563##############################################################################
564macro(NCBI_define_test_resource _name _amount)
565    if(DEFINED NCBITEST_RESOURCE_${_name}_AMOUNT)
566        message(SEND_ERROR "${NCBI_CURRENT_SOURCE_DIR}: Test resource ${_name} already defined")
567    endif()
568    set(NCBITEST_RESOURCE_${_name}_AMOUNT ${_amount})
569endmacro()
570
571##############################################################################
572macro(NCBI_end_test)
573    set(NCBI_${NCBI_PROJECT}_ALLTESTS ${NCBI_${NCBI_PROJECT}_ALLTESTS} ${NCBI_${NCBI_PROJECT}_TEST})
574    unset(NCBI_${NCBI_PROJECT}_TEST)
575endmacro()
576
577##############################################################################
578macro(NCBI_add_test)
579    if ("${ARGC}" GREATER "0")
580        set(_cmd "${ARGV}")
581        if ( "${_cmd}" STREQUAL "")
582            set(_cmd "${NCBI_PROJECT}")
583        endif()
584    else()
585        set(_cmd "${NCBI_PROJECT}")
586    endif()
587    NCBI_begin_test()
588    NCBI_set_test_command(${_cmd})
589    NCBI_end_test()
590endmacro()
591
592##############################################################################
593function(NCBI_import_hostinfo _file)
594    if(NOT EXISTS ${_file})
595        return()
596    endif()
597    file(STRINGS ${_file} _hostinfo)
598    if (NOT "${_hostinfo}" STREQUAL "")
599        foreach( _item IN LISTS _hostinfo)
600            string(REPLACE " " ";" _item ${_item})
601            if (NOT "${_item}" STREQUAL "")
602                list(GET _item 0 _prj)
603                list(GET _item 1 _host)
604                set_property(GLOBAL PROPERTY NCBI_PTBPROP_HOST_${_prj} ${_host})
605            endif()
606        endforeach()
607    endif()
608endfunction()
609
610##############################################################################
611function(NCBI_register_hook _event _callback)
612    if("${_event}" STREQUAL "TARGET_PARSED")
613        variable_watch(NCBI_PTB_CALLBACK_TARGET_PARSED ${_callback})
614    elseif("${_event}" STREQUAL "ALL_PARSED")
615        variable_watch(NCBI_PTB_CALLBACK_ALL_PARSED ${_callback})
616    elseif("${_event}" STREQUAL "COLLECTED")
617        variable_watch(NCBI_PTB_CALLBACK_COLLECTED ${_callback})
618    elseif("${_event}" STREQUAL "TARGET_ADDED")
619        variable_watch(NCBI_PTB_CALLBACK_TARGET_ADDED ${_callback})
620    elseif("${_event}" STREQUAL "ALL_ADDED")
621        variable_watch(NCBI_PTB_CALLBACK_ALL_ADDED ${_callback})
622    elseif("${_event}" STREQUAL "DATASPEC")
623        if ("${ARGC}" LESS "3")
624            message(FATAL_ERROR "DATASPEC hook requires a list of file extensions (${_callback})")
625        endif()
626        foreach( _ext IN LISTS ARGV2)
627            string(TOLOWER ${_ext} _ext)
628            variable_watch(NCBI_PTB_CALLBACK_DATASPEC${_ext} ${_callback})
629        endforeach()
630    else()
631        message(SEND_ERROR "An attempt to register hook for an unknown event: ${_event} (${_callback})")
632    endif()
633endfunction()
634
635##############################################################################
636macro(NCBI_util_elapsed _value)
637    if(DEFINED NCBI_TIMESTAMP_START)
638        string(TIMESTAMP _curtime "%s")
639        math(EXPR _delta "${_curtime} - ${NCBI_TIMESTAMP_START}")
640        string(TIMESTAMP _curtime "%H:%M:%S")
641        set(${_value} "${_curtime} (${_delta}s)")
642    else()
643        string(TIMESTAMP ${_value} "%H:%M:%S")
644    endif()
645endmacro()
646
647##############################################################################
648macro(NCBI_util_parse_sign _input _value _negative)
649    string(SUBSTRING ${_input} 0 1 _sign)
650    if ("${_sign}" STREQUAL "-")
651        string(SUBSTRING ${_input} 1 -1 ${_value})
652        set(${_negative} ON)
653    else()
654        set(${_value} ${_input})
655        set(${_negative} OFF)
656    endif()
657endmacro()
658
659##############################################################################
660macro(NCBI_util_get_value _value _result)
661    if (DEFINED NCBI_${NCBI_PROJECT}_${_value})
662        set(${_result} ${NCBI_${NCBI_PROJECT}_${_value}})
663    elseif (DEFINED NCBI__${_value})
664        set(${_result} ${NCBI__${_value}})
665    else()
666        set(${_result} ${NCBI_DEFAULT_${_value}})
667    endif()
668endmacro()
669
670##############################################################################
671function(NCBI_util_match_path _value _pattern _result)
672    file(RELATIVE_PATH _rel_value "${NCBI_SRC_ROOT}" "${_value}")
673    file(RELATIVE_PATH _rel_pattern "${NCBI_SRC_ROOT}" "${_pattern}")
674    if ("${_rel_value}" MATCHES "^${_rel_pattern}")
675        set(${_result} TRUE PARENT_SCOPE)
676    else()
677        set(${_result} FALSE PARENT_SCOPE)
678    endif()
679endfunction()
680
681##############################################################################
682##############################################################################
683##############################################################################
684set_property(GLOBAL PROPERTY NCBI_PTBPROP_ALLOWED_PROJECTS "")
685
686macro(NCBI_internal_analyze_tree)
687    if (NCBI_PTB_HAS_ROOT)
688        message(FATAL_ERROR "Unexpected call to NCBI_internal_analyze_tree (${NCBI_CURRENT_SOURCE_DIR})")
689        return()
690    endif()
691    set(NCBI_PTB_HAS_ROOT TRUE PARENT_SCOPE)
692    set(NCBI_PTB_HAS_ROOT TRUE)
693    foreach( _type IN ITEMS CONSOLEAPP GUIAPP STATIC SHARED CUSTOM)
694        set_property(GLOBAL PROPERTY NCBI_PTBPROP_TOTAL_${_type} 0)
695        set_property(GLOBAL PROPERTY NCBI_PTBPROP_COUNT_${_type} 0)
696    endforeach()
697
698    if( "${NCBI_PTBCFG_PROJECT_TARGETS}" STREQUAL "" AND
699        "${NCBI_PTBCFG_PROJECT_TAGS}" STREQUAL "" AND
700        "${NCBI_PTBCFG_PROJECT_LIST}" STREQUAL "" AND
701        NOT DEFINED NCBI_EXTERNAL_TREE_ROOT)
702        set(NCBI_PTB_NOFILTERS TRUE)
703    endif()
704    if (NCBI_PTBCFG_ENABLE_COLLECTOR AND NCBI_PTB_NOFILTERS AND NOT NCBI_PTBCFG_ALLOW_COMPOSITE)
705        set(NCBI_PTBCFG_ENABLE_COLLECTOR FALSE)
706        set(NCBI_PTBCFG_ENABLE_COLLECTOR FALSE PARENT_SCOPE)
707    endif()
708
709    if(NCBI_PTBCFG_ENABLE_COLLECTOR)
710        if(NOT DEFINED NCBI_PTBCFG_KNOWN_FOLDERS OR "${NCBI_PTBCFG_KNOWN_FOLDERS}" STREQUAL "")
711            file(GLOB _files LIST_DIRECTORIES TRUE "${NCBI_CURRENT_SOURCE_DIR}/*")
712            foreach(_file IN LISTS _files)
713                if(IS_DIRECTORY ${_file} AND EXISTS ${_file}/CMakeLists.txt)
714                    get_filename_component(_basename ${_file} NAME)
715                    list(APPEND NCBI_PTBCFG_KNOWN_FOLDERS ${_basename})
716                endif()
717            endforeach()
718        endif()
719        list(LENGTH NCBI_PTBCFG_KNOWN_FOLDERS _count)
720        if(NOT ${_count} EQUAL 1)
721            set(NCBI_PTB_THIS_SRC_ROOT ${NCBI_SRC_ROOT} PARENT_SCOPE)
722            set(NCBI_PTB_THIS_SRC_ROOT ${NCBI_SRC_ROOT})
723        endif()
724
725        NCBI_util_elapsed(_elapsed)
726        message("${_elapsed}: Analyzing source tree...")
727        set_property(GLOBAL PROPERTY NCBI_PTBPROP_ALL_PROJECTS "")
728
729        set(NCBI_PTBMODE_COLLECT_DEPS ON)
730        set(_known ${NCBI_PTBCFG_KNOWN_FOLDERS})
731        unset(NCBI_PTBCFG_KNOWN_FOLDERS)
732        NCBI_add_subdirectory(${_known})
733        set(NCBI_PTB_CALLBACK_ALL_PARSED TRUE)
734        set(NCBI_PTBMODE_COLLECT_DEPS OFF)
735
736        get_property(_allprojects     GLOBAL PROPERTY NCBI_PTBPROP_ALL_PROJECTS)
737        get_property(_allowedprojects GLOBAL PROPERTY NCBI_PTBPROP_ALLOWED_PROJECTS)
738
739        if(OFF)
740            message("NCBI_PTBPROP_ALL_PROJECTS: ${_allprojects}")
741            foreach(_prj IN LISTS _allprojects)
742                get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_prj})
743                message("NCBI_PTBPROP_DEPS_${_prj}: ${_prjdeps}")
744            endforeach()
745            message("NCBI_PTBPROP_ALLOWED_PROJECTS: ${_allowedprojects}")
746        endif()
747
748        if("${_allowedprojects}" STREQUAL "")
749            message(FATAL_ERROR "List of projects is empty")
750            return()
751        endif()
752
753        NCBI_util_elapsed(_elapsed)
754        message("${_elapsed}: Collecting projects...")
755        list(REMOVE_DUPLICATES _allowedprojects)
756        foreach(_prj IN LISTS _allowedprojects)
757            NCBI_internal_collect_dependencies(${_prj})
758            get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_prj})
759            get_property(_host GLOBAL PROPERTY NCBI_PTBPROP_HOST_${_prj})
760            set(NCBI_PTB_ALLOWED_PROJECTS ${NCBI_PTB_ALLOWED_PROJECTS} ${_host} ${_prj} ${_prjdeps})
761        endforeach()
762        list(SORT NCBI_PTB_ALLOWED_PROJECTS)
763        list(REMOVE_DUPLICATES NCBI_PTB_ALLOWED_PROJECTS)
764
765        if(NCBI_PTBCFG_ALLOW_COMPOSITE)
766            set(_allowedprojects ${NCBI_PTB_ALLOWED_PROJECTS})
767            foreach(_prj IN LISTS _allowedprojects)
768                NCBI_internal_collect_dependencies(${_prj})
769                get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_prj})
770                get_property(_host GLOBAL PROPERTY NCBI_PTBPROP_HOST_${_prj})
771                set(NCBI_PTB_ALLOWED_PROJECTS ${NCBI_PTB_ALLOWED_PROJECTS} ${_host} ${_prj} ${_prjdeps})
772            endforeach()
773            list(SORT NCBI_PTB_ALLOWED_PROJECTS)
774            list(REMOVE_DUPLICATES NCBI_PTB_ALLOWED_PROJECTS)
775        endif()
776        if(NOT NCBI_PTB_NOFILTERS)
777            foreach(_prj IN LISTS NCBI_PTB_ALLOWED_PROJECTS)
778                get_property(_dir GLOBAL PROPERTY NCBI_PTBPROP_DIR_${_prj})
779                list(APPEND NCBI_PTB_ALLOWED_DIRS ${_dir})
780            endforeach()
781            list(SORT NCBI_PTB_ALLOWED_DIRS)
782            list(REMOVE_DUPLICATES NCBI_PTB_ALLOWED_DIRS)
783            set(NCBI_PTB_ALLOWED_DIRS ${NCBI_PTB_ALLOWED_DIRS} PARENT_SCOPE)
784        endif()
785
786        if(OFF)
787            message("NCBI_PTB_ALLOWED_PROJECTS: ${NCBI_PTB_ALLOWED_PROJECTS}")
788            foreach(_prj IN LISTS NCBI_PTB_ALLOWED_PROJECTS)
789                get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_prj})
790                message("NCBI_PTBPROP_DEPS_${_prj}: ${_prjdeps}")
791            endforeach()
792        endif()
793
794        foreach(_prj IN LISTS NCBI_PTB_ALLOWED_PROJECTS)
795            NCBI_internal_collect_requires(${_prj})
796        endforeach()
797        set(NCBI_PTB_CALLBACK_COLLECTED TRUE)
798        foreach(_prj IN LISTS NCBI_PTB_ALLOWED_PROJECTS)
799            if (NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${_prj})
800                NCBI_internal_print_project_info(${_prj})
801            endif()
802        endforeach()
803
804        set(NCBI_PTB_ALLOWED_PROJECTS ${NCBI_PTB_ALLOWED_PROJECTS} PARENT_SCOPE)
805    else()
806        message("Source tree analysis skipped")
807    endif()
808    NCBI_util_elapsed(_elapsed)
809    message("${_elapsed}: Configuring projects...")
810    variable_watch(CMAKE_CURRENT_LIST_DIR NCBI_internal_end_of_config)
811endmacro()
812
813#############################################################################
814function(NCBI_internal_end_of_config _variable _access _value)
815    if(NOT "${_access}" STREQUAL "MODIFIED_ACCESS" OR NOT "${_value}" STREQUAL "")
816        return()
817    endif()
818    set(NCBI_PTB_CALLBACK_ALL_ADDED TRUE)
819    NCBI_internal_print_report("Processed" TOTAL)
820    NCBI_internal_print_report("Added" COUNT)
821    NCBI_util_elapsed(_elapsed)
822    message("${_elapsed}: Done")
823endfunction()
824
825#############################################################################
826function(NCBI_internal_collect_dependencies _project)
827    get_property(_collected GLOBAL PROPERTY NCBI_PTBPROP_COLLECTED_DEPS)
828    if( ${_project} IN_LIST _collected)
829        return()
830    endif()
831    set_property(GLOBAL PROPERTY NCBI_PTBPROP_COLLECTED_DEPS ${_collected} ${_project})
832
833    get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${_project} SET)
834    if (NOT _prjdeps)
835        if(NOT TARGET ${_project})
836            message("ERROR: project ${_project} not found")
837        endif()
838        return()
839    endif()
840    get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${_project})
841    foreach( _value IN LISTS _prjdeps)
842        NCBI_internal_recur_collect_dependencies( ${_project} ${_value})
843    endforeach()
844    get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_project})
845    foreach( _value IN LISTS _prjdeps)
846        get_property(_host GLOBAL PROPERTY NCBI_PTBPROP_HOST_${_value})
847        if ("${_host}" STREQUAL "")
848            list(APPEND _deps ${_value})
849        elseif( NOT "${_host}" STREQUAL "${_project}")
850            list(APPEND _deps ${_host})
851        endif()
852    endforeach()
853    if (NOT "${_deps}" STREQUAL "")
854        list(SORT _deps)
855        list(REMOVE_DUPLICATES _deps)
856        list(REMOVE_ITEM _deps ${_project})
857    endif()
858    set_property(GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_project} "${_deps}")
859endfunction()
860
861##############################################################################
862function(NCBI_internal_recur_collect_dependencies _project _dep)
863    get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_project})
864    get_property(_depdeps GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${_dep} SET)
865    if (NOT _depdeps)
866        if(NOT TARGET ${_dep})
867            message("ERROR: project ${_dep} not found (${_project} requires it)")
868            set_property(GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_project} ${_dep})
869        endif()
870        return()
871    endif()
872    get_property(_depdeps GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${_dep})
873    foreach( _value IN LISTS _dep _depdeps)
874        NCBI_internal_collect_dependencies(${_value})
875        get_property(_valuedeps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_value})
876        set(_prjdeps ${_prjdeps} ${_value} ${_valuedeps})
877    endforeach()
878    if (NOT "${_prjdeps}" STREQUAL "")
879        list(SORT _prjdeps)
880        list(REMOVE_DUPLICATES _prjdeps)
881        list(REMOVE_ITEM _prjdeps ${_project})
882    endif()
883    set_property(GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_project} ${_prjdeps})
884endfunction()
885
886##############################################################################
887function(NCBI_internal_collect_requires _project)
888    set(_implreq "")
889    get_property(_y GLOBAL PROPERTY NCBI_PTBPROP_REQUIRES_${_project})
890    list(APPEND _implreq "${_y}")
891    get_property(_deps GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_project})
892    if (NOT "${_deps}" STREQUAL "")
893        list(REMOVE_DUPLICATES _deps)
894        foreach(_dep IN LISTS _deps)
895            get_property(_y GLOBAL PROPERTY NCBI_PTBPROP_REQUIRES_${_dep})
896            list(APPEND _implreq "${_y}")
897        endforeach()
898    endif()
899    if (NOT "${_implreq}" STREQUAL "")
900        list(SORT _implreq)
901        list(REMOVE_DUPLICATES _implreq)
902        set_property(GLOBAL PROPERTY NCBI_PTBPROP_IMPLREQ_${_project} ${_implreq})
903    endif()
904endfunction()
905
906##############################################################################
907function(NCBI_internal_include)
908    include(${ARGV0})
909endfunction()
910
911##############################################################################
912function(NCBI_internal_collect_sources)
913    set(_dir ${NCBI_CURRENT_SOURCE_DIR})
914    if(NCBI_PTBMODE_PARTS)
915        set(_prefix "Hosted Libraries\\${NCBI_PROJECT_PARTNAME}\\")
916    else()
917        set(_prefix "")
918    endif()
919    set(_c_ext ".c")
920    set(_cpp_ext ".cpp;.cxx;.cc;.c++")
921    set(_sources "")
922    set(_nopch "")
923    set(_ex "")
924
925    if (NOT NCBI_PTBMODE_PARTS)
926        if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "SHARED")
927            NCBI_util_get_value(DLLENTRY _entry)
928            if (NOT "${_entry}" STREQUAL "")
929                list(APPEND _ex ${_entry})
930            endif()
931        endif()
932        if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "GUIAPP")
933            NCBI_util_get_value(GUIENTRY _entry)
934            if (NOT "${_entry}" STREQUAL "")
935                list(APPEND _ex ${_entry})
936            endif()
937        endif()
938    endif()
939
940    foreach(_file IN LISTS NCBI_${NCBI_PROJECT}_SOURCES _ex)
941        if(EXISTS ${_dir}/${_file} AND NOT IS_DIRECTORY ${_dir}/${_file})
942            set(_file "${_dir}/${_file}")
943        else()
944            foreach(_ext IN LISTS _c_ext _cpp_ext)
945                if(EXISTS ${_dir}/${_file}${_ext})
946                    set(_file "${_dir}/${_file}${_ext}")
947                    break()
948                endif()
949            endforeach()
950        endif()
951        list(APPEND _sources "${_file}")
952    endforeach()
953
954    foreach(_file IN LISTS NCBI_${NCBI_PROJECT}_GENERATED_SOURCES)
955        if(NOT IS_ABSOLUTE ${_file})
956            set(_file "${_dir}/${_file}")
957        endif()
958        list(APPEND _sources "${_file}")
959        set_source_files_properties(${_file} PROPERTIES GENERATED TRUE)
960    endforeach()
961
962    foreach(_file IN LISTS NCBI_${NCBI_PROJECT}_NOPCH)
963        if(EXISTS ${_dir}/${_file} AND NOT IS_DIRECTORY ${_dir}/${_file})
964            set(_file "${_dir}/${_file}")
965        else()
966            foreach(_ext IN LISTS _c_ext _cpp_ext)
967                if(EXISTS ${_dir}/${_file}${_ext})
968                    set(_file "${_dir}/${_file}${_ext}")
969                    break()
970                endif()
971            endforeach()
972        endif()
973        list(APPEND _nopch   "${_file}")
974    endforeach()
975    foreach(_file IN LISTS _sources)
976        get_filename_component(_fext ${_file} EXT)
977        foreach(_ext IN LISTS _c_ext)
978            if("${_fext}" STREQUAL "${_ext}")
979                list(APPEND _nopch "${_file}")
980            endif()
981        endforeach()
982    endforeach()
983    if(NOT "${_nopch}" STREQUAL "")
984        list(REMOVE_DUPLICATES _nopch)
985    endif()
986
987    if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
988        message("create source group  ${_prefix}Source Files")
989        message("${_sources}")
990    endif()
991    source_group("${_prefix}Source Files"   FILES ${_sources})
992    set(NCBITMP_PROJECT_SOURCES ${NCBITMP_PROJECT_SOURCES} ${_sources} PARENT_SCOPE)
993    set(NCBITMP_PROJECT_NOPCH   ${NCBITMP_PROJECT_NOPCH}   ${_nopch}   PARENT_SCOPE)
994endfunction()
995
996##############################################################################
997function(NCBI_internal_collect_headers)
998
999    file(RELATIVE_PATH _rel "${NCBI_SRC_ROOT}" "${NCBI_CURRENT_SOURCE_DIR}")
1000    if (NOT "${NCBI_INC_ROOT}" STREQUAL "${NCBI_SRC_ROOT}")
1001        set(_inc_dir ${NCBI_INC_ROOT}/${_rel})
1002    else()
1003        set(_inc_dir "")
1004    endif()
1005    if(NCBI_PTBMODE_PARTS)
1006        set(_prefix "Hosted Libraries\\${NCBI_PROJECT_PARTNAME}\\")
1007    else()
1008        set(_prefix "")
1009    endif()
1010    NCBI_util_get_value(HEADERS _headers)
1011
1012    if (MSVC_IDE OR XCODE)
1013        set(_priv "")
1014        set(_pub "")
1015        set(_inl "")
1016        if ( NOT "${_headers}" STREQUAL "")
1017            foreach(_mask IN LISTS _headers)
1018                file(GLOB _files LIST_DIRECTORIES false "${NCBI_CURRENT_SOURCE_DIR}/${_mask}")
1019                set(_priv ${_priv} ${_files})
1020                if (NOT "${_inc_dir}" STREQUAL "")
1021                    if (${_mask} MATCHES "[.]inl$")
1022                        file(GLOB _files LIST_DIRECTORIES false "${_inc_dir}/${_mask}")
1023                        set(_inl ${_inl} ${_files})
1024                    else()
1025                        file(GLOB _files LIST_DIRECTORIES false "${_inc_dir}/${_mask}")
1026                        set(_pub ${_pub} ${_files})
1027                    endif()
1028                endif()
1029            endforeach()
1030
1031            if ( NOT "${_priv}" STREQUAL "")
1032                source_group("${_prefix}Private Headers" FILES ${_priv})
1033            endif()
1034            if ( NOT "${_pub}" STREQUAL "")
1035                source_group("${_prefix}Header Files"    FILES ${_pub})
1036            endif()
1037            if ( NOT "${_inl}" STREQUAL "")
1038                source_group("${_prefix}Inline Files"    FILES ${_inl})
1039            endif()
1040        endif()
1041        set(NCBITMP_PROJECT_HEADERS ${NCBITMP_PROJECT_HEADERS} ${_priv} ${_pub} ${_inl} PARENT_SCOPE)
1042    else()
1043        set(NCBITMP_PROJECT_HEADERS "" PARENT_SCOPE)
1044    endif()
1045endfunction()
1046
1047##############################################################################
1048function(NCBI_internal_add_resources)
1049    if (WIN32)
1050        if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "CONSOLEAPP" OR ${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "GUIAPP")
1051            NCBI_util_get_value(RESOURCES _res)
1052        else()
1053            if (DEFINED NCBI_${NCBI_PROJECT}_RESOURCES)
1054                set(_res ${NCBI_${NCBI_PROJECT}_RESOURCES})
1055            else()
1056                set(_res "")
1057            endif()
1058        endif()
1059
1060        if(NCBI_PTBMODE_PARTS)
1061            set(_prefix "Hosted Libraries\\${NCBI_PROJECT_PARTNAME}\\")
1062        else()
1063            set(_prefix "")
1064        endif()
1065        if ( NOT "${_res}" STREQUAL "")
1066            source_group("${_prefix}Resource Files" FILES ${_res})
1067        endif()
1068        set(NCBITMP_PROJECT_RESOURCES ${_res} PARENT_SCOPE)
1069    else()
1070        set(NCBITMP_PROJECT_RESOURCES "" PARENT_SCOPE)
1071    endif()
1072endfunction()
1073
1074##############################################################################
1075function(NCBI_internal_collect_dataspec)
1076    if (NOT DEFINED NCBI_${NCBI_PROJECT}_DATASPEC)
1077        return()
1078    endif()
1079
1080    if(NCBI_PTBMODE_PARTS)
1081        set(_prefix "Hosted Libraries\\${NCBI_PROJECT_PARTNAME}\\")
1082    else()
1083        set(_prefix "")
1084    endif()
1085
1086    foreach(_dataspec IN LISTS NCBI_${NCBI_PROJECT}_DATASPEC)
1087        if (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/${_dataspec})
1088            get_filename_component(_ext ${_dataspec} EXT)
1089            set(_input DATASPEC ${NCBI_CURRENT_SOURCE_DIR}/${_dataspec} REQUIRES ${NCBITMP_REQUIRE} ${NCBITMP_COMPONENTS} RETURN _output)
1090            string(TOLOWER ${_ext} _ext)
1091            set( NCBI_PTB_CALLBACK_DATASPEC${_ext} ${_input})
1092            cmake_parse_arguments(DT "" "DATASPEC" "SOURCES;HEADERS;INCLUDE" ${_output})
1093            set(_specfiles ${_specfiles} ${DT_DATASPEC})
1094            set(_srcfiles ${_srcfiles} ${DT_SOURCES})
1095            set(_incfiles ${_incfiles} ${DT_HEADERS})
1096        else()
1097            message(SEND_ERROR "file not found: ${NCBI_CURRENT_SOURCE_DIR}/${_dataspec}")
1098        endif()
1099    endforeach()
1100
1101    set_source_files_properties(${_srcfiles} ${_incfiles} PROPERTIES GENERATED TRUE)
1102    source_group("${_prefix}Source Files"   FILES ${_srcfiles})
1103    set(NCBITMP_PROJECT_SOURCES ${NCBITMP_PROJECT_SOURCES} ${_srcfiles} PARENT_SCOPE)
1104    source_group("${_prefix}Header Files"   FILES ${_incfiles})
1105    set(NCBITMP_PROJECT_HEADERS ${NCBITMP_PROJECT_HEADERS} ${_incfiles} PARENT_SCOPE)
1106    source_group("${_prefix}DataSpec Files" FILES ${_specfiles})
1107    set(NCBITMP_PROJECT_DATASPEC ${NCBITMP_PROJECT_DATASPEC} ${_specfiles} PARENT_SCOPE)
1108endfunction()
1109
1110##############################################################################
1111function(NCBI_internal_add_dataspec)
1112    if (NOT DEFINED NCBITMP_PROJECT_DATASPEC)
1113        return()
1114    endif()
1115    foreach(_dataspec IN LISTS NCBITMP_PROJECT_DATASPEC)
1116        get_filename_component(_ext ${_dataspec} EXT)
1117        set(_input GENERATE DATASPEC ${_dataspec} REQUIRES ${NCBITMP_REQUIRE} ${NCBITMP_COMPONENTS} RETURN _output)
1118        string(TOLOWER ${_ext} _ext)
1119        set( NCBI_PTB_CALLBACK_DATASPEC${_ext} ${_input})
1120        cmake_parse_arguments(DT "" "DATASPEC" "SOURCES;HEADERS;INCLUDE" ${_output})
1121        if(NOT "${DT_INCLUDE}" STREQUAL "")
1122            set(NCBITMP_INCLUDES ${NCBITMP_INCLUDES} ${DT_INCLUDE} PARENT_SCOPE)
1123        endif()
1124    endforeach()
1125endfunction()
1126
1127##############################################################################
1128function(NCBI_internal_define_precompiled_header_usage)
1129
1130    NCBI_util_get_value(USEPCH _usepch)
1131    NCBI_util_get_value(PCH _pch)
1132    NCBI_util_get_value(PCH_DEFINE _pchdef)
1133
1134if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1135    message("_usepch ${_usepch}:  prj=${NCBI_${NCBI_PROJECT}_USEPCH} dir=${NCBI__USEPCH} def=${NCBI_DEFAULT_USEPCH}")
1136    message("_pch ${_pch}:  prj=${NCBI_${NCBI_PROJECT}_PCH} dir=${NCBI__PCH} def=${NCBI_DEFAULT_PCH}")
1137    message("_pchdef ${_pchdef}")
1138endif()
1139
1140    if (NOT DEFINED NCBITMP_PROJECT_SOURCES)
1141        set(_usepch OFF)
1142    endif()
1143
1144    if (_usepch)
1145        if (MSVC)
1146            set_target_properties(${NCBI_PROJECT} PROPERTIES COMPILE_FLAGS "/Yu${_pch}")
1147            set(_files ${NCBITMP_PROJECT_SOURCES})
1148            if (DEFINED NCBITMP_PROJECT_NOPCH)
1149                foreach(_file IN LISTS NCBITMP_PROJECT_NOPCH)
1150                    list(REMOVE_ITEM _files ${_file})
1151                    set_source_files_properties(${_file} PROPERTIES COMPILE_FLAGS "/Y-")
1152                endforeach()
1153            endif()
1154
1155            if ("${_files}" STREQUAL "")
1156                return()
1157            endif()
1158            list(GET _files 0 _pchfile)
1159            get_filename_component(_pchname ${_pchfile} NAME)
1160            foreach(_file IN LISTS _files)
1161                get_filename_component(_name ${_file} NAME)
1162                if (${_name} STRLESS ${_pchname})
1163                    set(_pchname ${_name})
1164                    set(_pchfile ${_file})
1165                endif()
1166                set_source_files_properties(${_file} PROPERTIES COMPILE_DEFINITIONS ${_pchdef})
1167            endforeach()
1168            set_source_files_properties(${_pchfile} PROPERTIES COMPILE_FLAGS "/Yc${_pch}")
1169
1170        elseif (XCODE)
1171
1172            if (EXISTS ${NCBI_CURRENT_SOURCE_DIR}/${_pch})
1173                set(_pch ${NCBI_CURRENT_SOURCE_DIR}/${_pch})
1174            elseif (EXISTS ${NCBI_INC_ROOT}/${_pch})
1175                set(_pch ${NCBI_INC_ROOT}/${_pch})
1176            else()
1177                file(RELATIVE_PATH _rel "${NCBI_SRC_ROOT}" "${NCBI_CURRENT_SOURCE_DIR}")
1178                if (EXISTS "${NCBI_INC_ROOT}/${_rel}/${_pch}")
1179                    set(_pch "${NCBI_INC_ROOT}/${_rel}/${_pch}")
1180                else()
1181#                    message(WARNING "ERROR: in project ${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT}, precompiled header ${_pch} was not found.")
1182                    set(_usepch NO)
1183                endif()
1184            endif()
1185            if (_usepch)
1186                set_target_properties(${NCBI_PROJECT} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES")
1187                set_target_properties(${NCBI_PROJECT} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${_pch}")
1188            endif()
1189        endif()
1190    endif()
1191endfunction()
1192
1193##############################################################################
1194function(NCBI_internal_install_component_files _comp)
1195    if (NOT DEFINED NCBI_COMPONENT_${_comp}_BINPATH)
1196        return()
1197    endif()
1198
1199    set(_rt ${NCBI_CONFIGURATION_RUNTIMELIB})
1200    foreach(_cfg IN LISTS NCBI_CONFIGURATION_TYPES)
1201        if (DEFINED NCBI_COMPONENT_${_comp}_BINPATH_${_cfg}${_rt})
1202            set(_src ${NCBI_COMPONENT_${_comp}_BINPATH_${_cfg}${_rt}})
1203        elseif (DEFINED NCBI_COMPONENT_${_comp}_BINPATH_${_cfg})
1204            set(_src ${NCBI_COMPONENT_${_comp}_BINPATH_${_cfg}})
1205        elseif (DEFINED NCBI_COMPONENT_${_comp}_BINPATH)
1206            if (IS_DIRECTORY ${NCBI_COMPONENT_${_comp}_BINPATH}/${_cfg}${_rt})
1207                set(_src ${NCBI_COMPONENT_${_comp}_BINPATH}/${_cfg}${_rt})
1208            elseif (IS_DIRECTORY ${NCBI_COMPONENT_${_comp}_BINPATH}/${_cfg})
1209                set(_src ${NCBI_COMPONENT_${_comp}_BINPATH}/${_cfg})
1210            else()
1211                set(_src ${NCBI_COMPONENT_${_comp}_BINPATH})
1212            endif()
1213        else()
1214            continue()
1215        endif()
1216        if (IS_DIRECTORY ${_src})
1217            file(GLOB _files LIST_DIRECTORIES false "${_src}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
1218            foreach(_file IN LISTS _files)
1219#message("============ COPY ${_file}  DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_cfg}")
1220                file(COPY ${_file}  DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_cfg})
1221            endforeach()
1222        endif()
1223    endforeach()
1224endfunction()
1225
1226##############################################################################
1227macro(NCBI_internal_process_project_requires)
1228    set(NCBITMP_REQUIRE_NOTFOUND "")
1229    if(NCBI_PTBMODE_PARTS)
1230        set(_all ${NCBI__REQUIRES} ${NCBI_${NCBI_PROJECT}_REQUIRES})
1231    else()
1232        set(_all ${NCBI__REQUIRES} ${NCBI_${NCBI_PROJECT}_REQUIRES} ${NCBITMP_PROJECT_REQUIRES})
1233    endif()
1234    if (NOT "${_all}" STREQUAL "")
1235        list(REMOVE_DUPLICATES _all)
1236    endif()
1237
1238    set(NCBITMP_REQUIRE ${_all})
1239    if(NCBI_PTBMODE_COLLECT_DEPS)
1240        set_property(GLOBAL PROPERTY NCBI_PTBPROP_REQUIRES_${NCBI_PROJECT} ${_all})
1241    endif()
1242
1243    foreach(_req IN LISTS _all)
1244        NCBI_util_parse_sign(${_req} _value _negate)
1245        if(${_value} IN_LIST NCBI_ALL_LEGACY)
1246            if (NOT NCBI_PTBMODE_COLLECT_DEPS)
1247                message(SEND_ERROR "${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}) component name ${_value} is deprecated, use ${NCBI_COMPONENT_${_value}_FOUND} instead")
1248            endif()
1249            set(_value ${NCBI_COMPONENT_${_value}_FOUND})
1250        endif()
1251        if (${_value} OR NCBI_REQUIRE_${_value}_FOUND OR NCBI_COMPONENT_${_value}_FOUND)
1252            if (_negate)
1253                set(NCBITMP_REQUIRE_NOTFOUND ${NCBITMP_REQUIRE_NOTFOUND} ${_req})
1254            else()
1255#                set(NCBITMP_INCLUDES ${NCBITMP_INCLUDES} ${NCBI_COMPONENT_${_value}_INCLUDE})
1256                set(NCBITMP_INCLUDES_SYSTEM ${NCBITMP_INCLUDES_SYSTEM} ${NCBI_COMPONENT_${_value}_INCLUDE})
1257                set(NCBITMP_DEFINES  ${NCBITMP_DEFINES}  ${NCBI_COMPONENT_${_value}_DEFINES})
1258                set(NCBITMP_EXTLIB   ${NCBITMP_EXTLIB}   ${NCBI_COMPONENT_${_value}_LIBS})
1259                foreach(_lib IN LISTS NCBI_COMPONENT_${_value}_NCBILIB)
1260                    if(NOT ${_lib} STREQUAL ${NCBI_${NCBI_PROJECT}_OUTPUT})
1261                        set(NCBITMP_NCBILIB  ${NCBITMP_NCBILIB}  ${_lib})
1262                    endif()
1263                endforeach()
1264                if (WIN32 AND NOT NCBI_PTBMODE_COLLECT_DEPS)
1265                    NCBI_internal_install_component_files(${_value})
1266                endif()
1267            endif()
1268        else()
1269            if (_negate)
1270# no-no, this is a mistake
1271#        set(NCBITMP_INCLUDES ${NCBITMP_INCLUDES} ${NCBI_COMPONENT_${_value}_INCLUDE})
1272#        set(NCBITMP_DEFINES  ${NCBITMP_DEFINES}  ${NCBI_COMPONENT_${_value}_DEFINES})
1273#        set(NCBITMP_EXTLIB     ${NCBITMP_EXTLIB}     ${NCBI_COMPONENT_${_value}_LIBS})
1274            else()
1275                set(NCBITMP_REQUIRE_NOTFOUND ${NCBITMP_REQUIRE_NOTFOUND} ${_req})
1276            endif()
1277        endif()
1278    endforeach()
1279
1280    if (NOT NCBI_PTBMODE_COLLECT_DEPS AND NOT ${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "STATIC")
1281        get_property(_all GLOBAL PROPERTY NCBI_PTBPROP_IMPLREQ_${NCBI_PROJECT})
1282        foreach(_req IN LISTS _all)
1283            NCBI_util_parse_sign(${_req} _value _negate)
1284            if (${_value} OR NCBI_REQUIRE_${_value}_FOUND OR NCBI_COMPONENT_${_value}_FOUND)
1285                if (_negate)
1286                    set(NCBITMP_REQUIRE_NOTFOUND ${NCBITMP_REQUIRE_NOTFOUND} ${_req})
1287                endif()
1288            else()
1289                if (NOT _negate)
1290                    set(NCBITMP_REQUIRE_NOTFOUND ${NCBITMP_REQUIRE_NOTFOUND} ${_req})
1291                endif()
1292            endif()
1293        endforeach()
1294    endif()
1295
1296    if (NOT "${NCBITMP_REQUIRE_NOTFOUND}" STREQUAL "")
1297        list(REMOVE_DUPLICATES NCBITMP_REQUIRE_NOTFOUND)
1298    endif()
1299endmacro()
1300
1301##############################################################################
1302macro(NCBI_internal_process_project_components)
1303    set(NCBITMP_COMPONENT_NOTFOUND "")
1304    if(NCBI_PTBMODE_PARTS)
1305        set(_all ${NCBI__COMPONENTS} ${NCBI_${NCBI_PROJECT}_COMPONENTS})
1306    else()
1307        set(_all ${NCBI__COMPONENTS} ${NCBI_${NCBI_PROJECT}_COMPONENTS} ${NCBITMP_PROJECT_COMPONENTS})
1308    endif()
1309    if (NOT "${_all}" STREQUAL "")
1310        list(REMOVE_DUPLICATES _all)
1311    endif()
1312
1313    set(NCBITMP_COMPONENTS ${_all})
1314    if(NCBI_PTBMODE_COLLECT_DEPS)
1315        set_property(GLOBAL PROPERTY NCBI_PTBPROP_COMPONENTS_${NCBI_PROJECT} ${_all})
1316    endif()
1317
1318    foreach(_value IN LISTS _all)
1319        if(${_value} IN_LIST NCBI_ALL_LEGACY)
1320            if (NOT NCBI_PTBMODE_COLLECT_DEPS)
1321                message(SEND_ERROR "${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}) component name ${_value} is deprecated, use ${NCBI_COMPONENT_${_value}_FOUND} instead")
1322            endif()
1323            set(_value ${NCBI_COMPONENT_${_value}_FOUND})
1324        endif()
1325        if (${_value} OR NCBI_REQUIRE_${_value}_FOUND OR NCBI_COMPONENT_${_value}_FOUND)
1326#            set(NCBITMP_INCLUDES ${NCBITMP_INCLUDES} ${NCBI_COMPONENT_${_value}_INCLUDE})
1327            set(NCBITMP_INCLUDES_SYSTEM ${NCBITMP_INCLUDES_SYSTEM} ${NCBI_COMPONENT_${_value}_INCLUDE})
1328            set(NCBITMP_DEFINES  ${NCBITMP_DEFINES}  ${NCBI_COMPONENT_${_value}_DEFINES})
1329            set(NCBITMP_EXTLIB   ${NCBITMP_EXTLIB}   ${NCBI_COMPONENT_${_value}_LIBS})
1330            foreach(_lib IN LISTS NCBI_COMPONENT_${_value}_NCBILIB)
1331                if(NOT ${_lib} STREQUAL ${NCBI_${NCBI_PROJECT}_OUTPUT})
1332                    set(NCBITMP_NCBILIB  ${NCBITMP_NCBILIB}  ${_lib})
1333                endif()
1334            endforeach()
1335            if (WIN32 AND NOT NCBI_PTBMODE_COLLECT_DEPS)
1336                NCBI_internal_install_component_files(${_value})
1337            endif()
1338        else()
1339            set(NCBITMP_COMPONENT_NOTFOUND ${NCBITMP_COMPONENT_NOTFOUND} ${_value})
1340        endif()
1341    endforeach()
1342endmacro()
1343
1344##############################################################################
1345function(NCBI_internal_collect_parts _result)
1346    set(_hostproject ${NCBI_PROJECT})
1347    set(_hostdir ${NCBI_CURRENT_SOURCE_DIR})
1348# verify that all parts can be found
1349    foreach(_part IN LISTS NCBI_${_hostproject}_PARTS)
1350        set(_filepath ${NCBI_SRC_ROOT}/${_part})
1351        get_filename_component(_path ${_filepath} DIRECTORY)
1352        if(NOT EXISTS ${_path}/CMakeLists.txt)
1353            if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1354                message("WARNING: Project part ${_part} not found: ${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}): ")
1355            endif()
1356            set(${_result} FALSE PARENT_SCOPE)
1357            return()
1358        endif()
1359    endforeach()
1360
1361    set(NCBI_PTBMODE_PARTS ON)
1362    foreach(_part IN LISTS NCBI_${_hostproject}_PARTS)
1363        set(_filepath ${NCBI_SRC_ROOT}/${_part})
1364        get_filename_component(_path ${_filepath} DIRECTORY)
1365        get_filename_component(_lib ${_filepath} NAME)
1366
1367        unset(NCBI_PROJECT)
1368        unset(NCBI_PROJECT_ID)
1369        unset(NCBI__USEPCH)
1370        unset(NCBI__REQUIRES)
1371        unset(NCBI__COMPONENTS)
1372        unset(NCBI__INCLUDES)
1373        unset(NCBI__DEFINES)
1374        unset(NCBI__NCBILIB)
1375        unset(NCBI__EXTLIB)
1376
1377        file(RELATIVE_PATH _relpath ${NCBI_SRC_ROOT} ${_path})
1378        string(REPLACE "/" ";" _dirlist ${_relpath})
1379        set(NCBI_CURRENT_SOURCE_DIR ${NCBI_SRC_ROOT})
1380        foreach(_dir IN LISTS _dirlist)
1381            set(NCBI_CURRENT_SOURCE_DIR ${NCBI_CURRENT_SOURCE_DIR}/${_dir})
1382            if(EXISTS ${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.txt)
1383                include(${NCBI_CURRENT_SOURCE_DIR}/CMakeLists.txt)
1384            endif()
1385        endforeach()
1386        set(NCBI_CURRENT_SOURCE_DIR ${_path})
1387
1388        if (EXISTS ${_path}/CMakeLists.${_lib}.lib.txt)
1389            include(${_path}/CMakeLists.${_lib}.lib.txt)
1390        elseif (EXISTS ${_path}/CMakeLists.${_lib}.asn.txt)
1391            include(${_path}/CMakeLists.${_lib}.asn.txt)
1392        elseif (EXISTS ${_path}/CMakeLists.${_lib}.txt)
1393            include(${_path}/CMakeLists.${_lib}.txt)
1394        else()
1395            message("ERROR: Project part ${_part} not found: ${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}): ")
1396            set(${_result} FALSE PARENT_SCOPE)
1397            return()
1398        endif()
1399    endforeach()
1400
1401    set(NCBITMP_PROJECT_PART_IDS    ${NCBITMP_PROJECT_PART_IDS}   PARENT_SCOPE)
1402    set(NCBITMP_PROJECT_PARTS       ${NCBITMP_PROJECT_PARTS}      PARENT_SCOPE)
1403    set(NCBITMP_PROJECT_REQUIRES    ${NCBITMP_PROJECT_REQUIRES}   PARENT_SCOPE)
1404    set(NCBITMP_PROJECT_COMPONENTS  ${NCBITMP_PROJECT_COMPONENTS} PARENT_SCOPE)
1405    set(NCBITMP_PROJECT_INCLUDES    ${NCBITMP_PROJECT_INCLUDES}   PARENT_SCOPE)
1406    set(NCBITMP_PROJECT_DEFINES     ${NCBITMP_PROJECT_DEFINES}    PARENT_SCOPE)
1407    set(NCBITMP_PROJECT_NCBILIB     ${NCBITMP_PROJECT_NCBILIB}    PARENT_SCOPE)
1408    set(NCBITMP_PROJECT_EXTLIB      ${NCBITMP_PROJECT_EXTLIB}     PARENT_SCOPE)
1409    set(NCBITMP_PROJECT_SOURCES     ${NCBITMP_PROJECT_SOURCES}    PARENT_SCOPE)
1410    set(NCBITMP_PROJECT_NOPCH       ${NCBITMP_PROJECT_NOPCH}      PARENT_SCOPE)
1411    set(NCBITMP_PROJECT_DATASPEC    ${NCBITMP_PROJECT_DATASPEC}   PARENT_SCOPE)
1412    set(NCBITMP_PROJECT_HEADERS     ${NCBITMP_PROJECT_HEADERS}    PARENT_SCOPE)
1413    set(${_result} TRUE PARENT_SCOPE)
1414    return()
1415endfunction()
1416
1417##############################################################################
1418macro(NCBI_internal_process_parts _result)
1419
1420    set(NCBITMP_PROJECT_PART_IDS "")
1421    set(NCBITMP_PROJECT_PARTS "")
1422    NCBI_internal_collect_parts(_result)
1423
1424    if(_result)
1425        if (NCBI_PTBMODE_COLLECT_DEPS OR NOT NCBI_PTBCFG_ENABLE_COLLECTOR)
1426#set_property(GLOBAL PROPERTY NCBI_PTBPROP_PARTS_${NCBI_PROJECT_ID} ${NCBITMP_PROJECT_PART_IDS})
1427            foreach(_part IN LISTS NCBITMP_PROJECT_PART_IDS)
1428                set_property(GLOBAL PROPERTY NCBI_PTBPROP_HOSTID_${_part} ${NCBI_PROJECT_ID})
1429            endforeach()
1430            foreach(_part IN LISTS NCBITMP_PROJECT_PARTS NCBI_${NCBI_PROJECT}_VIRTPARTS)
1431                if (NOT "${_part}" STREQUAL ${NCBI_PROJECT})
1432                    set_property(GLOBAL PROPERTY NCBI_PTBPROP_HOST_${_part} ${NCBI_PROJECT})
1433                endif()
1434            endforeach()
1435        endif()
1436    endif()
1437endmacro()
1438
1439##############################################################################
1440function(NCBI_internal_process_interface_libraries _lib)
1441    if (NOT TARGET ${_lib})
1442        return()
1443    endif()
1444    get_target_property(_deps ${_lib} INTERFACE_LINK_LIBRARIES)
1445    if ( NOT "${_deps}" STREQUAL "")
1446        set(_value "")
1447        foreach(_prj IN LISTS _deps)
1448            get_property(_local GLOBAL PROPERTY NCBI_PTBPROP_LOCAL_${_prj})
1449            if ("${_local}" STREQUAL "" OR NOT ${_local} IN_LIST NCBI_PTB_ALLOWED_PROJECTS)
1450                set(_value ${_value} ${_prj})
1451                NCBI_internal_process_interface_libraries(${_prj})
1452            else()
1453                set(_value ${_value} ${_local})
1454            endif()
1455        endforeach()
1456        set_target_properties(${_lib} PROPERTIES INTERFACE_LINK_LIBRARIES "${_value}")
1457    endif()
1458endfunction()
1459
1460##############################################################################
1461function(NCBI_internal_verify_ncbilibs)
1462    set(_res "")
1463    set(_exclude "")
1464    foreach(_prj IN LISTS NCBITMP_NCBILIB)
1465        NCBI_util_parse_sign(${_prj} _value _negate)
1466        list(APPEND _res ${_value})
1467        if (_negate)
1468            list(APPEND _exclude ${_value})
1469        endif()
1470    endforeach()
1471    foreach(_prj IN LISTS _exclude)
1472        list(REMOVE_ITEM _res ${_prj})
1473    endforeach()
1474    set(NCBITMP_NCBILIB ${_res} PARENT_SCOPE)
1475endfunction()
1476
1477##############################################################################
1478function(NCBI_internal_verify_libs)
1479    set(_optimize NO)
1480    if (WIN32 AND NCBI_PTBCFG_ENABLE_COLLECTOR
1481        AND NOT NCBI_PTBMODE_COLLECT_DEPS
1482        AND NOT DEFINED NCBI_EXTERNAL_TREE_ROOT
1483        AND NOT DEFINED NCBI_PTBCFG_DOINSTALL)
1484        if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "STATIC")
1485#            set(_ncbilib ${NCBITMP_NCBILIB})
1486            get_property(_ncbilib GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${NCBI_PROJECT})
1487            set(_optimize YES)
1488        else()
1489            get_property(_ncbilib GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${NCBI_PROJECT})
1490            if ("${_ncbilib}" STREQUAL "")
1491                set(_ncbilib ${NCBITMP_NCBILIB})
1492            endif()
1493        endif()
1494    else()
1495        set(_ncbilib ${NCBITMP_NCBILIB})
1496    endif()
1497    if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1498        message("NCBI_internal_verify_libs ${NCBI_PROJECT_ID}:  on enter = ${_ncbilib}")
1499    endif()
1500    set(_value "")
1501    if ( NOT "${_ncbilib}" STREQUAL "")
1502        list(REMOVE_DUPLICATES _ncbilib)
1503        foreach(_prj IN LISTS _ncbilib)
1504            get_property(_host GLOBAL PROPERTY NCBI_PTBPROP_HOST_${_prj})
1505            if ("${_host}" STREQUAL "")
1506                if (_optimize)
1507                    get_property(_hasspec GLOBAL PROPERTY NCBI_PTBPROP_DATASPEC_${_prj})
1508                    if (_hasspec)
1509                        set(_value ${_value} ${_prj})
1510                    endif()
1511                else()
1512                    set(_value ${_value} ${_prj})
1513                endif()
1514            else()
1515                set(_value ${_value} ${_host})
1516            endif()
1517        endforeach()
1518    endif()
1519    if ( NOT "${_value}" STREQUAL "")
1520        list(REMOVE_DUPLICATES _value)
1521        list(REMOVE_ITEM _value ${NCBI_PROJECT})
1522        set(_ncbilib ${_value})
1523    endif()
1524
1525    if ( NOT "${_ncbilib}" STREQUAL "" AND DEFINED NCBI_EXTERNAL_TREE_ROOT)
1526        set(_value "")
1527        foreach(_prj IN LISTS _ncbilib)
1528            get_property(_local GLOBAL PROPERTY NCBI_PTBPROP_LOCAL_${_prj})
1529            if ("${_local}" STREQUAL "" OR NOT ${_local} IN_LIST NCBI_PTB_ALLOWED_PROJECTS)
1530                set(_value ${_value} ${_prj})
1531                NCBI_internal_process_interface_libraries(${_prj})
1532            else()
1533                set(_value ${_value} ${_local})
1534            endif()
1535        endforeach()
1536    endif()
1537
1538    if (NOT NCBI_PTBMODE_COLLECT_DEPS)
1539        set(_tk_libs "${_value}")
1540        set(_value "")
1541        foreach(_tk_lib IN LISTS _tk_libs)
1542            if(${_tk_lib} STREQUAL "general")
1543                set(_value ${_value} \$<1:general>)
1544            else()
1545                set(_value ${_value} ${_tk_lib})
1546            endif()
1547        endforeach()
1548
1549        get_property(_allprojects     GLOBAL PROPERTY NCBI_PTBPROP_ALL_PROJECTS)
1550        set(NCBITMP_TARGET_NOTFOUND "")
1551        get_property(_tk_libs GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${NCBI_PROJECT})
1552        if(NOT "${_tk_libs}" STREQUAL "")
1553            foreach(_tk_lib IN LISTS _tk_libs)
1554                if(NOT TARGET ${_tk_lib} AND NOT ${_tk_lib} IN_LIST _allprojects)
1555                    list(APPEND NCBITMP_TARGET_NOTFOUND ${_tk_lib})
1556                endif()
1557            endforeach()
1558        endif()
1559    endif()
1560
1561    if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1562        message("NCBI_internal_verify_libs ${NCBI_PROJECT_ID}:  on exit = ${_value}")
1563    endif()
1564    list(REMOVE_DUPLICATES _value)
1565    set(NCBITMP_NCBILIB ${_value} PARENT_SCOPE)
1566    set(NCBITMP_TARGET_NOTFOUND ${NCBITMP_TARGET_NOTFOUND} PARENT_SCOPE)
1567endfunction()
1568
1569##############################################################################
1570function(NCBI_internal_process_project_filters _result)
1571
1572    if(NOT "${NCBI_PTBCFG_PROJECT_TARGETS}" STREQUAL "" AND NOT "${NCBI_PROJECT}" STREQUAL "")
1573        foreach(_prj IN LISTS NCBI_PTBCFG_PROJECT_TARGETS)
1574            if("${_prj}" STREQUAL "")
1575                continue()
1576            endif()
1577            NCBI_util_parse_sign( ${_prj} _value _negate)
1578            if (${NCBI_PROJECT} STREQUAL ${_value})
1579                if(_negate)
1580                    set(${_result} FALSE PARENT_SCOPE)
1581                else()
1582                    set(${_result} TRUE PARENT_SCOPE)
1583                endif()
1584                return()
1585            endif()
1586        endforeach()
1587    endif()
1588
1589    if(NOT "${NCBI_PTBCFG_PROJECT_TAGS}" STREQUAL "" AND NOT "${NCBI_PROJECT}" STREQUAL "")
1590        set(_alltags ${NCBI__PROJTAG} ${NCBI_${NCBI_PROJECT}_PROJTAG})
1591        if("${NCBI_PTBCFG_PROJECT_TAGS}" STREQUAL "-")
1592            if(NOT "${_alltags}" STREQUAL "")
1593                set(${_result} FALSE PARENT_SCOPE)
1594                return()
1595            endif()
1596        endif()
1597        set(_is_good FALSE)
1598        set(_hasp FALSE)
1599        foreach(_tag IN LISTS NCBI_PTBCFG_PROJECT_TAGS)
1600            if("${_tag}" STREQUAL "")
1601                continue()
1602            endif()
1603            if(${_tag} STREQUAL "*")
1604                set(_is_good TRUE)
1605                continue()
1606            endif()
1607            NCBI_util_parse_sign( ${_tag} _value _negate)
1608            if(_negate)
1609                if( ${_value} IN_LIST _alltags)
1610                    set(${_result} FALSE PARENT_SCOPE)
1611                    return()
1612                endif()
1613            else()
1614                set(_hasp TRUE)
1615                if( ${_value} IN_LIST _alltags)
1616                    set(_is_good TRUE)
1617                endif()
1618            endif()
1619        endforeach()
1620        if(NOT _is_good AND _hasp)
1621            set(${_result} FALSE PARENT_SCOPE)
1622            return()
1623        endif()
1624    endif()
1625
1626    if(NOT "${NCBI_PTBCFG_PROJECT_LIST}" STREQUAL "")
1627        set(_is_good FALSE)
1628        set(_hasp FALSE)
1629        if(DEFINED NCBI_PTB_THIS_SRC_ROOT)
1630            set(_src_root ${NCBI_PTB_THIS_SRC_ROOT})
1631        else()
1632            set(_src_root ${NCBI_SRC_ROOT})
1633        endif()
1634        foreach(_dir IN LISTS NCBI_PTBCFG_PROJECT_LIST)
1635            if("${_dir}" STREQUAL "")
1636                continue()
1637            endif()
1638            if(${_dir} STREQUAL "*")
1639                set(_is_good TRUE)
1640                continue()
1641            endif()
1642            NCBI_util_parse_sign( ${_dir} _value _negate)
1643            if(_negate)
1644                NCBI_util_match_path(${NCBI_CURRENT_SOURCE_DIR} ${_src_root}/${_value} _match)
1645                if(_match)
1646                    set(${_result} FALSE PARENT_SCOPE)
1647                    return()
1648                endif()
1649            else()
1650                set(_hasp TRUE)
1651                NCBI_util_match_path(${NCBI_CURRENT_SOURCE_DIR} ${_src_root}/${_value} _match)
1652                if(_match)
1653                    set(_is_good TRUE)
1654                endif()
1655            endif()
1656        endforeach()
1657        if (NOT _is_good AND _hasp)
1658            set(${_result} FALSE PARENT_SCOPE)
1659            return()
1660        endif()
1661    endif()
1662
1663    if(NOT "${NCBI_PTBCFG_PROJECT_TARGETS}" STREQUAL "" AND NOT "${NCBI_PROJECT}" STREQUAL "")
1664        set(_is_good FALSE)
1665        set(_hasp FALSE)
1666        foreach(_prj IN LISTS NCBI_PTBCFG_PROJECT_TARGETS)
1667            if("${_prj}" STREQUAL "")
1668                continue()
1669            endif()
1670            if (${_prj} STREQUAL "*")
1671                set(_is_good TRUE)
1672                continue()
1673            endif()
1674            NCBI_util_parse_sign( ${_prj} _value _negate)
1675            if (_negate)
1676                if (${NCBI_PROJECT} MATCHES ${_value})
1677                    set(${_result} FALSE PARENT_SCOPE)
1678                    return()
1679                endif()
1680            else()
1681                set(_hasp TRUE)
1682                if (${NCBI_PROJECT} MATCHES ${_value})
1683                    set(_is_good TRUE)
1684                endif()
1685            endif()
1686        endforeach()
1687        if (NOT _is_good AND _hasp)
1688            set(${_result} FALSE PARENT_SCOPE)
1689            return()
1690        endif()
1691    endif()
1692    set(${_result} TRUE PARENT_SCOPE)
1693endfunction()
1694
1695##############################################################################
1696function(NCBI_internal_print_project_info _prj)
1697    message("=============================================================================")
1698    get_property(_dir GLOBAL PROPERTY NCBI_PTBPROP_DIR_${_prj})
1699    message("PROJECT: ${_prj} (${_dir})")
1700    get_property(_x GLOBAL PROPERTY NCBI_PTBPROP_REQUIRES_${_prj})
1701    if(NOT "${_x}" STREQUAL "")
1702        list(SORT _x)
1703        message("  REQUIRES:  ${_x}")
1704    endif()
1705    get_property(_x GLOBAL PROPERTY NCBI_PTBPROP_COMPONENTS_${_prj})
1706    if(NOT "${_x}" STREQUAL "")
1707        list(SORT _x)
1708        message("  OPTIONAL COMPONENTS:  ${_x}")
1709    endif()
1710    get_property(_x GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${_prj})
1711    if(NOT "${_x}" STREQUAL "")
1712        message("  DEPENDENCIES:  ${_x}")
1713        set(_needless "")
1714        foreach(_dep IN LISTS _x)
1715            get_property(_y GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${_dep})
1716            if(NOT "${_y}" STREQUAL "")
1717                list(SORT _y)
1718                foreach(_subdep IN LISTS _y)
1719                    if(${_subdep} IN_LIST _x)
1720                        list(APPEND _needless ${_subdep})
1721                    endif()
1722                endforeach()
1723            endif()
1724        endforeach()
1725        if(NOT "${_needless}" STREQUAL "")
1726            list(REMOVE_DUPLICATES _needless)
1727            message("  NEEDLESS DEPENDENCIES:  ${_needless}")
1728        endif()
1729    endif()
1730    get_property(_x GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${_prj})
1731    if(NOT "${_x}" STREQUAL "")
1732        list(SORT _x)
1733        message("-----------------------------------------------------------------------------")
1734        message("  ALL DEPENDENCIES:  ${_x}")
1735        foreach(_dep IN LISTS _x)
1736            get_property(_dir GLOBAL PROPERTY NCBI_PTBPROP_DIR_${_dep})
1737            message("  ${_dep} (${_dir})")
1738            get_property(_y GLOBAL PROPERTY NCBI_PTBPROP_REQUIRES_${_dep})
1739            if(NOT "${_y}" STREQUAL "")
1740                list(SORT _y)
1741                message("    REQUIRES:  ${_y}")
1742            endif()
1743            get_property(_y GLOBAL PROPERTY NCBI_PTBPROP_COMPONENTS_${_dep})
1744            if(NOT "${_y}" STREQUAL "")
1745                list(SORT _y)
1746                message("    OPTIONAL COMPONENTS:  ${_y}")
1747            endif()
1748            get_property(_y GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${_dep})
1749            if(NOT "${_y}" STREQUAL "")
1750                list(SORT _y)
1751                message("    DEPENDENCIES:  ${_y}")
1752            endif()
1753        endforeach()
1754    endif()
1755    get_property(_x GLOBAL PROPERTY NCBI_PTBPROP_IMPLREQ_${_prj})
1756    if(NOT "${_x}" STREQUAL "")
1757        message("-----------------------------------------------------------------------------")
1758        message("  ALL REQUIRED COMPONENTS: ${_x}")
1759        foreach(_req IN LISTS _x)
1760            if (${_req})
1761                message("  ${_req}: ${${_req}}")
1762            elseif (NCBI_REQUIRE_${_req}_FOUND)
1763                message("  _${_req}: ${NCBI_REQUIRE_${_req}_FOUND}")
1764            elseif (NCBI_COMPONENT_${_req}_FOUND)
1765                message("  ${_req}")
1766                if (DEFINED NCBI_COMPONENT_${_req}_INCLUDE)
1767                    message("    INCLUDE: ${NCBI_COMPONENT_${_req}_INCLUDE}")
1768                endif()
1769                if (DEFINED NCBI_COMPONENT_${_req}_DEFINES)
1770                    message("    DEFINES: ${NCBI_COMPONENT_${_req}_DEFINES}")
1771                endif()
1772                if (DEFINED NCBI_COMPONENT_${_req}_LIBS)
1773                    message("    LIBS: ${NCBI_COMPONENT_${_req}_LIBS}")
1774                endif()
1775                if (DEFINED NCBI_COMPONENT_${_req}_BINPATH)
1776                    message("    BINPATH: ${NCBI_COMPONENT_${_req}_BINPATH}")
1777                endif()
1778            else()
1779                message("  ${_req} not defined")
1780            endif()
1781        endforeach()
1782    endif()
1783    message("=============================================================================")
1784endfunction()
1785
1786##############################################################################
1787function(NCBI_internal_print_report _caption _counter)
1788    set(_report "")
1789    foreach( _type IN ITEMS CONSOLEAPP GUIAPP STATIC SHARED CUSTOM)
1790        get_property(_cnt GLOBAL PROPERTY NCBI_PTBPROP_${_counter}_${_type})
1791        if( NOT "${_cnt}" STREQUAL "" AND "${_cnt}" GREATER 0)
1792            if( NOT "${_report}" STREQUAL "")
1793                string(APPEND _report ",")
1794            endif()
1795            string(APPEND _report " ${_cnt} ")
1796            if(     ${_type} STREQUAL "CONSOLEAPP")
1797                string(APPEND _report "console app")
1798            elseif( ${_type} STREQUAL "GUIAPP")
1799                string(APPEND _report "GUI app")
1800            elseif( ${_type} STREQUAL "STATIC")
1801                string(APPEND _report "static lib")
1802            elseif( ${_type} STREQUAL "SHARED")
1803                string(APPEND _report "shared lib")
1804            elseif( ${_type} STREQUAL "CUSTOM")
1805                string(APPEND _report "custom target")
1806            endif()
1807            if( ${_cnt} GREATER 1)
1808                string(APPEND _report "s")
1809            endif()
1810        endif()
1811    endforeach()
1812    message("${_caption}: ${_report}")
1813endfunction()
1814
1815##############################################################################
1816function(NCBI_internal_tweak_debugging_env)
1817    if (DEFINED NCBI_EXTERNAL_TREE_ROOT AND MSVC AND BUILD_SHARED_LIBS)
1818        if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "CONSOLEAPP" OR ${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "GUIAPP")
1819            set(_file "${CMAKE_CURRENT_BINARY_DIR}/${NCBI_PROJECT}.vcxproj.user")
1820            set(_bin "${NCBI_EXTERNAL_BUILD_ROOT}/${NCBI_DIRNAME_RUNTIME}")
1821            string(REPLACE "/" "\\" _bin ${_bin})
1822            if (NOT EXISTS "${_file}")
1823                set(_info)
1824                list(APPEND _info "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
1825                list(APPEND _info "<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n")
1826                list(APPEND _info "  <PropertyGroup>\n")
1827                list(APPEND _info "    <LocalDebuggerEnvironment>PATH=${_bin}\\\$(Configuration)\;\$(VCRedistPaths)%PATH%\n")
1828                list(APPEND _info "</LocalDebuggerEnvironment>\n")
1829                list(APPEND _info "    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n")
1830                list(APPEND _info "  </PropertyGroup>\n")
1831                list(APPEND _info "</Project>\n")
1832                file(WRITE ${_file} ${_info})
1833            endif()
1834        endif()
1835    endif()
1836endfunction()
1837
1838##############################################################################
1839function(NCBI_internal_add_project)
1840
1841    if (DEFINED NCBI_${NCBI_PROJECT}_PARTS AND NOT NCBI_PTBCFG_ALLOW_COMPOSITE)
1842        if (NOT NCBI_PTBMODE_COLLECT_DEPS)
1843            if (NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1844                message("${NCBI_PROJECT_ID} (${NCBI_CURRENT_SOURCE_DIR}) is excluded by configuration settings")
1845            endif()
1846        endif()
1847        if ("${ARGC}" GREATER "0")
1848            set(${ARGV0} FALSE PARENT_SCOPE)
1849        endif()
1850        return()
1851    endif()
1852
1853    get_property(_hosted GLOBAL PROPERTY NCBI_PTBPROP_HOSTID_${NCBI_PROJECT_ID})
1854    if ("${_hosted}" STREQUAL "")
1855        get_property(_hosted GLOBAL PROPERTY NCBI_PTBPROP_HOST_${NCBI_PROJECT})
1856    endif()
1857
1858    if (NCBI_PTBCFG_ENABLE_COLLECTOR AND NOT NCBI_PTBMODE_PARTS AND NOT NCBI_PTBMODE_COLLECT_DEPS)
1859        if(DEFINED NCBI_PTB_ALLOWED_PROJECTS)
1860            if(NOT ${NCBI_PROJECT} IN_LIST NCBI_PTB_ALLOWED_PROJECTS)
1861                if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1862                    message("${NCBI_PROJECT_ID} (${NCBI_CURRENT_SOURCE_DIR}) is excluded by user's request")
1863                endif()
1864                if ("${ARGC}" GREATER "0")
1865                    set(${ARGV0} FALSE PARENT_SCOPE)
1866                endif()
1867                return()
1868            endif()
1869        endif()
1870
1871        if (NOT "${_hosted}" STREQUAL "")
1872            if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1873                message("${NCBI_PROJECT_ID} (${NCBI_CURRENT_SOURCE_DIR}) is excluded because it is part of ${_hosted}")
1874            endif()
1875            if ("${ARGC}" GREATER "0")
1876                set(${ARGV0} FALSE PARENT_SCOPE)
1877            endif()
1878            return()
1879        endif()
1880    endif()
1881
1882    if(NOT NCBI_PTBCFG_ENABLE_COLLECTOR AND NOT NCBI_PTBMODE_PARTS)
1883        get_property(_count  GLOBAL PROPERTY NCBI_PTBPROP_TOTAL_${NCBI_${NCBI_PROJECT}_TYPE})
1884        math(EXPR _count "${_count} + 1")
1885        set_property(GLOBAL PROPERTY NCBI_PTBPROP_TOTAL_${NCBI_${NCBI_PROJECT}_TYPE} ${_count})
1886        NCBI_internal_process_project_filters(_allowed)
1887        if (NOT _allowed)
1888            if ("${ARGC}" GREATER "0")
1889                set(${ARGV0} FALSE PARENT_SCOPE)
1890            endif()
1891            return()
1892        endif()
1893    endif()
1894
1895     if (NCBI_PTBMODE_COLLECT_DEPS)
1896        get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${NCBI_PROJECT} SET)
1897        if (_prjdeps AND NOT DEFINED NCBI_${NCBI_PROJECT}_PARTS)
1898#            get_property(_dir GLOBAL PROPERTY NCBI_PTBPROP_DIR_${NCBI_PROJECT})
1899#            message("WARNING: Target ${NCBI_PROJECT_ID} (${NCBI_CURRENT_SOURCE_DIR}) is excluded")
1900#            message("         because there is already a target with the same name in ${_dir}")
1901            if ("${ARGC}" GREATER "0")
1902                set(${ARGV0} FALSE PARENT_SCOPE)
1903            endif()
1904            return()
1905        endif()
1906    endif()
1907
1908if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1909message("-----------------------------------")
1910message("NCBI_PROJECT = ${NCBI_PROJECT}")
1911message("  TYPE = ${NCBI_${NCBI_PROJECT}_TYPE}")
1912message("  LOCATION = ${NCBI_CURRENT_SOURCE_DIR}")
1913message("  SOURCES = ${NCBI_${NCBI_PROJECT}_SOURCES} ${NCBI_${NCBI_PROJECT}_GENERATED_SOURCES}")
1914message("  RESOURCES = ${NCBI_${NCBI_PROJECT}_RESOURCES}")
1915message("  HEADERS = ${NCBI_${NCBI_PROJECT}_HEADERS}")
1916message("  REQUIRES = ${NCBI_${NCBI_PROJECT}_REQUIRES}")
1917message("  COMPONENTS = ${NCBI_${NCBI_PROJECT}_COMPONENTS}")
1918message("  NOPCH = ${NCBI_${NCBI_PROJECT}_NOPCH}")
1919message("  NCBILIB = ${NCBI_${NCBI_PROJECT}_NCBILIB}")
1920message("  EXTLIB = ${NCBI_${NCBI_PROJECT}_EXTLIB}")
1921message("  INCLUDES = ${NCBI_${NCBI_PROJECT}_INCLUDES}")
1922message("  DEFINES = ${NCBI_${NCBI_PROJECT}_DEFINES}")
1923message("  TAGS = ${NCBI_${NCBI_PROJECT}_PROJTAG}")
1924endif()
1925
1926    if (DEFINED NCBI_${NCBI_PROJECT}_PARTS)
1927        NCBI_internal_process_parts(_result)
1928        if(NOT _result)
1929            if ("${ARGC}" GREATER "0")
1930                set(${ARGV0} FALSE PARENT_SCOPE)
1931            endif()
1932            return()
1933        endif()
1934    endif()
1935
1936    set(NCBITMP_INCLUDES ${NCBITMP_PROJECT_INCLUDES} ${NCBI__INCLUDES} ${NCBI_${NCBI_PROJECT}_INCLUDES})
1937    set(NCBITMP_DEFINES  ${NCBITMP_PROJECT_DEFINES}  ${NCBI__DEFINES}  ${NCBI_${NCBI_PROJECT}_DEFINES})
1938    set(NCBITMP_NCBILIB  ${NCBITMP_PROJECT_NCBILIB}  ${NCBI__NCBILIB}  ${NCBI_${NCBI_PROJECT}_NCBILIB})
1939    set(NCBITMP_EXTLIB   ${NCBITMP_PROJECT_EXTLIB}   ${NCBI__EXTLIB}   ${NCBI_${NCBI_PROJECT}_EXTLIB})
1940
1941    NCBI_internal_process_project_requires()
1942    if ( NOT "${NCBITMP_REQUIRE_NOTFOUND}" STREQUAL "" AND NOT NCBI_PTBMODE_COLLECT_DEPS)
1943        message("${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}) is excluded because of unmet requirements: ${NCBITMP_REQUIRE_NOTFOUND}")
1944        if (NOT NCBI_PTBMODE_PARTS)
1945            if ("${ARGC}" GREATER "0")
1946                set(${ARGV0} FALSE PARENT_SCOPE)
1947            endif()
1948            return()
1949        endif()
1950    endif()
1951
1952    NCBI_internal_process_project_components()
1953    if ( NOT "${NCBITMP_COMPONENT_NOTFOUND}" STREQUAL "" AND NOT NCBI_PTBMODE_COLLECT_DEPS)
1954        message("${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}): cannot find optional component: ${NCBITMP_COMPONENT_NOTFOUND}")
1955    endif()
1956    if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
1957        message("  NCBITMP_INCLUDES = ${NCBITMP_INCLUDES}")
1958        message("  NCBITMP_INCLUDES_SYSTEM = ${NCBITMP_INCLUDES_SYSTEM}")
1959        message("  NCBITMP_DEFINES = ${NCBITMP_DEFINES}")
1960        message("  NCBITMP_NCBILIB = ${NCBITMP_NCBILIB}")
1961        message("  NCBITMP_EXTLIB = ${NCBITMP_EXTLIB}")
1962    endif()
1963    NCBI_internal_verify_ncbilibs()
1964    NCBI_internal_verify_libs()
1965    if ( NOT "${NCBITMP_TARGET_NOTFOUND}" STREQUAL "" AND NOT NCBI_PTBMODE_COLLECT_DEPS)
1966        message("${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}) is excluded because it depends on missing targets: ${NCBITMP_TARGET_NOTFOUND}")
1967        if (NOT NCBI_PTBMODE_PARTS)
1968            if ("${ARGC}" GREATER "0")
1969                set(${ARGV0} FALSE PARENT_SCOPE)
1970            endif()
1971            return()
1972        endif()
1973    endif()
1974
1975    if (NCBI_PTBMODE_COLLECT_DEPS)
1976        if (NCBI_PTBMODE_PARTS)
1977            set(NCBITMP_PROJECT_PART_IDS  ${NCBITMP_PROJECT_PART_IDS}  ${NCBI_PROJECT_ID}       PARENT_SCOPE )
1978            set(NCBITMP_PROJECT_PARTS     ${NCBITMP_PROJECT_PARTS}     ${NCBI_PROJECT_PARTNAME} PARENT_SCOPE )
1979        endif()
1980        set_property(GLOBAL PROPERTY NCBI_PTBPROP_DEPS_${NCBI_PROJECT} "${NCBITMP_NCBILIB}")
1981        set_property(GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${NCBI_PROJECT} "${NCBITMP_NCBILIB}")
1982        set_property(GLOBAL PROPERTY NCBI_PTBPROP_DIR_${NCBI_PROJECT} "${NCBI_CURRENT_SOURCE_DIR}")
1983        if (DEFINED NCBI_${NCBI_PROJECT}_DATASPEC)
1984            set_property(GLOBAL PROPERTY NCBI_PTBPROP_DATASPEC_${NCBI_PROJECT} YES)
1985        endif()
1986
1987        if(NOT NCBI_PTBMODE_PARTS)
1988            get_property(_allprojects GLOBAL PROPERTY NCBI_PTBPROP_ALL_PROJECTS)
1989            set(_allprojects ${_allprojects} ${NCBI_PROJECT})
1990            set_property(GLOBAL PROPERTY NCBI_PTBPROP_ALL_PROJECTS ${_allprojects})
1991
1992            NCBI_internal_process_project_filters(_allowed)
1993            if (_allowed)
1994                get_property(_allowedprojects GLOBAL PROPERTY NCBI_PTBPROP_ALLOWED_PROJECTS)
1995                set(_allowedprojects ${_allowedprojects} ${NCBI_PROJECT})
1996                set_property(GLOBAL PROPERTY NCBI_PTBPROP_ALLOWED_PROJECTS ${_allowedprojects})
1997            endif()
1998            set(NCBI_PTB_CALLBACK_TARGET_PARSED ${NCBI_PROJECT})
1999
2000            get_property(_count  GLOBAL PROPERTY NCBI_PTBPROP_TOTAL_${NCBI_${NCBI_PROJECT}_TYPE})
2001            math(EXPR _count "${_count} + 1")
2002            set_property(GLOBAL PROPERTY NCBI_PTBPROP_TOTAL_${NCBI_${NCBI_PROJECT}_TYPE} ${_count})
2003
2004            if ("${ARGC}" GREATER "0")
2005                set(${ARGV0} FALSE PARENT_SCOPE)
2006            endif()
2007            return()
2008        endif()
2009    elseif(NOT NCBI_PTBCFG_ENABLE_COLLECTOR AND NCBI_PTBMODE_PARTS)
2010        set(NCBITMP_PROJECT_PART_IDS  ${NCBITMP_PROJECT_PART_IDS}  ${NCBI_PROJECT_ID}       PARENT_SCOPE )
2011        set(NCBITMP_PROJECT_PARTS     ${NCBITMP_PROJECT_PARTS}     ${NCBI_PROJECT_PARTNAME} PARENT_SCOPE )
2012    endif()
2013
2014#message("processing ${NCBI_PROJECT_ID}")
2015    NCBI_internal_collect_sources()
2016    NCBI_internal_collect_dataspec()
2017    NCBI_internal_collect_headers()
2018    if (NCBI_PTBMODE_PARTS)
2019        set(NCBITMP_PROJECT_REQUIRES    ${NCBITMP_PROJECT_REQUIRES}   ${NCBI__REQUIRES}   ${NCBI_${NCBI_PROJECT}_REQUIRES}    PARENT_SCOPE)
2020        set(NCBITMP_PROJECT_COMPONENTS  ${NCBITMP_PROJECT_COMPONENTS} ${NCBI__COMPONENTS} ${NCBI_${NCBI_PROJECT}_COMPONENTS}  PARENT_SCOPE)
2021        set(NCBITMP_PROJECT_INCLUDES    ${NCBITMP_PROJECT_INCLUDES}   ${NCBI__INCLUDES}   ${NCBI_${NCBI_PROJECT}_INCLUDES}    PARENT_SCOPE)
2022        set(NCBITMP_PROJECT_DEFINES     ${NCBITMP_PROJECT_DEFINES}    ${NCBI__DEFINES}    ${NCBI_${NCBI_PROJECT}_DEFINES}     PARENT_SCOPE)
2023        set(NCBITMP_PROJECT_NCBILIB     ${NCBITMP_PROJECT_NCBILIB}    ${NCBI__NCBILIB}    ${NCBI_${NCBI_PROJECT}_NCBILIB}     PARENT_SCOPE)
2024        set(NCBITMP_PROJECT_EXTLIB      ${NCBITMP_PROJECT_EXTLIB}     ${NCBI__EXTLIB}     ${NCBI_${NCBI_PROJECT}_EXTLIB}      PARENT_SCOPE)
2025        set(NCBITMP_PROJECT_SOURCES     ${NCBITMP_PROJECT_SOURCES}    PARENT_SCOPE)
2026        set(NCBITMP_PROJECT_NOPCH       ${NCBITMP_PROJECT_NOPCH}      PARENT_SCOPE)
2027        set(NCBITMP_PROJECT_DATASPEC    ${NCBITMP_PROJECT_DATASPEC}   PARENT_SCOPE)
2028        set(NCBITMP_PROJECT_HEADERS     ${NCBITMP_PROJECT_HEADERS}    PARENT_SCOPE)
2029        if ("${ARGC}" GREATER "0")
2030            set(${ARGV0} FALSE PARENT_SCOPE)
2031        endif()
2032        return()
2033    endif()
2034    NCBI_internal_add_resources()
2035    NCBI_internal_add_dataspec()
2036
2037#----------------------------------------------------------------------------
2038    if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "STATIC")
2039
2040#message("add static library(${NCBI_PROJECT} STATIC ${NCBITMP_PROJECT_SOURCES} ${NCBITMP_PROJECT_HEADERS} ${NCBITMP_PROJECT_RESOURCES} ${NCBITMP_PROJECT_DATASPEC})")
2041#message("add static library ${NCBI_PROJECT}")
2042        add_library(${NCBI_PROJECT} STATIC ${NCBITMP_PROJECT_SOURCES} ${NCBITMP_PROJECT_HEADERS} ${NCBITMP_PROJECT_RESOURCES} ${NCBITMP_PROJECT_DATASPEC})
2043        set(_suffix ${CMAKE_STATIC_LIBRARY_SUFFIX})
2044
2045#----------------------------------------------------------------------------
2046    elseif (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "SHARED")
2047
2048#message("add shared library(${NCBI_PROJECT} SHARED ${NCBITMP_PROJECT_SOURCES} ${NCBITMP_PROJECT_HEADERS} ${NCBITMP_PROJECT_RESOURCES} ${NCBITMP_PROJECT_DATASPEC})")
2049#message("add shared library ${NCBI_PROJECT}")
2050        add_library(${NCBI_PROJECT} SHARED ${NCBITMP_PROJECT_SOURCES} ${NCBITMP_PROJECT_HEADERS} ${NCBITMP_PROJECT_RESOURCES} ${NCBITMP_PROJECT_DATASPEC})
2051        set(_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX})
2052
2053#----------------------------------------------------------------------------
2054    elseif (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "CONSOLEAPP")
2055
2056#message("add_executable(${NCBI_PROJECT} ${NCBITMP_PROJECT_SOURCES} ${NCBITMP_PROJECT_HEADERS} ${NCBITMP_PROJECT_RESOURCES} ${NCBITMP_PROJECT_DATASPEC})")
2057#message("add executable ${NCBI_PROJECT}")
2058        add_executable(${NCBI_PROJECT} ${NCBITMP_PROJECT_SOURCES} ${NCBITMP_PROJECT_HEADERS} ${NCBITMP_PROJECT_RESOURCES} ${NCBITMP_PROJECT_DATASPEC})
2059        set(_suffix ${CMAKE_EXECUTABLE_SUFFIX})
2060
2061#----------------------------------------------------------------------------
2062    elseif (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "GUIAPP")
2063
2064        add_executable(${NCBI_PROJECT} WIN32 ${NCBITMP_PROJECT_SOURCES} ${NCBITMP_PROJECT_HEADERS} ${NCBITMP_PROJECT_RESOURCES} ${NCBITMP_PROJECT_DATASPEC})
2065        set(_suffix ${CMAKE_EXECUTABLE_SUFFIX})
2066
2067#----------------------------------------------------------------------------
2068    elseif (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "CUSTOM")
2069
2070        set(NCBI_${NCBI_PROJECT}_CALLBACK 0)
2071        variable_watch(NCBI_${NCBI_PROJECT}_CALLBACK ${NCBI_${NCBI_PROJECT}_DEFINITION})
2072        set(NCBI_${NCBI_PROJECT}_CALLBACK 1)
2073
2074#----------------------------------------------------------------------------
2075    else()
2076
2077        message("ERROR: ${NCBI_PROJECT} (${NCBI_CURRENT_SOURCE_DIR}) unsupported project type ${NCBI_${NCBI_PROJECT}_TYPE}")
2078        if ("${ARGC}" GREATER "0")
2079            set(${ARGV0} FALSE PARENT_SCOPE)
2080        endif()
2081        return()
2082
2083    endif()
2084
2085	if (DEFINED NCBI_DEFAULT_CFGPROPS)
2086		if(MSVC)
2087			set_target_properties(${NCBI_PROJECT} PROPERTIES VS_USER_PROPS "${NCBI_DEFAULT_CFGPROPS}")
2088		endif()
2089	endif()
2090    if (DEFINED NCBI_${NCBI_PROJECT}_OUTPUT)
2091        if(NOT DEFINED NCBI_EXTERNAL_TREE_ROOT AND NOT ${NCBI_PROJECT} STREQUAL ${NCBI_${NCBI_PROJECT}_OUTPUT})
2092            get_property(_dir GLOBAL PROPERTY NCBI_PTBPROP_DIR_${NCBI_${NCBI_PROJECT}_OUTPUT})
2093            if (NOT ${_dir} STREQUAL "" AND (NOT ${_dir} STREQUAL ${NCBI_CURRENT_SOURCE_DIR} OR TARGET ${NCBI_${NCBI_PROJECT}_OUTPUT}))
2094                message("WARNING: App target ${NCBI_${NCBI_PROJECT}_OUTPUT} (${NCBI_CURRENT_SOURCE_DIR}) cannot be created")
2095                message("         because there is already a target with the same name in ${_dir}")
2096                message("         App target ${NCBI_${NCBI_PROJECT}_OUTPUT} will be renamed into ${NCBI_PROJECT}")
2097            elseif(NOT NCBI_PTBCFG_ENABLE_COLLECTOR)
2098                message("WARNING: App target ${NCBI_${NCBI_PROJECT}_OUTPUT} (${NCBI_CURRENT_SOURCE_DIR}) cannot be created")
2099                message("         because there is already a target with the same name elsewhere")
2100                message("         App target ${NCBI_${NCBI_PROJECT}_OUTPUT} will be renamed into ${NCBI_PROJECT}")
2101            endif()
2102        endif()
2103        set_target_properties(${NCBI_PROJECT} PROPERTIES OUTPUT_NAME ${NCBI_${NCBI_PROJECT}_OUTPUT})
2104    endif()
2105
2106    get_property(_count  GLOBAL PROPERTY NCBI_PTBPROP_COUNT_${NCBI_${NCBI_PROJECT}_TYPE})
2107    math(EXPR _count "${_count} + 1")
2108    set_property(GLOBAL PROPERTY NCBI_PTBPROP_COUNT_${NCBI_${NCBI_PROJECT}_TYPE} ${_count})
2109
2110if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
2111message("  ADDED: ${NCBI_CURRENT_SOURCE_DIR}/${NCBI_PROJECT_ID}")
2112message("  NCBITMP_PROJECT_SOURCES ${NCBITMP_PROJECT_SOURCES}")
2113message("  NCBITMP_PROJECT_HEADERS ${NCBITMP_PROJECT_HEADERS}")
2114message("  NCBITMP_PROJECT_RESOURCES ${NCBITMP_PROJECT_RESOURCES}")
2115#message("  NCBI_SRC_ROOT ${NCBI_SRC_ROOT}")
2116#message("  NCBI_INC_ROOT ${NCBI_INC_ROOT}")
2117endif()
2118
2119    if (${NCBI_${NCBI_PROJECT}_TYPE} STREQUAL "CUSTOM")
2120
2121        get_property(_prjdeps GLOBAL PROPERTY NCBI_PTBPROP_DIRECT_DEPS_${NCBI_PROJECT})
2122        if (NOT "${_prjdeps}" STREQUAL "")
2123            add_dependencies(${NCBI_PROJECT} ${_prjdeps})
2124        endif()
2125
2126    else()
2127        target_include_directories(${NCBI_PROJECT} SYSTEM PRIVATE ${NCBITMP_INCLUDES_SYSTEM})
2128        target_include_directories(${NCBI_PROJECT} PRIVATE ${NCBITMP_INCLUDES})
2129        target_compile_definitions(${NCBI_PROJECT} PRIVATE ${NCBITMP_DEFINES})
2130
2131if(OFF)
2132# this does not seem to have any effect
2133        if (XCODE AND NOT BUILD_SHARED_LIBS)
2134            set_target_properties(${NCBI_PROJECT} PROPERTIES XCODE_ATTRIBUTE_STANDARD_C_PLUS_PLUS_LIBRARY_TYPE "static")
2135            set_target_properties(${NCBI_PROJECT} PROPERTIES XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "YES")
2136        endif()
2137endif()
2138
2139#message("target_link_libraries: ${NCBI_PROJECT}     ${NCBITMP_NCBILIB} ${NCBITMP_EXTLIB}")
2140        set(_libs ${NCBITMP_NCBILIB} ${NCBITMP_EXTLIB})
2141        if ("${_libs}" STREQUAL "")
2142            set(_libs ${ORIG_LIBS})
2143        endif()
2144        target_link_libraries(     ${NCBI_PROJECT}         ${_libs})
2145
2146        if (DEFINED _suffix)
2147            set_target_properties( ${NCBI_PROJECT} PROPERTIES PROJECT_LABEL ${NCBI_PROJECT}${_suffix})
2148        endif()
2149        NCBI_internal_define_precompiled_header_usage()
2150    endif()
2151    NCBI_internal_tweak_debugging_env()
2152
2153    set(NCBI_PTB_CALLBACK_TARGET_ADDED ${NCBI_PROJECT})
2154
2155if(NCBI_VERBOSE_ALLPROJECTS OR NCBI_VERBOSE_PROJECT_${NCBI_PROJECT})
2156message("-----------------------------------")
2157endif()
2158
2159    if ("${ARGC}" GREATER "0")
2160        set(${ARGV0} TRUE PARENT_SCOPE)
2161    endif()
2162endfunction()
2163
2164##############################################################################
2165##############################################################################
2166
2167macro(NCBI_util_load_file _file _result)
2168    get_filename_component(_path ${_file} DIRECTORY)
2169    if (EXISTS "${_file}" AND NOT IS_DIRECTORY "${_file}")
2170        file(STRINGS "${_file}" _list)
2171        foreach( _item IN LISTS _list)
2172            if ("${_item}" STREQUAL "")
2173                continue()
2174            endif()
2175            if ("${_item}" MATCHES "#")
2176                if ("${_item}" MATCHES "#include")
2177                    string(REPLACE "#include" "" _item ${_item})
2178                    string(REPLACE " " "" _item ${_item})
2179                    string(REPLACE "\"" "" _item ${_item})
2180                    NCBI_util_load_file(${_path}/${_item} ${_result})
2181                endif()
2182                continue()
2183            endif()
2184            string(REPLACE " " ";" _tmp ${_item})
2185            list(GET _tmp 0 _item)
2186            list(APPEND ${_result} ${_item})
2187        endforeach()
2188    else()
2189        message("WARNING: unable to load ${_file}")
2190    endif()
2191endmacro()
2192
2193
2194if("${NCBI_PTBCFG_PROJECT_LIST}" STREQUAL "")
2195    unset(NCBI_PTBCFG_PROJECT_LIST)
2196endif()
2197if("${NCBI_PTBCFG_PROJECT_TAGS}" STREQUAL "")
2198    unset(NCBI_PTBCFG_PROJECT_TAGS)
2199endif()
2200if("${NCBI_PTBCFG_PROJECT_TARGETS}" STREQUAL "")
2201    unset(NCBI_PTBCFG_PROJECT_TARGETS)
2202endif()
2203
2204if(DEFINED NCBI_PTBCFG_PROJECT_LIST AND EXISTS "${NCBI_PTBCFG_PROJECT_LIST}")
2205    if (NOT IS_DIRECTORY "${NCBI_PTBCFG_PROJECT_LIST}")
2206        string(REPLACE "\\" "/" NCBI_PTBCFG_PROJECT_LIST ${NCBI_PTBCFG_PROJECT_LIST})
2207        NCBI_util_load_file("${NCBI_PTBCFG_PROJECT_LIST}" NCBI_PTBCFG_PROJECT_LIST)
2208        list(REMOVE_AT NCBI_PTBCFG_PROJECT_LIST 0)
2209        list(REMOVE_DUPLICATES NCBI_PTBCFG_PROJECT_LIST)
2210    endif()
2211endif()
2212set(_lst ${NCBI_PTBCFG_PROJECT_LIST})
2213set(NCBI_PTBCFG_PROJECT_LIST "")
2214foreach(_item IN LISTS _lst)
2215    string(REPLACE "\\" "/" _item ${_item})
2216    list(APPEND NCBI_PTBCFG_PROJECT_LIST ${_item})
2217endforeach()
2218
2219if(DEFINED NCBI_PTBCFG_PROJECT_TAGS AND EXISTS "${NCBI_PTBCFG_PROJECT_TAGS}")
2220    if (NOT IS_DIRECTORY "${NCBI_PTBCFG_PROJECT_TAGS}")
2221        file(STRINGS "${NCBI_PTBCFG_PROJECT_TAGS}" NCBI_PTBCFG_PROJECT_TAGS)
2222    endif()
2223endif()
2224
2225if(DEFINED NCBI_PTBCFG_PROJECT_TARGETS AND EXISTS "${NCBI_PTBCFG_PROJECT_TARGETS}")
2226    if (NOT IS_DIRECTORY "${NCBI_PTBCFG_PROJECT_TARGETS}")
2227        file(STRINGS "${NCBI_PTBCFG_PROJECT_TARGETS}" NCBI_PTBCFG_PROJECT_TARGETS)
2228    endif()
2229endif()
2230
2231if(DEFINED NCBI_VERBOSE_PROJECTS)
2232    foreach(_prj IN LISTS NCBI_VERBOSE_PROJECTS)
2233        if ("${_prj}" STREQUAL "*")
2234            set(NCBI_VERBOSE_ALLPROJECTS   ON)
2235        else()
2236            set(NCBI_VERBOSE_PROJECT_${_prj}   ON)
2237        endif()
2238    endforeach()
2239endif()
2240