aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/ryml/ext/c4core/cmake/c4CatSources.cmake
blob: 1633989af11403a9adada70b0d5e5271e60350c3 (plain) (blame)
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
if(NOT _c4CatSourcesIncluded)
set(_c4CatSourcesIncluded ON)


#------------------------------------------------------------------------------
# concatenate the source files to an output file, adding preprocessor adjustment
# for correct file/line reporting
function(c4_cat_sources files output umbrella_target)
    _c4_cat_sources_create_cat(cat)
    c4_to_full_path("${files}" full_files) # we must work with full paths
    c4_separate_list("${full_files}" sepfiles) # and use a string instead of a list
    c4_dbg("${_c4_prefix}: catting sources to ${output}")
    if(NOT EXISTS "${output}")
        # the cat command is executed at build time, but we need the output
        # file to exist to be able to create the target. so to bootstrap, just
        # run the command now
        c4_dbg("${_c4_prefix}: creating ${output} for the first time")
        execute_process(
            COMMAND ${cat} "${sepfiles}" "${output}"
            WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
            )
    else()
        c4_dbg("output exists: ${output}")
    endif()
    # add a custom command invoking our cat script for the input files
    add_custom_command(OUTPUT ${output}
        COMMAND ${cat} "${sepfiles}" "${output}"
        DEPENDS ${files}
        WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
        COMMENT "concatenating sources to ${output}")
    if(NOT TARGET ${umbrella_target})
        add_custom_target(${umbrella_target} DEPENDS ${output} ${files})
    endif()
endfunction(c4_cat_sources)


#------------------------------------------------------------------------------
# get a cat script
function(_c4_cat_sources_create_cat catfile)
    # create a script to concatenate the sources
    if(WIN32)
        set(cat ${CMAKE_BINARY_DIR}/_c4catfiles.bat)
        set(cattmp ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/_c4catfiles.bat)
    else()
        set(cat ${CMAKE_BINARY_DIR}/_c4catfiles.sh)
        set(cattmp ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/_c4catfiles.sh)
    endif()
    set(${catfile} ${cat} PARENT_SCOPE)
    if(NOT EXISTS ${cat})
        if(WIN32)
            file(WRITE ${cattmp} "
setlocal EnableDelayedExpansion
set \"src_files=%1\"
set \"out_file=%2\"
echo.>\"out_file%\"
for %%f in (%src_files%) do (
    echo.>>\"%out_file%\"
    echo.>>\"%out_file%\"
    echo \"/*BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB*/\".>>\"%out_file%\"
    echo \"/*BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB*/\".>>\"%out_file%\"
    echo \"/*BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB*/\".>>\"%out_file%\"
    echo \"#line 1 \\\"%%f\\\" // reset __LINE__ and __FILE__ to the correct value\".>>\"%out_file%\"
    type %%f>>\"%out_file%\"
)
")
        else()
            file(WRITE ${cattmp} "#!/bin/sh

src_files=$1
out_file=$2
#echo \"src_files $src_files\"
#echo \"out_file $out_file\"

cat > $out_file << EOF
// DO NOT EDIT.
// this is an auto-generated file, and will be overwritten
EOF
for f in $src_files ; do
    cat >> $out_file <<EOF


/*BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB*/
/*BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB*/
/*BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB*/
#line 1 \"$f\"
EOF
    cat $f >> $out_file
done

echo \"Wrote output to $out_file\"
")
        endif()
        # add execute permissions
        get_filename_component(catdir ${cat} DIRECTORY)
        file(COPY ${cattmp} DESTINATION ${catdir}
            FILE_PERMISSIONS
            OWNER_READ OWNER_WRITE OWNER_EXECUTE
            GROUP_READ GROUP_EXECUTE
            WORLD_READ WORLD_EXECUTE
            )
    endif()
endfunction()


endif(NOT _c4CatSourcesIncluded)