diff --git a/.gitignore b/.gitignore index e257658..09de0bd 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ *.out *.app +lib/ +build/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..9b52ffc --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "picard_cpp", + "preLaunchTask": "BuildDebug", + // "preLaunchTask": "BuildRelease", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/build/bin/picard_cpp", + "args": [ + "MarkDuplicates" + ], + "cwd": "${workspaceFolder}", // 当前工作路径:当前文件所在的工作空间 + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f66631f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "cstring": "cpp" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..b7a0ce0 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,27 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "BuildDebug", + "type": "shell", + "command": "cd build; cmake .. -DCMAKE_BUILD_TYPE=Debug; make -j 8", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "BuildRelease", + "type": "shell", + "command": "cd build; cmake .. -DCMAKE_BUILD_TYPE=Release; make -j 8", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index e69de29..f349d06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -0,0 +1,3 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +project(picard_cpp) +ADD_SUBDIRECTORY(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e69de29..35908d1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -0,0 +1,35 @@ +# 生成程序的位置 +SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin") + +# 源码目录 +AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src MAIN_SRC) +# AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/common COMMON) +AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/sam SAM_SRC) +AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/sam/markdups SAM_MARKDUPS_SRC) + +# 头文件目录 +INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/src") +INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/lib") +INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/lib/htslib") + +# 链接库位置 +LINK_DIRECTORIES("${PROJECT_SOURCE_DIR}/lib/htslib") + +# 编译生成的程序名称 +set(PG_NAME "picard_cpp") + +# 为程序添加依赖关系 +ADD_EXECUTABLE(${PG_NAME} ${MAIN_SRC} ${SAM_SRC} ${SAM_MARKDUPS_SRC}) + +# 链接库 +TARGET_LINK_LIBRARIES(${PG_NAME} libhts.a) + +# 检测系统是否包含必需的库 +find_package(Threads REQUIRED) +if(THREADS_HAVE_PTHREAD_ARG) + set_property(TARGET ${PG_NAME} PROPERTY COMPILE_OPTIONS "-pthread") + set_property(TARGET ${PG_NAME} PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread") +endif() +if(CMAKE_THREAD_LIBS_INIT) + TARGET_LINK_LIBRARIES(${PG_NAME} "${CMAKE_THREAD_LIBS_INIT}") +endif() \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e69de29..5b190e6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include "module.h" + +/* 版本信息 */ +const char *version() +{ + return PICARD_CPP_VERSION; +} + +/* 使用说明 */ +static void usage(FILE *fp) +{ + fprintf(fp, + "\n" + "Program: picard_cpp (A cpp implementation for picard.)\n" + "Version: %s \n\n", + version()); + fprintf(fp, + "Usage: picard_cpp [options]\n" + "\n" + "Commands:\n" + " MarkDuplicates mark duplicates for bam file.\n" + "\n"); +} + +int main(int argc, char *argv[]) +{ + + if (argc < 2) + { + usage(stderr); + return 1; + } + + if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0) + { + if (argc == 2) + { + usage(stdout); + return 0; + } + argv++; + argc = 2; + } + + int ret = -1; + + if (strcmp(argv[1], "MarkDuplicates") == 0) + ret = MarkDuplicates(argc - 1, argv + 1); + else + { + fprintf(stderr, "\n[Error]: unrecognized command '%s'\n\n", argv[1]); + usage(stdout); + return 1; + } + + return ret; +} diff --git a/src/module.h b/src/module.h index e69de29..3d2d4cb 100644 --- a/src/module.h +++ b/src/module.h @@ -0,0 +1,16 @@ +/* + Description: picard中各种方法模块函数的前向声明 + + Copyright : All right reserved by NCIC.ICT + + Author : Zhang Zhonghai + Date : 2023/10/23 +*/ +#ifndef MODULE_H_ +#define MODULE_H_ + +#define PICARD_CPP_VERSION "v0.1" + +int MarkDuplicates(int argc, char *argv[]); + +#endif diff --git a/src/sam/markdups/markdups.cpp b/src/sam/markdups/markdups.cpp index e69de29..48dbad6 100644 --- a/src/sam/markdups/markdups.cpp +++ b/src/sam/markdups/markdups.cpp @@ -0,0 +1,26 @@ +/* +Description: 标记bam文件中的冗余信息 + +Copyright : All right reserved by ICT + +Author : Zhang Zhonghai +Date : 2023/10/23 +*/ + +#include + +using namespace std; + +/* + * mark duplicate 入口 + */ +int MarkDuplicates(int argc, char *argv[]) +{ + cout << argc << endl; + for (int i = 0; i < argc; ++i) { + cout << argv[i] << '\t'; + } + cout << endl; + + return 0; +} \ No newline at end of file