# Set the cmake version of minimum limits, we can # know details from cmake --help-command cmake_minimum_required# FATAL_ERROR is a pre-defined constantcmake_minimum_required(VERSION 2.8.12.2 FATAL_ERROR)
# In some specia situation, we need set a cmake policy to# control cmake action, this is a example for this.if(POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif()
# We need set a name for a projectproject(Examples)
# If we need judge a variable and do somethingif(NOT EXAMPLES_EXTERNAL_SOURCES)
set(EXAMPLES_EXTERNAL_SOURCES "${CMAKE_SOURCE_DIR}/test.c")
endif()
# receive a variable from a commandline, such as# "cmake -DPRINT_MESSAGE" and switch to define a macro#if("${PRINT_MESSAGE}"STREQUAL"ERROR")
macro(MESSAGE_ERROR _TEXT)
message(FATAL_ERROR "${_TEXT}")
endmacro()
else()
macro(MESSAGE_WARN _TEXT)
message(STATUS "${_TEXT}")
endmacro()
endif()
# contain of the header fileinclude_directories(include) # The relative paths are interpreted as relative to# the current source directory# if you have some sub-CMakeLists file, you need include# but here we have not.# add_subdirectory(src)# Use the cmake pre-defined module, we also use of more modules,# we can get more modules details from "cmake --help-module-list"include(CheckIncludeFileCXX)
CHECK_INCLUDE_FILE_CXX(test.h HAVE_TEST_H)
if(NOT HAVE_TEST_H)
message_warn("Don't found the Header file test.h")
else()
message_warn("Found the Header file test.h ${HAVE_TEST_H}")
endif()
# ---[ Config generation# we can use the *.in file generate the config header file and other is# *.pc file. details from "cmake --help-command configure_file"configure_file(${CMAKE_SOURCE_DIR}/config.h.in "${PROJECT_BINARY_DIR}/config.h")
# we build a executable# details from "cmake --help-command add_executable"add_executable(example_exe ${EXAMPLES_EXTERNAL_SOURCES})
# we build a share library# details from "cmake --help-command add_library"add_library(example_sso SHARED ${EXAMPLES_EXTERNAL_SOURCES})
# we build a static library# details from "cmake --help-command add_library"add_library(example_slib STATIC ${EXAMPLES_EXTERNAL_SOURCES})
# we build a Java Project# java project like the c project, just the input source file# is *.java# we build a Assembly Project# because of cmake don't support the assembly, so we must custom the rules# to compile the assembly fileif(NOT ASSEMBLY_SOURCE_FILE)
file(GLOB ASSEMBLY_SOURCE_FILE pure/*.S)
endif()
foreach(GENERATE_OBJ ${ASSEMBLY_SOURCE_FILE})
list(APPEND obj_list_pure GENERATE_OBJ)
list(LENGTH obj_list_pure Index)
set(Mide_Obj "PURE_${Index}")
add_custom_command(OUTPUT ${Mide_Obj}.o
COMMAND gcc -c ${GENERATE_OBJ} -o ${Mide_Obj}.o
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
COMMENT "compile the assembly file")
set(OBJ_LIST_pure "${OBJ_LIST_pure} ${CMAKE_CURRENT_BINARY_DIR}/${Mide_Obj}.o")
endforeach()
string(STRIP ${OBJ_LIST_pure} OBJ_LIST_pure)
add_custom_command(OUTPUT Assemble_Example
COMMAND ld ${OBJ_LIST_pure} -o Pure_Assemble_Example -T ${CMAKE_SOURCE_DIR}/pure/pure_as_test.lds
COMMENT "Linking Assembly executable Assemble_Example")
add_custom_target(PRE_Pure_Assemble ALL DEPENDS ${OBJ_LIST_pure})
add_custom_target(Pure_Assemble_Example ALL DEPENDS Assemble_Example PRE_Pure_Assemble)
# we build a Assembly and a C Projectif(NOT MIXED_AS_SOURCE_FILE)
set(MIXED_AS_SOURCE_FILE "${CMAKE_SOURCE_DIR}/pure/pure_as_test.S")
endif()
if(NOT MIXED_C_SOURCE_FILE)
file(GLOB MIXED_C_SOURCE_FILE *.c)
endif()
foreach(GENERATE_OBJ ${MIXED_AS_SOURCE_FILE})
list(APPEND obj_list_mixed GENERATE_OBJ)
list(LENGTH obj_list_mixed Index)
set(Mide_Obj "MIXED_${Index}")
add_custom_command(OUTPUT ${Mide_Obj}.o
COMMAND gcc -c ${GENERATE_OBJ} -o ${Mide_Obj}.o
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
COMMENT "compile the assembly file")
set(OBJ_LIST_mixed "${OBJ_LIST_mixed} ${CMAKE_CURRENT_BINARY_DIR}/${Mide_Obj}.o")
endforeach()
string(STRIP "${OBJ_LIST_mixed}" OBJ_LIST_mixed)
add_custom_command(TARGET PRE_Mixed_Assemble
PRE_LINK
COMMENT "Linking Assembly executable Assemble_Example")
add_custom_target(PRE_Mixed_Assemble ALL DEPENDS ${OBJ_LIST_mixed})
add_executable(Mixed_Example ${MIXED_C_SOURCE_FILE})
add_dependencies(Mixed_Example PRE_Mixed_Assemble)
set_target_properties(Mixed_Example PROPERTIES
LINK_FLAGS "${OBJ_LIST_mixed}")
target_link_libraries(Mixed_Example pthread)