File: MCUtil.cmake

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,113,256 kB
  • sloc: ansic: 40,697; python: 25,137; yacc: 8,438; sh: 5,405; javascript: 4,596; lex: 1,632; cpp: 742; perl: 296; lisp: 273; makefile: 226; fortran: 132
file content (294 lines) | stat: -rw-r--r-- 9,702 bytes parent folder | download
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
include_guard()

include(PlatformDefaults)

# Install library files into lib/${FLAVOR}, while skipping unneeded files
macro(installLib path)
  set(dest "${DEST_TOOLDIR}")

  install (
    DIRECTORY "${path}"
    DESTINATION "${dest}"
    PATTERN "Makefile*" EXCLUDE  # skip makefiles
    PATTERN "#*"        EXCLUDE  # skip backup files
    PATTERN ".*"        EXCLUDE  # skip hidden files
    PATTERN "*.out"     EXCLUDE  # skip binary files
    PATTERN "*.*.in"    EXCLUDE  # skip configure processed template files
  )
endmacro()

  # Macro for configuring every file in a directory
  # *.in files are configured, while other files are copied unless target exists
  macro(configure_directory IN_GLOB OUT_DIR)
    file(GLOB tmp "${IN_GLOB}")
    foreach(file_in ${tmp})
      get_filename_component(filename "${file_in}" NAME)      # /doc/man/example.1.in -> example.1.in
      string(REGEX MATCH "^(.+)\\.in" matches "${filename}")  # example.1.in -> example.1
      if(matches)
        # from IN/doc/man/example.1.in -> OUT/doc/man/example.1
        configure_file (
          "${file_in}"
          "${OUT_DIR}/${CMAKE_MATCH_1}"
          )
      else()
        # do not overwrite files created by configure
        if(NOT (EXISTS "${OUT_DIR}/${filename}") OR ("${file_in}" IS_NEWER_THAN "${OUT_DIR}/${filename}"))
          if( IS_SYMLINK "${file_in}" )
            #follow symlink
            get_filename_component( file_in "${file_in}" REALPATH )
          endif()
          file( COPY "${file_in}" DESTINATION "${OUT_DIR}")
        endif()
      endif()
    endforeach()
  endmacro()

# Check whether we are being run through mkdist
macro(isMkDist outvar)
  string(CONFIGURE "@MCCODE_NAME@" TMP @ONLY) # TMP is empty unless MCCODE_NAME is set already
  string(LENGTH "${TMP}" ${outvar})
endmacro()


# Setup McCode constants using either mkdist or Git-defaults
macro(setupMCCODE FLAVOR)

  # Use .pl suffix on any platform
  set(PERL_SUFFIX "pl")

  # Check for WINDOWS
  if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
    set(WINDOWS true)
  endif()

  # Set Nexus linking flag
  if(USE_NEXUS)
    set(CMAKE_C_FLAGS  "${CMAKE_C_FLAGS}  -lNeXus")
    set(CMAKE_C_LFLAGS "${CMAKE_C_LFLAGS} -lNeXus")
  endif()

  # Set 32-bit flags
  if(ARCH EQUAL "i386")
    set(CMAKE_C_FLAGS  "-m32")
    set(CMAKE_C_LFLAGS "${CMAKE_C_LFLAGS} -m32")
  endif()

  if(DEFINED ARCH)
    message(STATUS "Compiling for ${ARCH} ${CMAKE_SYSTEM_NAME}")
  else()
    message(STATUS "Compiling for ${CMAKE_SYSTEM_NAME}")
  endif()


  # Set macros
  if("${FLAVOR}" STREQUAL "mcstas")
    set(FLAVOR           "mcstas")
    set(FLAVOR_UPPER     "MCSTAS")

    set(FLAVOR_LIB       "nlib")
    set(MCCODE_LIBENV    "${FLAVOR_UPPER}")

    set(MCCODE_PARTICLE  "neutron")
    set(MCCODE_PARTICLE_CODE 2112)
    set(MCCODE_PROJECT    1)

    set(MCCODE_PREFIX     "mc")
  endif()

  if("${FLAVOR}" STREQUAL "mcxtrace")
    set(FLAVOR           "mcxtrace")
    set(FLAVOR_UPPER     "MCXTRACE")

    set(FLAVOR_LIB       "xlib")
    set(MCCODE_LIBENV    "${FLAVOR_UPPER}")

    set(MCCODE_PARTICLE "xray")
    set(MCCODE_PROJECT   2)
    set(MCCODE_PARTICLE_CODE 22)

    set(MCCODE_PREFIX     "mx")
  endif()

  # Set fallback "year"
  if("${MCCODE_YEAR}" STREQUAL "")
    set(MCCODE_YEAR "2100")
  endif()

  set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} APPEND PROPERTY COMPILE_DEFINITIONS
    FLAVOR="${FLAVOR}" FLAVOR_UPPER="${FLAVOR_UPPER}"
    FLAVOR_LIB="${FLAVOR_LIB}"
    MCCODE_LIBENV="${MCCODE_LIBENV}" MCCODE_PARTICLE="${MCCODE_PARTICLE}"
    MCCODE_PROJECT=${MCCODE_PROJECT}
    )

  # Check for mkdist values
  isMkDist(MKDIST)

  if(MKDIST)
    ## Set mkdist-provided version
    string(CONFIGURE "@MCCODE_VERSION@"   MCCODE_VERSION @ONLY)
    string(CONFIGURE "@MCCODE_NAME@"      MCCODE_NAME @ONLY)    # e.g. McStas or McXtrace
    string(CONFIGURE "@MCCODE_DATE@"      MCCODE_DATE @ONLY)    # e.g. MONTH. DAY, YEAR
    string(CONFIGURE "@MCCODE_STRING@"    MCCODE_STRING @ONLY)  # MCCODE_NAME MCCODE_VERSION - MCCODE_DATE
    string(CONFIGURE "@MCCODE_TARNAME@"   MCCODE_TARNAME @ONLY)
    string(CONFIGURE "@MCCODE_PARTICLE@"  MCCODE_PARTICLE @ONLY)  # neutron or xray
    string(CONFIGURE "@FLAVOR_UPPER@"     FLAVOR_UPPER @ONLY)   # MCSTAS or MCXTRACE
    string(CONFIGURE "@FLAVOR@"           FLAVOR @ONLY)         # mcstas or mcxtrace
    string(CONFIGURE "@MCCODE_PREFIX@"    MCCODE_PREFIX @ONLY)  # mc or mx
    
    message(STATUS "Using provided settings MCCODE_VERSION=${MCCODE_VERSION}, MCCODE_NAME=${MCCODE_NAME}, MCCODE_DATE=${MCCODE_DATE}, MCCODE_STRING=${MCCODE_STRING}, MCCODE_TARNAME=${MCCODE_TARNAME}")
  else()
    ## Set Git-specific version
    if (MCVERSION)
      set(MCCODE_VERSION "${MCVERSION}")
    else ()
      set(MCCODE_VERSION "3.999.999-git")
    endif()
    set(MCCODE_NAME "${FLAVOR}")
    set(MCCODE_DATE "git")
    set(MCCODE_STRING "${NAME} ${MCCODE_VERSION}, ${MCCODE_DATE}")
    set(MCCODE_TARNAME "${FLAVOR}")
  endif()

  # Split incoming MCCODE_VERSION to list
  string(REPLACE "." ";" MCCODE_VERSION_LIST ${MCCODE_VERSION})
  list(LENGTH MCCODE_VERSION_LIST MCCODE_VERSION_LIST_LEN)

  ## CPack Package versioning
  set(MCCODE_MAJOR 3)
  set(MCCODE_MINOR 999)
  set(MCCODE_PATCH 999)
  if (${MCCODE_VERSION_LIST_LEN} GREATER 0)
    list(GET MCCODE_VERSION_LIST 0 MCCODE_MAJOR)
  endif()
  if (${MCCODE_VERSION_LIST_LEN} GREATER 1)
    list(GET MCCODE_VERSION_LIST 1 MCCODE_MINOR)
  endif()
  if (${MCCODE_VERSION_LIST_LEN} GREATER 2)
    list(GET MCCODE_VERSION_LIST 2 MCCODE_PATCH)
  endif()

  set(CPACK_PACKAGE_VERSION       "${MCCODE_MAJOR}.${MCCODE_MINOR}.${MCCODE_PATCH}")
  set(CPACK_PACKAGE_VERSION_MAJOR "${MCCODE_MAJOR}")
  set(CPACK_PACKAGE_VERSION_MINOR "${MCCODE_MINOR}")
  set(CPACK_PACKAGE_VERSION_PATCH "${MCCODE_PATCH}")

  include(Locations)
  # During migration set these as well:
  set( bin "${DEST_BINDIR}" )
  set( lib "${DEST_LIBDIR}" )

  # Set default installation paths
  foreach(name bin doc etc include lib man sbin share src)
    if(NOT(DEFINED ${name}))
      set(${name} "${name}")
    endif()
  endforeach()

  if(WINDOWS)
    # Fix installation root
    if ( MCCODE_USE_LEGACY_DESTINATIONS )
      set(CMAKE_INSTALL_PREFIX "${FLAVOR}-${MCCODE_VERSION}")
      set(CPACK_NSIS_INSTALL_ROOT "C:\\\\${FLAVOR}-${MCCODE_VERSION}")
    else()
      set(CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
      set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
    endif()

    set(CPACK_NSIS_UNINSTALL_NAME "${CMAKE_PROJECT_NAME}-uninstall")

    # Set BIN and LIB paths
    set(MCCODE_BIN "${DEST_BINDIR}")
    set(MCCODE_LIB "${DEST_LIBDIR}")
    # Replace '/' with '\'
    string(REPLACE "/" "\\\\" MCCODE_BIN "${MCCODE_BIN}")
    string(REPLACE "/" "\\\\" MCCODE_LIB "${CMAKE_INSTALL_PREFIX}/${DEST_DATADIR_COMPS}")
  else()
    set(MCCODE_BIN "${DEST_BINDIR}")
    set(MCCODE_LIB "${CMAKE_INSTALL_PREFIX}/${DEST_DATADIR_COMPS}")
  endif()

  #FIXME: ^^ Perhaps we should use something other than MCCODE_LIB for this path

  # Helper for adding leading "."
  macro(addDot name val)
    if(NOT DEFINED ${name} AND NOT ${val} STREQUAL "")
      set(${name} ".${val}")
    endif()
  endmacro()

  # Set instrument suffix (after compilation)
  if(NOT DEFINED MCCODE_EXECUTABLE_SUFFIX)
    if(DEFINED EXE_SUFFIX)
      set(MCCODE_EXECUTABLE_SUFFIX "${EXE_SUFFIX}")
    else()
      set(MCCODE_EXECUTABLE_SUFFIX "out")
    endif()
  endif()

  # Define suffix-macros that include a leading dot "."
  addDot(DOT_EXE_SUFFIX "${MCCODE_EXE_SUFFIX}")
  addDot(DOT_OUT_SUFFIX "${OUT_SUFFIX}")

  addDot(DOT_PYTHON_SUFFIX "${PYTHON_SUFFIX}")
  addDot(DOT_PERL_SUFFIX   "${PERL_SUFFIX}")

  if(WINDOWS)
    # On windows we actually do -pl.bat in case of Perl
    set(PL_TOOL_SUFFIX "-pl.bat")
  else()
    set(PL_TOOL_SUFFIX ".pl")
  endif()


  # Add some special Windows/Unix CPACK configuration
  if(WINDOWS)
    if ( MCCODE_USE_LEGACY_DESTINATIONS )
      # Fix installation folder (installs to ${ROOT}\${DIRECTORY})
      set(CPACK_PACKAGE_INSTALL_DIRECTORY "")

      # Windows program files do not have any version-suffix
      set(PROGRAM_SUFFIX "")

      # Create desktop links for mcgui py/pl and mccodego batch files
      set(CPACK_NSIS_CREATE_ICONS "CreateShortCut '$DESKTOP\\\\${MCCODE_PREFIX}gui-${MCCODE_VERSION}.lnk' '${CPACK_NSIS_INSTALL_ROOT}\\\\${DEST_BINDIR}\\\\${MCCODE_PREFIX}guistart.bat' ")
     set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$DESKTOP\\\\${FLAVOR}-shell-${MCCODE_VERSION}.lnk' '${CPACK_NSIS_INSTALL_ROOT}\\\\${DEST_BINDIR}\\\\${FLAVOR}go.bat' ")
    endif()
  endif()

  include(debian)
endmacro()

# Helper function which can look for input files. Apparently "file(GLOB ...)" is
# frowned upon by some people. However, the only provided alternative (hardcode
# all your filenames) is rather unappealing. We glob for files, but apply the
# CONFIGURE_DEPENDS keyword.

function( file_globsrc output_var )
  set(res "")
  foreach( pattern ${ARGN} )
    if ( NOT IS_ABSOLUTE "${pattern}")
      set(pattern "${PROJECT_SOURCE_DIR}/${pattern}")
    endif()
    file(GLOB tmp LIST_DIRECTORIES OFF CONFIGURE_DEPENDS "${pattern}" )
    #TODO: actually test the below
    foreach( f ${tmp} )
      if ( "${f}" MATCHES "~" )
        continue()
      endif()
      if ( "${f}" MATCHES "\\.in$" )
        continue()
      endif()
      if ( "${f}" MATCHES "#" )
        continue()
      endif()
      if ( "${f}" MATCHES "^\\." )
        continue()
      endif()
      #    PATTERN "Makefile*" EXCLUDE  # skip makefiles
      #    PATTERN "*.out"     EXCLUDE  # skip binary files
      list( APPEND res "${f}" )
    endforeach()
  endforeach()
  set(${output_var} "${res}" PARENT_SCOPE)
endfunction()