Skip to content

Instantly share code, notes, and snippets.

@zuoyan
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zuoyan/eef5bd388f3c09232de0 to your computer and use it in GitHub Desktop.
Save zuoyan/eef5bd388f3c09232de0 to your computer and use it in GitHub Desktop.
BUILD like functions in CMake
INCLUDE(CMakeParseArguments)
FUNCTION(WEIZI_ABSOLUTE NAME OUT)
IF (${NAME} MATCHES "^/")
SET(${OUT} ${NAME} PARENT_SCOPE)
RETURN()
ENDIF()
IF ("${CMAKE_SOURCE_DIR}/weizi" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
SET(${OUT} "/${NAME}" PARENT_SCOPE)
RETURN()
ENDIF()
STRING(REPLACE "${CMAKE_SOURCE_DIR}/weizi" "" RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}")
SET(NAME "${RELATIVE}/${NAME}")
WHILE(${NAME} MATCHES "/\\.\\.")
STRING(REGEX REPLACE "[^/]*/\\.\\." "" NAME ${NAME})
ENDWHILE()
SET(${OUT} ${NAME} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(WEIZI_TARGET NAME OUT)
WEIZI_ABSOLUTE(${NAME} FULLNAME)
STRING(REGEX REPLACE "/(.*)" "\\1" FULLNAME ${FULLNAME})
STRING(REPLACE "/" "." FULLNAME ${FULLNAME})
SET(${OUT} ${FULLNAME} PARENT_SCOPE)
ENDFUNCTION(WEIZI_TARGET)
FUNCTION(CC_BINARY NAME)
CMAKE_PARSE_ARGUMENTS(CC_BINARY "" "" "SRCS;LIBS" ${ARGN})
WEIZI_TARGET(${NAME} FULLNAME)
ADD_EXECUTABLE(${FULLNAME} ${CC_BINARY_SRCS})
SET_TARGET_PROPERTIES(${FULLNAME} PROPERTIES OUTPUT_NAME ${NAME})
FOREACH(LIB ${CC_BINARY_LIBS})
WEIZI_TARGET(${LIB} LIB)
TARGET_LINK_LIBRARIES(${FULLNAME} ${LIB})
ENDFOREACH()
ENDFUNCTION()
FUNCTION(CC_TEST NAME)
CC_BINARY(${NAME} ${ARGN})
WEIZI_TARGET(${NAME} FULLNAME)
ADD_CUSTOM_COMMAND(TARGET ${FULLNAME}
COMMAND ${CMAKE_COMMAND} -DCHECK_BINARY=${NAME} -P ${CMAKE_SOURCE_DIR}/cmake/check_test.cmake)
ADD_TEST(${FULLNAME} ${NAME})
ENDFUNCTION()
FUNCTION(CC_LIBRARY NAME)
CMAKE_PARSE_ARGUMENTS(CC_LIBRARY "" "TYPE" "SRCS;LIBS" ${ARGN})
WEIZI_TARGET(${NAME} FULLNAME)
ADD_LIBRARY(${FULLNAME} ${CC_LIBRARY_TYPE} ${CC_LIBRARY_SRCS})
SET_TARGET_PROPERTIES(${FULLNAME} PROPERTIES OUTPUT_NAME ${NAME})
FOREACH(LIB ${CC_LIBRARY_LIBS})
WEIZI_TARGET(${LIB} LIB)
TARGET_LINK_LIBRARIES(${FULLNAME} ${LIB})
ENDFOREACH()
ENDFUNCTION()
# I don't know how to lazily get ${CHECK_TEST} in cmake, so adding an extra file.
EXECUTE_PROCESS(COMMAND $ENV{CHECK_TEST} ./${CHECK_BINARY})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment