求写一份 CMakeLists.txt 文件

查看 48|回复 6
作者:HackYike   
Clion 2021.3.3,windows系统
求大神帮我写一份 CMakeLists.txt 文件。
诉求:在整个 ClionProjects 中 2~3 层文件夹的任意位置创建 .c 和 .h 的文件可以正常运行,最深到达 Try/a/b/hello.c 和 Try/a/b/hello.h 就够了。
我猜测这是一个类似于 Python 递归的东西,但不懂 CMake ……
捞一下另一悬赏帖:https://www.52pojie.cn/thread-1876074-1-1.html
[i]

文件, 递归

熊猫拍板砖   

在 New -> C/C++ Source File 和 C/C++ Header File里面勾选 Add to targets 以后你新建的 c/c++,h 文件会自动添加到 CMakeLists 文件中
下面是CMakeLists.txt,具体的版本你查下自己的,ClionProjects 不要改,这个是你的项目根目录
cmake_minimum_required(VERSION 3.20)
project(ClionProjects C)
set(CMAKE_C_STANDARD 99)
add_executable(ClionProjects StudyNote/main.c StudyNote/name.c StudyNote/sswitch.c Try/fun.c Try/tt.c
)
HackYike
OP
  


熊猫拍板砖 发表于 2024-1-10 23:04
在 New -> C/C++ Source File 和 C/C++ Header File里面勾选 Add to targets 以后你新建的 c/c++,h 文件会 ...

抱歉我想要的是一份可以自动读取整个项目文件夹里新建源文件和头文件的CMake,目前我找到的只能自动读取一层子文件夹的源文件,如果您有意提供指导,我可以另开悬赏帖加c币。
熊猫拍板砖   


HackYike 发表于 2024-1-11 12:36
抱歉我想要的是一份可以自动读取整个项目文件夹里新建源文件和头文件的CMake,目前我找到的只能自动读取 ...

要不要看看最开始我说的是啥?我的都是自动的,你叠加n层目录他也是自动添加到cmake里
HackYike
OP
  


熊猫拍板砖 发表于 2024-1-11 12:52
要不要看看最开始我说的是啥?我的都是自动的,你叠加n层目录他也是自动添加到cmake里

您的方案可以解决从零新建的文件,但是已经存在的文件我复制过去并没有加到cmake里。
熊猫拍板砖   

手动构造 CMakeLists.txt ,自己构造项目名,CMAKE 版本,只做了添加c,cpp和h 文件添加到cmakelists中
import os
import re
m = {"cpp": 1, "c": 1, "h": 1}
def read_file():
    file_list = []
    current_directory = os.getcwd()
    for root, dirs, files in os.walk(current_directory):
        # print(root,dirs,files)
        for file in files:
            suffixIndex = file.rfind(".")
            if suffixIndex == -1:
                continue
            if ("cmake-build-debug" not in root) and (m.get(file[suffixIndex + 1:].lower()) == 1):
                file_path = os.path.join(root, file)
                file_list.append(file_path.replace(current_directory + "/", ""))
    return file_list
def read_cmakelists():
    fp = open("CMakeLists.txt", "r", encoding="utf-8")
    line = fp.read()
    res = re.compile('add_executable\(([\s\S]*?)\)')
    result = res.search(line).group(1)
    result_list = [i.strip() for i in result.split("\n")]
    add_list = []
    for i in result_list:
        add_list.extend([j.strip() for j in i.split(" ") if j != ""])
    return add_list
def merge(list_a, list_b):
    new_list = list_a
    for i in list_b:
        if i not in list_a:
            new_list.append(i)
    return new_list
def rewrite(write_list):
    fp = open("CMakeLists.txt", "r", encoding="utf-8")
    text_list = []
    write_text = ""
    while 1:
        line = fp.readline()
        if "add_executable" in line:
            break
        text_list.append(line)
    fp.seek(0)
    fp.close()
    fps = open("CMakeLists.txt", "w", encoding="utf-8")
    for text in text_list:
        write_text += text
    write_text+="add_executable("
    write_text += " ".join(write_list)
    write_text += "\n)"
    fps.write(write_text)
    # print(write_text)
if __name__ == '__main__':
    added_list = read_file()
    add_executable = read_cmakelists()
    # print(added_list)
    # print(add_executable)
    new_add_list = merge(add_executable, added_list)
    rewrite(new_add_list)
熊猫拍板砖   

set(SOURCES)
function(collect_sources dir)
    file(GLOB_RECURSE TMP_SOURCES CONFIGURE_DEPENDS ${dir}/*.c ${dir}/*.cpp ${dir}/*.h)
    foreach (file ${TMP_SOURCES})
        if (NOT file MATCHES "/cmake-build-debug/" AND NOT file MATCHES ".idea" )
            string(REPLACE ${dir}/ "" new_file ${file})
            list(APPEND SOURCES ${new_file})
            set(SOURCES ${SOURCES} PARENT_SCOPE)
        endif ()
    endforeach ()
endfunction()
collect_sources(${PROJECT_SOURCE_DIR})
add_executable(${PROJECT_NAME} ${SOURCES})
您需要登录后才可以回帖 登录 | 立即注册

返回顶部