CMake 在Visual Studio下保持目录结构

CMake 在Visual Studio下保持目录结构,包括头文件

主要看INCLUDE_DIRECTORIES_EX和my_add_library的使用

cmake_minimum_required(VERSION 2.8)  

set(PROJ_NAME  your_proj_name)

PROJECT(jni_${PROJ_NAME})  

set(PROJECT_MAJOR_VERSION 1)
set(PROJECT_MINOR_VERSION 0)
set(PROJECT_PATCH_VERSION 0)
set(PROJECT_VERSION      ${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_PATCH_VERSION})
#set(CMAKE_BUILD_TYPE  "Debug")
set(CMAKE_BUILD_TYPE  "Release")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -###")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -isystem -v")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -fstack-protector -fstack-check -D_GLIBCXX_DEBUG")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -DNO_LIMIT -fstack-protector -fstack-check -fprofile-instr-generate -fcoverage-mapping")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG -fstack-protector -fstack-check -fprofile-instr-generate -fcoverage-mapping")
#SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -DNDEBUG")
SET(GCC_CXX_FLAGS, "-static-libgcc -static-libstdc++ -static")


#指定源码路径
AUX_SOURCE_DIRECTORY(. DIR_SRCS )       
AUX_SOURCE_DIRECTORY(./src UTIL_SRCS )


SET (headers_all "")
#获取目录下的所有头文件
macro(INCLUDE_DIRECTORIES_EX inc_dir)  
  INCLUDE_DIRECTORIES(${inc_dir})
  FILE(GLOB_RECURSE headers "${inc_dir}/*.hpp" "${inc_dir}/*.h" )	#遍历获取{curdir}中*.hpp和*.h文件列表
  LIST(APPEND headers_all ${headers})
endmacro()															


INCLUDE_DIRECTORIES(./)           #不保持目录结构
INCLUDE_DIRECTORIES_EX(./include) #保持目录结构


#保持源文件/头文件目录结构
function(assign_source_group)
  foreach(_source IN ITEMS ${ARGN})
    if (IS_ABSOLUTE "${_source}")
      file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
    else()
      set(_source_rel "${_source}")
    endif()
    get_filename_component(_source_path "${_source_rel}" PATH)
    string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
    #string(REPLACE "../" "" _source_path_msvc "${_source_path}")
    #string(REPLACE "./" "" _source_path_msvc "${_source_path}")
    string(REPLACE ".." "" _source_path_msvc "${_source_path}")
    string(REPLACE "." "" _source_path_msvc "${_source_path}")

    #message(STATUS "source = ${_source}")	
    if ((${_source} MATCHES ".*.h$") OR (${_source} MATCHES ".*.hpp$"))
      source_group("include\\${_source_path_msvc}" FILES "${_source}")
    else()
      source_group("src\\${_source_path_msvc}" FILES "${_source}")
    endif()
  endforeach()
endfunction(assign_source_group)
 
function(my_add_library)
  foreach(_source IN ITEMS ${ARGN})
    assign_source_group(${_source})
  endforeach()
  # 此处根据情况修改
  ADD_LIBRARY(${ARGV})
  # ADD_EXECUTABLE(${ARGV})
endfunction(my_add_library)


my_add_library(${PROJ_NAME} SHARED ${DIR_SRCS} ${headers_all})

ADD_DEFINITIONS( --std=c++11 )
#set (CMAKE_C_FLAGS "-m32")
#ADD_DEFINITIONS( -fno-omit-frame-pointer )
#ADD_DEFINITIONS( -fsanitize=address )
#ADD_DEFINITIONS( -g )
#ADD_DEFINITIONS( -O3 )
#ADD_DEFINITIONS( -fprofile-instr-generate )
#ADD_DEFINITIONS( -fcoverage-mapping )

#follow three line is for gprof profile test
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
#SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
#SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")


IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
  #INCLUDE_DIRECTORIES(/opt/jdk1.8.0_121/include)
  #INCLUDE_DIRECTORIES(/opt/jdk1.8.0_121/include/linux)

  TARGET_LINK_LIBRARIES(${PROJ_NAME} libcrypto.a)
  TARGET_LINK_LIBRARIES(${PROJ_NAME} libssl.a)

ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
  #add_definitions(-DUNICODE -D_UNICODE)   # 设置字符集:Unicode
  #add_definitions(-DCMAKE_CONFIGURATION_TYPES="Release;Debug")
  SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -DDEBUG -DNO_LIMIT -MTd /ZI /Ob0 /Od /RTC1")
  SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -DNDEBUG -MT")

  INCLUDE_DIRECTORIES("C:/Program Files/glog/include") #x64
  #INCLUDE_DIRECTORIES("C:/Program Files (x86)/glog/include") #x86
 
  TARGET_LINK_LIBRARIES(${PROJ_NAME} libcrypto.lib")
  TARGET_LINK_LIBRARIES(${PROJ_NAME} libssl.lib")
  TARGET_LINK_LIBRARIES(${PROJ_NAME} ws2_32.lib)
  TARGET_LINK_LIBRARIES(${PROJ_NAME} crypt32.lib)
    
ENDIF()






你可能感兴趣的:(cmake,visual,studio,c++,windows,cmake)