1
include(icecc.cmake)
2
project(apiextractor)
3
4
cmake_minimum_required(VERSION 2.6)
5
6
find_package(Qt4 4.5.0 REQUIRED)
7
8
find_package(LibXml2 2.6.32)
9
find_package(LibXslt 1.1.19)
10
11
option(DISABLE_DOCSTRINGS "Disable documentation extraction." FALSE)
12
option(BUILD_TESTS "Build tests." TRUE)
13
option(INSTALL_TESTS "Install tests" FALSE)
14
option(ENABLE_VERSION_SUFFIX "Used to use current version in suffix to generated files. This is used to allow multiples versions installed simultaneous." FALSE)
15
16
if (NOT DISABLE_DOCSTRINGS)
17
    if (NOT LIBXSLT_FOUND OR NOT LIBXML2_FOUND)
18
        set(DISABLE_DOCSTRINGS TRUE)
19
        message(WARNING "libxslt and/or libxml not found, disabling support to doc strings!")
20
    endif()
21
endif()
22
23
if(MSVC)
24
    set(CMAKE_CXX_FLAGS "/Zc:wchar_t- /GR /EHsc /DWIN32 /D_WINDOWS /D_SCL_SECURE_NO_WARNINGS")
25
elseif(CMAKE_HOST_UNIX)
26
    option(ENABLE_GCC_OPTIMIZATION "Enable specific GCC flags to optimize library size and performance. Only available on Release Mode" 0)
27
    if(NOT CYGWIN)
28
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fvisibility=hidden")
29
    endif()
30
    set(CMAKE_CXX_FLAGS_DEBUG "-g")
31
    if(ENABLE_GCC_OPTIMIZATION)
32
        set(CMAKE_BUILD_TYPE Release)
33
        set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -Os -Wno-strict-aliasing -Wl,-O1")
34
        if (NOT CMAKE_HOST_APPLE)
35
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--hash-style=gnu")
36
        endif()
37
    endif()
38
    if(NOT CMAKE_HOST_APPLE)
39
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/symbols.filter")
40
    endif()
41
endif()
42
43
if(NOT CMAKE_BUILD_TYPE)
44
    set(CMAKE_BUILD_TYPE Release)
45
endif()
46
47
if(BUILD_TESTS)
48
    set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/tests)
49
endif ()
50
51
set(apiextractor_MAJOR_VERSION 0)
52
set(apiextractor_MINOR_VERSION 10)
53
set(apiextractor_MICRO_VERSION 11)
54
set(apiextractor_VERSION "${apiextractor_MAJOR_VERSION}.${apiextractor_MINOR_VERSION}.${apiextractor_MICRO_VERSION}")
55
configure_file(apiextractorversion.h.in ${CMAKE_CURRENT_BINARY_DIR}/apiextractorversion.h @ONLY)
56
set(apiextractor_SOVERSION ${apiextractor_MAJOR_VERSION}.${apiextractor_MINOR_VERSION})
57
set(QT_USE_QTCORE 1)
58
set(QT_USE_QTXML 1)
59
include(${QT_USE_FILE})
60
add_definitions(${QT_DEFINITIONS})
61
add_definitions(-DQT_PLUGIN)
62
add_definitions(-DQT_SHARED)
63
add_definitions(-DRXX_ALLOCATOR_INIT_0)
64
65
if(ENABLE_VERSION_SUFFIX)
66
    set(apiextractor_SUFFIX "-${apiextractor_MAJOR_VERSION}.${apiextractor_MINOR_VERSION}")
67
else()
68
    set(apiextractor_SUFFIX "")
69
endif()
70
71
set(apiextractor_SRC
72
apiextractor.cpp
73
abstractmetabuilder.cpp
74
abstractmetalang.cpp
75
asttoxml.cpp
76
fileout.cpp
77
graph.cpp
78
reporthandler.cpp
79
typeparser.cpp
80
typesystem.cpp
81
include.cpp
82
typedatabase.cpp
83
parser/ast.cpp
84
parser/binder.cpp
85
parser/class_compiler.cpp
86
parser/codemodel.cpp
87
parser/codemodel_finder.cpp
88
parser/compiler_utils.cpp
89
parser/control.cpp
90
parser/declarator_compiler.cpp
91
parser/default_visitor.cpp
92
parser/dumptree.cpp
93
parser/lexer.cpp
94
parser/list.cpp
95
parser/name_compiler.cpp
96
parser/parser.cpp
97
parser/smallobject.cpp
98
parser/tokens.cpp
99
parser/type_compiler.cpp
100
parser/visitor.cpp
101
parser/rpp/builtin-macros.cpp
102
parser/rpp/preprocessor.cpp
103
)
104
105
if (NOT DISABLE_DOCSTRINGS)
106
    set(apiextractor_SRC
107
        ${apiextractor_SRC}
108
        docparser.cpp
109
        doxygenparser.cpp
110
        qtdocparser.cpp
111
    )
112
    set(APIEXTRACTOR_EXTRA_INCLUDES ${LIBXSLT_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
113
    set(APIEXTRACTOR_EXTRA_LIBRARIES ${LIBXSLT_LIBRARIES} ${LIBXML2_LIBRARIES})
114
else()
115
    set(APIEXTRACTOR_EXTRA_INCLUDES "")
116
    set(APIEXTRACTOR_EXTRA_LIBRARIES "")
117
endif()
118
119
set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})" FORCE)
120
121
qt4_add_resources(apiextractor_RCCS_SRC generator.qrc)
122
qt4_automoc(apiextractor_SRC)
123
124
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
125
                    ${CMAKE_CURRENT_BINARY_DIR}
126
                    ${CMAKE_CURRENT_SOURCE_DIR}/parser
127
                    ${CMAKE_CURRENT_SOURCE_DIR}/parser/rpp
128
                    ${QT_INCLUDE_DIR}
129
                    ${APIEXTRACTOR_EXTRA_INCLUDES}
130
                    )
131
132
add_library(apiextractor SHARED ${apiextractor_SRC} ${apiextractor_RCCS_SRC})
133
target_link_libraries(apiextractor ${APIEXTRACTOR_EXTRA_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTXMLPATTERNS_LIBRARY} ${QT_QTXML_LIBRARY})
134
set_target_properties(apiextractor PROPERTIES VERSION ${apiextractor_VERSION}
135
                                              SOVERSION ${apiextractor_SOVERSION}
136
                                              OUTPUT_NAME "apiextractor${apiextractor_SUFFIX}"
137
                                              DEFINE_SYMBOL APIEXTRACTOR_EXPORTS)
138
139
# uninstall target
140
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
141
add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
142
143
set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${apiextractor_VERSION})
144
add_custom_target(dist
145
    COMMAND mkdir -p "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}" &&
146
            git log > "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}/ChangeLog" &&
147
            git archive --prefix=${ARCHIVE_NAME}/ HEAD --format=tar --output="${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" &&
148
            tar -C "${CMAKE_BINARY_DIR}" --owner=root --group=root -r "${ARCHIVE_NAME}/ChangeLog" -f "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" &&
149
            bzip2 -f9 "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" &&
150
            echo "Source package created at ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2.\n"
151
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
152
153
set(root_HEADERS
154
apiextractormacros.h
155
abstractmetalang.h
156
apiextractor.h
157
graph.h
158
reporthandler.h
159
typesystem.h
160
fileout.h
161
docparser.h
162
qtdocparser.h
163
include.h
164
typedatabase.h
165
doxygenparser.h
166
)
167
168
if (BUILD_TESTS)
169
    enable_testing()
170
    add_subdirectory(tests)
171
endif()
172
add_subdirectory(data)
173
add_subdirectory(doc)
174
175
install(FILES ${root_HEADERS} DESTINATION include/apiextractor${apiextractor_SUFFIX})
176
install(TARGETS apiextractor EXPORT apiextractor
177
                             LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
178
                             ARCHIVE DESTINATION "${LIB_INSTALL_DIR}"
179
                             RUNTIME DESTINATION bin)