fixed bugs with the rule checker.
[u/mrichter/AliRoot.git] / cmake / modules / FindRuleChecker.cmake
1 # -*- mode: cmake -*-
2
3 # - Find IRST Code Analysis Tool (RuleChecker)
4 # Finds if the RuleChecker is installed and sets the following variables:
5 #
6 # RULE_CHECKER_FOUND = Boolean defining if Rule Checker is available
7 # RULE_CHECKER_SRCML = PATH TO src2srcml executable
8 # RULE_CHECKER_JAVA  = PATH TO java executable 
9 # RULE_CHECKER_JAR   = PATH TO NewRuleChecker.jar 
10 # RULE_CHECKER_RULES = Rules (defaults to ALICE rules!)
11
12 # We suppose that perl and java are present and working
13 Find_Program(RULE_CHECKER_SRCML src2srcml $ENV{PATH})
14 Find_Program(RULE_CHECKER_JAVA java $ENV{PATH})
15 #Message(STATUS "${RULE_CHECKER_SRCML} ${RULE_CHECKER_JAVA}")
16 Set(RULE_CHECKER_FOUND NO)
17 If(RULE_CHECKER_SRCML AND RULE_CHECKER_JAVA)
18   Find_File(RULE_CHECKER_JAR NAMES NewRuleChecker.jar PATHS $ENV{ALICE}/local/ALICENewRuleChecker/NewRuleChecker)
19   Find_File(RULE_CHECKER_RULES AliceCodingConventions.xml $ENV{ALICE}/local/ALICENewRuleChecker/NewRuleChecker/config)
20   #Message(STATUS "${RULE_CHECKER_JAR} ${RULE_CHECKER_RULES}")
21   If(RULE_CHECKER_JAR AND RULE_CHECKER_RULES)
22     Set(RULE_CHECKER_FOUND YES)
23     Message(STATUS "RuleChecker installed on this system")
24   EndIf(RULE_CHECKER_JAR AND RULE_CHECKER_RULES)
25 EndIf(RULE_CHECKER_SRCML AND RULE_CHECKER_JAVA)
26 If(NOT RULE_CHECKER_FOUND)
27   Message(STATUS "RuleChecker not installed on this system")
28 EndIf(NOT RULE_CHECKER_FOUND)
29
30 #______________________________________________________________________________________________________________
31 Function(CheckViols LIB SRCS)
32
33   If(RULE_CHECKER_FOUND)
34     Set(_FactExt $ENV{ALICE}/local/ALICENewRuleChecker/FactExtractor/FactExtractor.jar)
35     Set(_RuleCheck ${RULE_CHECKER_JAR})
36
37     String(REGEX MATCHALL "[^ ]*.cxx" CXXSRCS "${SRCS}")
38
39     Set(_checkDir "${CMAKE_CURRENT_BINARY_DIR}/check")
40     
41     If(NOT EXISTS ${_checkDir})
42       File(MAKE_DIRECTORY ${_checkDir})
43     EndIf(NOT EXISTS ${_checkDir})
44     
45     Set(_inc_dirs)
46     Foreach(_dir ${INCLUDE_DIRECTORIES})
47       Set(_inc_dirs ${_inc_dirs} -I${_dir})
48     EndForeach(_dir ${INCLUDE_DIRECTORIES})
49     
50     Set(VIOLS)
51     Foreach(_checkFile ${CXXSRCS})
52       Get_Filename_Component(_checkFilePath ${_checkFile} PATH)
53       If(NOT EXISTS ${_checkDir}/${_checkFilePath})
54         File(MAKE_DIRECTORY ${_checkDir}/${_checkFilePath})
55       EndIf(NOT EXISTS ${_checkDir}/${_checkFilePath})
56       String(REGEX REPLACE "([^;]*).cxx" "${_checkDir}/\\1.cxx.xml" _srcxml "${_checkFile}")
57       String(REGEX REPLACE "([^;]*).cxx" "${_checkDir}/\\1.h.xml"   _hdrxml "${_checkFile}")
58       String(REGEX REPLACE "([^;]*).cxx" "${_checkDir}/\\1.viol"    _violFile "${_checkFile}")
59       String(REGEX REPLACE "([^;]*).cxx" "\\1.h" _checkHead "${_checkFile}")
60       get_filename_component(_cxxFile ${_checkFile} ABSOLUTE)
61       string(REGEX REPLACE "([^;]*).cxx" "\\1.h" _hFile "${_cxxFile}")
62       if(EXISTS ${_cxxFile} AND NOT EXISTS ${_hFile})
63         Add_Custom_Command(
64           OUTPUT ${_violFile}
65           COMMAND src2srcml 
66           ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_checkFile} ${_srcxml}
67           COMMAND java -jar
68           ARGS ${_FactExt} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
69           COMMAND java -Xmx500m -jar ${RULE_CHECKER_JAR} 
70           ARGS ${_srcxml} ${_hdrxml} ${CMAKE_CURRENT_SOURCE_DIR}/factFile.xml ${RULE_CHECKER_RULES} > ${_violFile}
71           DEPENDS ${_checkFile}
72           WORKING_DIRECTORY ${_checkDir})
73       elseif(EXISTS ${_hFile} AND NOT EXISTS ${_cxxFile})
74         Add_Custom_Command(
75           OUTPUT ${_violFile}
76           COMMAND src2srcml 
77           ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_checkHead} ${_hdrxml}
78           COMMAND java -jar
79           ARGS ${_FactExt} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
80           COMMAND java -Xmx500m -jar ${RULE_CHECKER_JAR} 
81           ARGS ${_srcxml} ${_hdrxml} ${CMAKE_CURRENT_SOURCE_DIR}/factFile.xml ${RULE_CHECKER_RULES} > ${_violFile}
82           DEPENDS ${_checkHead}
83           WORKING_DIRECTORY ${_checkDir})
84       else()
85         Add_Custom_Command(
86           OUTPUT ${_violFile}
87           COMMAND src2srcml 
88           ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_checkFile} ${_srcxml}
89           COMMAND src2srcml 
90           ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_checkHead} ${_hdrxml}
91           COMMAND java -jar
92           ARGS ${_FactExt} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
93           COMMAND java -Xmx500m -jar ${RULE_CHECKER_JAR} 
94           ARGS ${_srcxml} ${_hdrxml} ${CMAKE_CURRENT_SOURCE_DIR}/factFile.xml ${RULE_CHECKER_RULES} > ${_violFile}
95           DEPENDS ${_checkFile} ${_checkHead}
96           WORKING_DIRECTORY ${_checkDir})
97       endif(EXISTS ${_cxxFile} AND NOT EXISTS ${_hFile})
98       Set(VIOLS ${VIOLS} ${_violFile})
99     EndForeach(_checkFile ${CXXSRCS})
100     
101     Add_Custom_Target(check-${LIB} DEPENDS ${VIOLS})
102     Add_Dependencies(check-all check-${LIB})
103
104   EndIf(RULE_CHECKER_FOUND)
105     
106 EndFunction (CheckViols)
107