29dc72b837503d2f1cc4102098e483f32e103ff7
[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_PATH  = Path to the java class containing the ALICE Rule Checker
8 # RULE_CHECKER       = Rules (defaults to ALICE rules!)
9 # RULE_CHECKER_PATCH = Perl script to be executed to patch preprocessor files
10 #
11
12 # We suppose that perl and java are present and working
13
14 Find_File(RULE_CHECKER_PATCH patch4alice.prl
15   /usr/local/IRST/patch ${ALICE}/local/IRST/patch /opt/IRST/patch)
16
17 If(RULE_CHECKER_PATCH)
18   Set(RULE_CHECKER_FOUND YES)
19   Set(RULE_CHECKER rules.ALICE.ALICERuleChecker)
20   String(REPLACE "/patch/patch4alice.prl" "" 
21     RULE_CHECKER_PATH "${RULE_CHECKER_PATCH}")
22   
23 Else(RULE_CHECKER_PATCH)
24   Set(RULE_CHECKER_FOUND NO)
25   Message(STATUS "RuleChecker not installed on this system")
26   
27 EndIf(RULE_CHECKER_PATCH)
28
29
30 #_______________________________________________________________________________
31 Function(CheckViols LIB SRCS)
32
33   If(RULE_CHECKER_FOUND)
34     String(REGEX MATCHALL "[^ ]*.cxx" CXXSRCS "${SRCS}")
35     
36     Set(_checkDir "${CMAKE_CURRENT_BINARY_DIR}/check")
37     
38     If(NOT EXISTS ${_checkDir})
39       File(MAKE_DIRECTORY ${_checkDir})
40     EndIf(NOT EXISTS ${_checkDir})
41     
42     Set(_inc_dirs)
43     Foreach(_dir ${INCLUDE_DIRECTORIES})
44       Set(_inc_dirs ${_inc_dirs} -I${_dir})
45     EndForeach(_dir ${INCLUDE_DIRECTORIES})
46     
47     Set(VIOLS)
48     Foreach(_checkFile ${CXXSRCS})
49       Get_Filename_Component(_checkFilePath ${_checkFile} PATH)
50       If(NOT EXISTS ${_checkDir}/${_checkFilePath})
51         File(MAKE_DIRECTORY ${_checkDir}/${_checkFilePath})
52       EndIf(NOT EXISTS ${_checkDir}/${_checkFilePath})
53       String(REGEX REPLACE "([^;]*).cxx" "${_checkDir}/\\1.viol" _violFile "${_checkFile}")
54       String(REGEX REPLACE "([^;]*).cxx" "\\1.i" _tempFile_in ${_checkFile})
55       Add_Custom_Command(
56         OUTPUT ${_violFile}
57         COMMAND ${CMAKE_CXX_COMPILER} 
58         ARGS -E ${CMAKE_CXX_FLAGS} ${_inc_dirs} -I. ${CMAKE_CURRENT_SOURCE_DIR}/${_checkFile} > ${_tempFile_in}
59         COMMAND ${RULE_CHECKER_PATCH} ARGS ${_tempFile_in}
60         COMMAND CLASSPATH=${RULE_CHECKER_PATH} java ${RULE_CHECKER} 
61         ARGS ${_tempFile_in} ${CMAKE_CURRENT_SOURCE_DIR} > ${_violFile}
62         DEPENDS ${_checkFile}
63         WORKING_DIRECTORY ${_checkDir})
64       Set(VIOLS ${VIOLS} ${_violFile})
65     EndForeach(_checkFile ${CXXSRCS})
66     
67     Add_Custom_Target(check-${LIB} DEPENDS ${VIOLS})
68     Add_Dependencies(check-all check-${LIB})
69
70   EndIf(RULE_CHECKER_FOUND)
71     
72 EndFunction (CheckViols)
73
74 #_______________________________________________________________________________
75 Function(CheckViolsNew LIB SRCS)
76
77   If(RULE_CHECKER_FOUND)
78     Set(_FactExt $ENV{ALICE}/local/ALICENewRuleChecker/FactExtractor/FactExtractor.jar)
79     Set(_RuleCheck $ENV{ALICE}/local/ALICENewRuleChecker/NewRuleChecker/NewRuleChecker.jar)
80
81     String(REGEX MATCHALL "[^ ]*.cxx" CXXSRCS "${SRCS}")
82     
83     Set(_checkDir "${CMAKE_CURRENT_BINARY_DIR}/check_new")
84     
85     If(NOT EXISTS ${_checkDir})
86       File(MAKE_DIRECTORY ${_checkDir})
87     EndIf(NOT EXISTS ${_checkDir})
88     
89     Set(_inc_dirs)
90     Foreach(_dir ${INCLUDE_DIRECTORIES})
91       Set(_inc_dirs ${_inc_dirs} -I${_dir})
92     EndForeach(_dir ${INCLUDE_DIRECTORIES})
93     
94     Set(VIOLS)
95     Foreach(_checkFile ${CXXSRCS})
96       Get_Filename_Component(_checkFilePath ${_checkFile} PATH)
97       If(NOT EXISTS ${_checkDir}/${_checkFilePath})
98         File(MAKE_DIRECTORY ${_checkDir}/${_checkFilePath})
99       EndIf(NOT EXISTS ${_checkDir}/${_checkFilePath})
100       String(REGEX REPLACE "([^;]*).cxx" "${_checkDir}/\\1.cxx.xml" _srcxml "${_checkFile}")
101       String(REGEX REPLACE "([^;]*).cxx" "${_checkDir}/\\1.h.xml"   _hdrxml "${_checkFile}")
102       String(REGEX REPLACE "([^;]*).cxx" "${_checkDir}/\\1.h.viol"   _violFile "${_checkFile}")
103       String(REGEX REPLACE "([^;]*).cxx" "\\1.h" _checkHead "${_checkFile}")
104       Add_Custom_Command(
105         OUTPUT ${_violFile}
106         COMMAND src2srcml 
107         ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_checkFile} ${_srcxml}
108         COMMAND src2srcml 
109         ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_checkHead} ${_hdrxml}
110         COMMAND java
111         ARGS -jar ${_FactExt} 
112         COMMAND ${RULE_CHECKER_PATCH} ARGS ${_tempFile_in}
113         COMMAND CLASSPATH=${RULE_CHECKER_PATH} java ${RULE_CHECKER} 
114         ARGS ${_tempFile_in} ${CMAKE_CURRENT_SOURCE_DIR} > ${_violFile}
115         DEPENDS ${_checkFile}
116         WORKING_DIRECTORY ${_checkDir})
117       Set(VIOLS ${VIOLS} ${_violFile})
118     EndForeach(_checkFile ${CXXSRCS})
119     
120     Add_Custom_Target(check-${LIB} DEPENDS ${VIOLS})
121     Add_Dependencies(check-all check-${LIB})
122
123   EndIf(RULE_CHECKER_FOUND)
124     
125 EndFunction (CheckViolsNew)
126