#!/bin/bash
Script="${0##*/}"                   # Need 'Script' for wmakeFunctions messages
scriptsDir="${0%/*}"/scripts        # wmake/scripts directory
. "$scriptsDir"/wmakeFunctions      # Source wmake functions

# TODO: 检查当前路径是否是CMAKE_SOURCE_DIR
# 其中包含.vscode, CMakeLists.txt
# ...

# TODO: 根据OF环境变量,设置安装目录


printInfo() {
    if [ -f "$WM_DIR"/makefiles/info ]
    then
        make --no-print-directory -f "$WM_DIR"/makefiles/info "$@"
    else
        echo "OpenFOAM environment not set?" 1>&2
        return 1
    fi
}

if [ -z "$objectsDir" ]
then
    objectsDir="$MakeDir/$WM_OPTIONS"
fi
mkdir -p "$objectsDir"

make -s -f "$WM_DIR"/makefiles/files MAKE_DIR="$MakeDir" OBJECTS_DIR="$objectsDir" "$objectsDir"/options
make -s -f "$WM_DIR"/makefiles/files MAKE_DIR="$MakeDir" OBJECTS_DIR="$objectsDir"
s=`make --dry-run -f "$WM_DIR"/makefiles/general MAKE_DIR="$MakeDir" OBJECTS_DIR="$objectsDir" $targetType`

if [ $WM_COMPILE_OPTION = "Debug" ]; then
    echo $s
fi

link_flags_extra=`echo $s | grep -oP '(?<=Xlinker)(.*?)(?=Make)'`
link_flags_extra="-Xlinker $link_flags_extra"

OF_compile_flags=`printInfo "cxxflags"`
OF_compile_flags="$OF_compile_flags -iquote."
OF_link_flags="$OF_compile_flags $link_flags_extra"
# echo OF_compile_flags: $OF_compile_flags
# echo OF_link_flags: $OF_link_flags

OF_project_name=`cat Make/files | grep EXE | grep -oP '(?<=/).*$'`
OF_typestr="add_executable"
if [ -z $OF_project_name ] 
then
    OF_project_name=`cat Make/files | grep LIB | grep -oP '(?<=/).*$'`
    OF_typestr="add_library"
fi

# echo OF_testCaseDir: '${CMAKE_SORCE_DIR}/testCase'
OF_sources=`cat Make/files | grep -oP '.*\.C'`
# echo OF_sources: $OF_sources
# update OF_typestr
if [ $OF_typestr = "add_executable" ]
then
    OF_typestr="$OF_typestr(\${project_name} \${OF_sources})"
else
    OF_typestr="$OF_typestr(\${project_name} SHARED \${OF_sources})"
fi

str_inc=`echo $s | sed 's/ /\n/g' | grep -E '^-I' | sort | uniq |grep -oP '(?<=-I).*'`
OF_includeDir_tmp=${str_inc/%lnInclude/}
OF_includeDir=""
for inc in $OF_includeDir_tmp
do
    if [ "${inc:0:1}" != "/" ]
    then
        inc="\${CMAKE_SOURCE_DIR}/$inc"
    fi
    OF_includeDir="$OF_includeDir $inc"
done
OF_includeDir="$OF_includeDir \${CMAKE_SOURCE_DIR}/lnInclude"
OF_includeDir=`echo $OF_includeDir | sed 's/ /\n/g'`

OF_linkLib=`echo $s | sed 's/ /\n/g' | grep -E '^-l' | sort | uniq |grep -oP '(?<=-l).*'`
OF_linkDir=$WM_PROJECT_DIR/platforms/$WM_OPTIONS/lib
OF_linkDir=`echo "$OF_linkDir $FOAM_USER_LIBBIN" | sed 's/ /\n/g'`
# echo OF_linkLib: $OF_linkLib
# echo OF_linkDir: $OF_linkDir

# 写入文件 .vscode/of-gdb.sh
mkdir -p .vscode
cat > .vscode/of-gdb.sh <<EOF
#!/bin/bash
source $FOAM_ETC/bashrc WM_MPLIB=$WM_MPLIB WM_COMPILE_OPTION=$WM_COMPILE_OPTION WM_COMPILER=$WM_COMPILER
/usr/bin/gdb "\$@"
EOF
# 写入文件 .vscode/launch.json
cat > .vscode/launch.json << EOF
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            // Resolved by CMake Tools:
            "program": "\${command:cmake.launchTargetPath}",
            "args": [],
            "stopAtEntry": true,
            "cwd": "\${workspaceFolder}/testCase",
            "environment": [
                {
                    // add the directory where our target was built to the PATHs
                    // it gets resolved by CMake Tools:
                    "name": "PATH",
                    "value": "\${env:PATH}:\${command:cmake.getLaunchTargetDirectory}"
                },
                {
                    "name": "OTHER_VALUE",
                    "value": "Something something"
                }
            ],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "\${workspaceFolder}/.vscode/of-gdb.sh",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
EOF
chmod +x .vscode/of-gdb.sh

# 写入文件 CMakeLists.txt
cat > CMakeLists.txt <<EOF
cmake_minimum_required(VERSION 3.12)
#=== OF related variables ===
set(project_name $OF_project_name)
set(WM_COMPILE_OPTION $WM_COMPILE_OPTION)
set(OF_compile_flags "$OF_compile_flags")
set(OF_link_flags "$OF_link_flags")
set(OF_testCaseDir \${CMAKE_SOURCE_DIR}/testCase)

set(OF_sources 
$OF_sources
)
set(OF_includeDir
$OF_includeDir
)
set(OF_linkLib     
$OF_linkLib
)
set(OF_linkDir 
$OF_linkDir
)
#===         End          ===

project(\${project_name} LANGUAGES CXX C)
set(ENV{LD_LIBRARY_PATH} "\$ENV{LD_LIBRARY_PATH}:\${OF_linkDir}")


if(\${WM_COMPILE_OPTION} STREQUAL "Opt")
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Release mode" FORCE)
endif()
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED)

link_directories(
    \${OF_linkDir}
)

include_directories(
    \${OF_includeDir}
    \${CMAKE_SOURCE_DIR}/lnInclude
    \${CMAKE_SOURCE_DIR}
)

${OF_typestr}

target_link_libraries( 
    \${project_name}
    PRIVATE
    \${OF_linkLib}
)
set_target_properties( \${project_name} PROPERTIES
    COMPILE_FLAGS \${OF_compile_flags}
    LINK_FLAGS \${OF_link_flags}
    WORKING_DIRECTORY \${OF_testCaseDir})
EOF