File: find_flex.cmake

package info (click to toggle)
openmpi 1.6.5-9.1%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 91,628 kB
  • ctags: 44,305
  • sloc: ansic: 408,966; cpp: 44,454; sh: 27,828; makefile: 10,486; asm: 3,882; python: 1,239; lex: 805; perl: 549; csh: 253; fortran: 232; f90: 126; tcl: 12
file content (106 lines) | stat: -rw-r--r-- 3,256 bytes parent folder | download | duplicates (2)
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
#
# Copyright (c) 2007-2009 High Performance Computing Center Stuttgart, 
#                         University of Stuttgart.  All rights reserved.
# $COPYRIGHT$
# 
# Additional copyrights may follow
# 
# $HEADER$
#


#
#  FLEX_FOUND - system has Flex
#  FLEX_EXECUTABLE - path of the flex executable
#  FLEX_VERSION - the version string, like "2.5.31"
#

MACRO(FIND_FLEX)
  
  IF(NOT FLEX_FOUND)
    MESSAGE(STATUS "Check for working flex...")

    # first find out if it's already installed somewhere
    FIND_PROGRAM(FLEX_EXECUTABLE_SYS NAMES flex)

    IF (WIN32)
      IF(FLEX_EXECUTABLE_SYS)
        SET(FLEX_EXECUTABLE ${FLEX_EXECUTABLE_SYS} CACHE FILEPATH "Flex")
      ELSE(FLEX_EXECUTABLE_SYS)
        IF(EXISTS ${CMAKE_SOURCE_DIR}/contrib/platform/win32/bin/flex.exe)
          # in case that no flex is installed, use our own version
          SET(FLEX_EXECUTABLE "${CMAKE_SOURCE_DIR}/contrib/platform/win32/bin/flex.exe" CACHE FILEPATH "Flex")
        ENDIF(EXISTS ${CMAKE_SOURCE_DIR}/contrib/platform/win32/bin/flex.exe)
      ENDIF(FLEX_EXECUTABLE_SYS)
    ELSE(WIN32)
      # nothing to do here at moment.
    ENDIF(WIN32)

    IF(FLEX_EXECUTABLE)
      SET(FLEX_FOUND TRUE CACHE INTERNAL "found flex")
      
      EXECUTE_PROCESS(COMMAND ${FLEX_EXECUTABLE} --version
        OUTPUT_VARIABLE _FLEX_VERSION
        )
      STRING (REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" FLEX_VERSION "${_FLEX_VERSION}")
    ENDIF(FLEX_EXECUTABLE)
    
    IF(FLEX_FOUND)
      IF(NOT Flex_FIND_QUIETLY)
        MESSAGE(STATUS "Check for working flex...done")
      ENDIF(NOT Flex_FIND_QUIETLY)
    ELSE(FLEX_FOUND)
      IF(Flex_FIND_REQUIRED)
        MESSAGE(STATUS "Check for working flex...failed")
      ENDIF(Flex_FIND_REQUIRED)
    ENDIF(FLEX_FOUND)
  ENDIF(NOT FLEX_FOUND)
ENDMACRO(FIND_FLEX)

#
# Generate the corresponding C file from the lex file,
# and add it in to the source list for the target.
#

MACRO(ADD_FLEX_FILE _sourcelist _source _prefix _output_dir)

  GET_FILENAME_COMPONENT(_in ${_source} ABSOLUTE)
  GET_FILENAME_COMPONENT(_basename ${_source} NAME_WE)


  STRING(LENGTH "${_prefix}" _prefix_length)
  IF(NOT _prefix_length EQUAL 0)
    SET(_out ${_output_dir}/${_basename}.c)
    SET(_args -P${_prefix})
  ELSE(NOT _prefix_length EQUAL 0)
    SET(_out ${_output_dir}/${_basename}.c)
  ENDIF(NOT _prefix_length EQUAL 0)

  #MESSAGE("${FLEX_EXECUTABLE} -o${_out} ${_args} ${_in}")

  IF(NOT DEFINED ${_basename}_DONE)

    MESSAGE(STATUS "parse ${_basename} with flex...")

    FILE(MAKE_DIRECTORY ${_output_dir})
    EXECUTE_PROCESS(
      COMMAND ${FLEX_EXECUTABLE} -o${_out} ${_args} ${_in}
      OUTPUT_VARIABLE    OUTPUT
      RESULT_VARIABLE    RESULT
      ERROR_VARIABLE     ERROR
      )

    IF (NOT ${RESULT} STREQUAL "1")
      MESSAGE(STATUS "${ERROR}parse ${_basename} with flex...done")
    ELSE (NOT ${RESULT} STREQUAL "1")
      MESSAGE(FATAL_ERROR "${ERROR}parse ${_basename} with flex...failed")
    ENDIF (NOT ${RESULT} STREQUAL "1")

    SET(${_basename}_DONE TRUE CACHE INTERNAL "${_basename} flex parse done")

  ENDIF(NOT DEFINED ${_basename}_DONE)

  SET(${_sourcelist} ${${_sourcelist}} ${_out} )
  SET_SOURCE_FILES_PROPERTIES(${_out} PROPERTIES COMPILE_DEFINITIONS YY_NO_UNISTD_H)

ENDMACRO(ADD_FLEX_FILE)