summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
blob: 4d25a0b6c63f2473dc464f6b7a6a54cd7c5a966b (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
project(jom)
cmake_minimum_required(VERSION 2.6)


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}")

# search for Qt4 - it is required
find_package(Qt4 REQUIRED)

# some general definitions & the directories that should be included
add_definitions(${QT_DEFINITIONS})
include_directories(
  ${QT_INCLUDES}
  ${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_FROM_ASCII
#  -DQT_NO_CAST_TO_ASCII
#  -DQT_USE_FAST_CONCATENATION
#  -DQT_USE_FAST_OPERATOR_PLUS
)

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

set(JOM_SRCS src/jomlib/commandexecutor.cpp
             src/jomlib/dependencygraph.cpp
             src/jomlib/exception.cpp
             src/jomlib/fileinfo.cpp
             src/jomlib/helperfunctions.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
             )

# run moc on all headers and add the moc files to the SRCS
qt4_wrap_cpp(JOM_SRCS ${JOM_MOCS})
add_executable(jom src/app/main.cpp ${JOM_SRCS})
target_link_libraries(jom ${QT_QTMAIN_LIBRARY} ${QT_QTCORE_LIBRARY} ws2_32)

# 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:
    qt4_wrap_cpp(JOM_SRCS tests/tests.h)
    set(TESTS_SRCS tests/tests.cpp)
    add_executable(jom-test tests.moc ${TESTS_SRCS} ${JOM_SRCS})
    target_link_libraries(jom-test ${QT_QTMAIN_LIBRARY} 
                                   ${QT_QTCORE_LIBRARY} 
                                   ${QT_QTTEST_LIBRARY})

    # 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
    add_test(includeFiles jom-test includeFiles)
    add_test(includeCycle jom-test includeCycle)
    add_test(macros jom-test macros)
    add_test(inferenceRules jom-test inferenceRules)
    add_test(cycleInTargets jom-test cycleInTargets)
    add_test(multipleTargets jom-test multipleTargets)
    add_test(multipleTargetsFail jom-test multipleTargetsFail)
    add_test(comments jom-test comments)
    add_test(fileNameMacros jom-test fileNameMacros)

endif(JOM_ENABLE_TESTS)