File: GenerateHeaders.cmake

package info (click to toggle)
quantlib 1.41-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 41,480 kB
  • sloc: cpp: 400,885; makefile: 6,547; python: 214; sh: 150; lisp: 86
file content (115 lines) | stat: -rw-r--r-- 5,777 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Generate quantlib.hpp header for the source_dir
function(generate_ql_header source_dir binary_dir)
    set(children_hpp "")
    set(children_dir "")
    file(WRITE "${binary_dir}/ql/quantlib.hpp"
        "/* This file is automatically generated; do not edit. */\n\n"
        "#include <ql/qldefines.hpp>\n"
        "#include <ql/version.hpp>\n"
        "#if !defined(BOOST_ALL_NO_LIB) && defined(BOOST_MSVC)\n"
        "#  include <ql/auto_link.hpp>\n"
        "#endif\n\n")
    file(GLOB children_hpp RELATIVE ${source_dir} "${source_dir}/ql/*.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "auto_link.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "config.*.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "mathconstants.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "qldefines.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "quantlib.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "version.hpp")

    list(FILTER children_hpp EXCLUDE REGEX "functional.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "tuple.hpp")

    foreach(child ${children_hpp})
        file(APPEND "${binary_dir}/ql/quantlib.hpp" "#include <${child}>\n")
    endforeach()
    file(APPEND "${binary_dir}/ql/quantlib.hpp" "\n")
    file(GLOB children_dir RELATIVE ${source_dir} "${source_dir}/ql/*")
    list(FILTER children_dir EXCLUDE REGEX "CMakeFiles")
    list(FILTER children_dir EXCLUDE REGEX "^ql/\\..*")
    foreach(child ${children_dir})
        if (IS_DIRECTORY "${source_dir}/${child}")
            file(APPEND "${binary_dir}/ql/quantlib.hpp" "#include <${child}/all.hpp>\n")
        endif()
    endforeach()
endfunction()

# Generate all.hpp for the source_dir and recurse down the path
function(generate_dir_headers source_dir binary_dir)
    set(children_hpp "")
    set(children_dir "")
    set(children_all "")
    file(GLOB children_hpp RELATIVE ${source_dir} "${source_dir}/*.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "all.hpp")

    list(FILTER children_hpp EXCLUDE REGEX "subperiodcoupon.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "fdmultiperiodengine.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "fdvanillaengine.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "sampledcurve.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "bsmtermoperator.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "fdtypedefs.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "parallelevolver.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "fixedratebondforward.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "tona.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "arithmeticaverageois.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "arithmeticoisratehelper.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "creditriskplus.hpp")
    list(FILTER children_hpp EXCLUDE REGEX "sensitivityanalysis.hpp")

    # These headers were moved to another location.
    # Therefore, we can ignore them as they only contain a warning and the new includes.
    if (${source_dir} MATCHES "experimental" AND ${source_dir} MATCHES "exoticoptions")
        list(FILTER children_hpp EXCLUDE REGEX "analyticholderextensibleoptionengine.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "analyticpartialtimebarrieroptionengine.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "analyticpdfhestonengine.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "analytictwoassetbarrierengine.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "analytictwoassetcorrelationengine.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "analyticwriterextensibleoptionengine.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "continuousarithmeticasianlevyengine.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "holderextensibleoption.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "partialtimebarrieroption.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "twoassetbarrieroption.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "twoassetcorrelationoption.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "writerextensibleoption.hpp")
    endif ()

    if (${source_dir} MATCHES "experimental" AND ${source_dir} MATCHES "fx")
        list(FILTER children_hpp EXCLUDE REGEX "blackdeltacalculator.hpp")
        list(FILTER children_hpp EXCLUDE REGEX "deltavolquote.hpp")
    endif ()

    file(GLOB children_dir RELATIVE ${source_dir} "${source_dir}/*")
    list(FILTER children_dir EXCLUDE REGEX "CMakeFiles")
    list(FILTER children_dir EXCLUDE REGEX "^\\..*")
    foreach(child ${children_hpp})
        list(APPEND children_all "${source_dir}/${child}")
    endforeach()
    foreach(child ${children_dir})
        if (IS_DIRECTORY "${source_dir}/${child}")
            list(APPEND children_all "${source_dir}/${child}/all.hpp")
            # Recurse down this subpath
            generate_dir_headers("${source_dir}/${child}" "${binary_dir}/${child}")
        endif()
    endforeach()
    file(WRITE "${binary_dir}/all.hpp"
        "/* This file is automatically generated; do not edit. */\n\n")
    foreach(child ${children_all})
        file(RELATIVE_PATH all_path ${SOURCE_DIR} ${child})
        file(APPEND "${binary_dir}/all.hpp" "#include <${all_path}>\n")
    endforeach()
endfunction()

# Call generate_dir_headers for each directory at this top level (ql/)
function(generate_all_headers source_dir binary_dir)
    file(GLOB children RELATIVE ${source_dir} "${source_dir}/*")
    list(FILTER children EXCLUDE REGEX "^\\..*")
    foreach(child ${children})
        if (IS_DIRECTORY "${source_dir}/${child}")
            generate_dir_headers("${source_dir}/${child}" "${binary_dir}/${child}")
        endif()
    endforeach()
endfunction()

# Entry point
generate_ql_header(${SOURCE_DIR} ${BINARY_DIR})
generate_all_headers("${SOURCE_DIR}/ql" "${BINARY_DIR}/ql")