File: InstallShellScript.cmake

package info (click to toggle)
capstats 0.31-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 488 kB
  • sloc: cpp: 498; sh: 165; makefile: 38
file content (59 lines) | stat: -rw-r--r-- 2,408 bytes parent folder | download | duplicates (3)
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
# Schedules a file to be installed by the 'install' target, but first
# transformed by configure_file(... @ONLY) as well as by changing the
# shell script's hashbang (#!) line to use the absolute path to the
# interpreter in the path of the user running ./configure (or CMake equiv.).
#
# Hashbangs are not transformed when in binary packaging or cross-compiling
# mode because that can result in inserting paths on the build system
# that are not valid on the target system.
#
# _dstdir: absolute path to the directory in which to install the transformed
#     source file
# _srcfile: path relevant to CMAKE_CURRENT_SOURCE_DIR pointing to the shell
#     script to install
# [_dstfilename]: an optional argument for how to (re)name the file as
#     it's installed inside _dstdir

macro(InstallShellScript _dstdir _srcfile)
    if (NOT "${ARGN}" STREQUAL "")
        set(_dstfilename ${ARGN})
    else ()
        get_filename_component(_dstfilename ${_srcfile} NAME)
    endif ()

    set(orig_file ${CMAKE_CURRENT_SOURCE_DIR}/${_srcfile})
    set(configed_file ${CMAKE_CURRENT_BINARY_DIR}/${_srcfile})
    set(dehashbanged_file ${CMAKE_CURRENT_BINARY_DIR}/${_srcfile}.dehashbanged)

    configure_file(${orig_file} ${configed_file} @ONLY)

    file(READ ${configed_file} _srclines)
    file(WRITE ${dehashbanged_file} "")

    if (NOT BINARY_PACKAGING_MODE AND NOT CMAKE_CROSSCOMPILING)
        set(_regex "^#![ ]*/usr/bin/env[ ]+([^\n ]*)")
        string(REGEX MATCH ${_regex} _match ${_srclines})
        if (_match)
            set(_shell ${CMAKE_MATCH_1})
            if ( (${_shell} STREQUAL "python" OR ${_shell} STREQUAL "python3") AND PYTHON_EXECUTABLE )
                set(${_shell}_interp ${PYTHON_EXECUTABLE})
            else ()
                find_program(${_shell}_interp ${_shell})
            endif ()
            if (NOT ${_shell}_interp)
                message(FATAL_ERROR
                       "Absolute path to interpreter '${_shell}' not found, "
                       "failed to configure shell script: ${orig_file}")
            endif ()

            string(REGEX REPLACE ${_regex} "#!${${_shell}_interp}"
                   _srclines "${_srclines}")
        endif ()
    endif ()

    file(WRITE ${dehashbanged_file} "${_srclines}")

    install(PROGRAMS ${dehashbanged_file}
            DESTINATION ${_dstdir}
            RENAME ${_dstfilename})
endmacro(InstallShellScript)