summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
blob: 502105142b45090870056020b714fc76589e77d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
project(jom)
cmake_minimum_required(VERSION 2.8.11)

set(CMAKE_AUTOMOC ON)

option(JOM_ENABLE_TESTS "Enable unit-testing for jom" OFF)

if(JOM_ENABLE_TESTS)
    enable_testing()
endif(JOM_ENABLE_TESTS)


# where to look first for cmake modules
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules;${CMAKE_MODULE_PATH}")

find_package(Qt5Core)

include_directories(
  ${CMAKE_BINARY_DIR}
  src/jomlib
)
if(MSVC)
    add_definitions(
      -D_CRT_SECURE_NO_DEPRECATE
    )
   # Qt disables the native wchar_t type, do it too to avoid linking issues
   set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Zc:wchar_t-" )
endif(MSVC)
add_definitions(
  -DQT_NO_CAST_TO_ASCII
  -DQT_USE_FAST_CONCATENATION
  -DQT_USE_FAST_OPERATOR_PLUS
  -DUNICODE
)

# in subdirectory src:
#
set(JOM_MOCS
    src/jomlib/targetexecutor.h
    src/jomlib/jomprocess.h
    src/jomlib/commandexecutor.h
    src/jomlib/jobclient.h
    src/jomlib/jobclientacquirehelper.h
)

set(JOM_SRCS
    src/jomlib/commandexecutor.cpp
    src/jomlib/dependencygraph.cpp
    src/jomlib/exception.cpp
    src/jomlib/fastfileinfo.cpp
    src/jomlib/filetime.cpp
    src/jomlib/helperfunctions.cpp
    src/jomlib/jobclient.cpp
    src/jomlib/jobclientacquirehelper.cpp
    src/jomlib/jobserver.cpp
    src/jomlib/macrotable.cpp
    src/jomlib/makefile.cpp
    src/jomlib/makefilefactory.cpp
    src/jomlib/makefilelinereader.cpp
    src/jomlib/options.cpp
    src/jomlib/parser.cpp
    src/jomlib/ppexpr_grammar.cpp
    src/jomlib/ppexprparser.cpp
    src/jomlib/preprocessor.cpp
    src/jomlib/targetexecutor.cpp
    src/jomlib/dependencygraph.h
    src/jomlib/exception.h
    src/jomlib/fastfileinfo.h
    src/jomlib/filetime.h
    src/jomlib/helperfunctions.h
    src/jomlib/macrotable.h
    src/jomlib/makefile.h
    src/jomlib/makefilefactory.h
    src/jomlib/makefilelinereader.h
    src/jomlib/options.h
    src/jomlib/parser.h
    src/jomlib/ppexpr_grammar_p.h
    src/jomlib/ppexprparser.h
    src/jomlib/preprocessor.h
    src/jomlib/stable.h
)

 # run moc on all headers and add the moc files to the SRCS
 list(APPEND JOM_SRCS ${JOM_GENERATED_SRCS} ${JOM_MOCS})

if(WIN32)
    list(APPEND JOM_SRCS
        src/jomlib/iocompletionport.h
        src/jomlib/iocompletionport.cpp
        src/jomlib/jomprocess.cpp
    )
else()
    add_definitions(
      -DUSE_QPROCESS
    )
    list(APPEND JOM_SRCS
        src/jomlib/jomprocess_qt.cpp
    )
endif()

 set(JOM_APP_MOCS
    src/app/application.h
)
 set(JOM_APP_SRCS
    src/app/main.cpp
    src/app/application.cpp
)
 list(APPEND JOM_APP_SRCS ${JOM_APP_GENERATED_SRCS} ${JOM_APP_MOCS})
 source_group("Generated Sources" FILES ${JOM_GENERATED_SRCS} ${JOM_APP_GENERATED_SRCS})

 add_executable(jom ${JOM_APP_SRCS} ${JOM_SRCS})
 if(WIN32)
    target_link_libraries(jom Qt5::Core ws2_32)
 else(WIN32)
    target_link_libraries(jom Qt5::Core)
 endif(WIN32)

 # install binaries to bin/, libraries to lib/ and import libraries to lib/ too
 install(TARGETS jom  RUNTIME DESTINATION bin
                      LIBRARY DESTINATION lib
                      ARCHIVE DESTINATION lib)

 # if we want to use tests:
 if(JOM_ENABLE_TESTS)
     # in subdirectory tests:
     set(TESTS_SRCS tests/tests.cpp tests/tests.h)
     add_executable(jom-test ${TESTS_SRCS} ${JOM_SRCS})
     target_link_libraries(jom-test Qt5::Core Qt5::Test)

     # copy the data directory 'makefiles' over into the build directory as the tests should be run from there
     file(GLOB_RECURSE JOM_TEST_DATA RELATIVE ${CMAKE_SOURCE_DIR}/tests/makefiles/ "tests/makefiles/*")
     file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/makefiles)
     foreach(_file ${JOM_TEST_DATA})
         configure_file(${CMAKE_SOURCE_DIR}/tests/makefiles/${_file} ${CMAKE_BINARY_DIR}/makefiles/${_file} COPY_ONLY)
     endforeach(_file ${JOM_TEST_DATA})

     # add one unit test per function:
     # you can run the unittests all at once using 'make test' from the build directory
     # to produce the list: jom-test --functions | sed 's|[(][)]||'
     set(TEST_NAMES
        includeFiles
        includeCycle
        macros
        invalidMacros
        preprocessorExpressions
        preprocessorDivideByZero
        preprocessorInvalidExpressions
        conditionals
        dotDirectives
        descriptionBlocks
        inferenceRules
        cycleInTargets
        dependentsWithSpace
        multipleTargets
        comments
        fileNameMacros
        fileNameMacrosInDependents
        windowsPathsInTargetName
        caseInsensitiveDependents
        environmentVariables
        ignoreExitCodes
        inlineFiles
        unicodeFiles
        builtin_cd
        suffixes
        nonexistentDependent
        outOfDateCheck
     )
     foreach(TEST_NAME ${TEST_NAMES})
        add_test(${TEST_NAME} jom-test ${TEST_NAME})
     endforeach()

 endif(JOM_ENABLE_TESTS)