Skip to content

Instantly share code, notes, and snippets.

@jcfr
Last active December 15, 2015 13:29
Show Gist options
  • Save jcfr/5267914 to your computer and use it in GitHub Desktop.
Save jcfr/5267914 to your computer and use it in GitHub Desktop.
This is a toy project to illustrating CMake issue 13747. See http://public.kitware.com/Bug/view.php?id=13747
cmake_minimum_required(VERSION 2.8.10)
#-----------------------------------------------------------------------------
set(name "FOO")
if("TOPLEVEL" STREQUAL "${FOO_PROJECT_TYPE}")
set(name "FOOTOPLEVEL")
endif()
project(${name})
#-----------------------------------------------------------------------------
macro(foo_add_project identifier type mode)
set(cmake_args )
set(deps "")
if(${type} STREQUAL "TOPLEVEL")
set(install_cmd INSTALL_COMMAND "")
list(APPEND cmake_args
-DFOO_DIR:PATH=${CMAKE_BINARY_DIR}/${identifier}-leaf-${mode}
-DFOO_EXPECTED_IDENTIFIER:STRING=${identifier}-${mode})
set(deps ${identifier}-leaf)
set(proj ${identifier}-toplevel-${mode})
elseif(${type} STREQUAL "LEAF")
set(install_cmd LOG_INSTALL 1)
set(proj ${identifier}-leaf)
list(APPEND cmake_args
-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/${proj}-install
-DFOO_IDENTIFIER:STRING=${identifier}
-DFOO_EXPORT_PACKAGE:BOOL=${FOO_EXPORT_PACKAGE}
)
endif()
message(STATUS "Adding proj:${proj}")
ExternalProject_Add(${proj}
DOWNLOAD_COMMAND ""
UPDATE_COMMAND ""
SOURCE_DIR ${CMAKE_SOURCE_DIR}
BINARY_DIR ${proj}-build
CMAKE_GENERATOR ${gen}
"${install_cmd}"
CMAKE_ARGS
-DFOO_SUPERBUILD:BOOL=OFF
-DFOO_PROJECT_TYPE:STRING=${type}
${cmake_args}
DEPENDS
${deps}
)
endmacro()
#-----------------------------------------------------------------------------
option(FOO_EXPORT_PACKAGE "Export package" OFF)
set(FOO_EXTRA_ID "0" CACHE STRING "Extra identified")
option(FOO_SUPERBUILD "Superbuild" ON)
if(FOO_SUPERBUILD)
include(ExternalProject)
# Compute -G arg for configuring external projects with the same CMake generator:
if(CMAKE_EXTRA_GENERATOR)
set(gen "${CMAKE_EXTRA_GENERATOR} - ${CMAKE_GENERATOR}")
else()
set(gen "${CMAKE_GENERATOR}")
endif()
foo_add_project("ProjectA${FOO_EXTRA_ID}" "LEAF" "")
foo_add_project("ProjectA${FOO_EXTRA_ID}" "TOPLEVEL" "build")
foo_add_project("ProjectA${FOO_EXTRA_ID}" "TOPLEVEL" "install")
foo_add_project("ProjectB${FOO_EXTRA_ID}" "LEAF" "")
foo_add_project("ProjectB${FOO_EXTRA_ID}" "TOPLEVEL" "build")
foo_add_project("ProjectB${FOO_EXTRA_ID}" "TOPLEVEL" "install")
#-----------------------------------------------------------------------------
elseif("${FOO_PROJECT_TYPE}" STREQUAL "LEAF")
if(NOT FOO_IDENTIFIER)
message(FATAL_ERROR "FOO_IDENTIFIER is not set !")
endif()
if(NOT DEFINED FOO_EXPORT_PACKAGE)
message(FATAL_ERROR "FOO_EXPORT_PACKAGE is not defined !")
endif()
set(foo_config ${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake)
file(WRITE ${foo_config}
"set(FOO_IDENTIFIER \"${FOO_IDENTIFIER}-build\")")
set(foo_install_config ${CMAKE_BINARY_DIR}/CMakeFiles/${PROJECT_NAME}Config.cmake)
file(WRITE ${foo_install_config}
"set(FOO_IDENTIFIER \"${FOO_IDENTIFIER}-install\")")
if(FOO_EXPORT_PACKAGE)
export(PACKAGE ${PROJECT_NAME})
endif()
install(FILES ${foo_install_config}
DESTINATION .)
#-----------------------------------------------------------------------------
elseif("${FOO_PROJECT_TYPE}" STREQUAL "TOPLEVEL")
if(NOT FOO_EXPECTED_IDENTIFIER)
message(FATAL_ERROR "FOO_EXPECTED_IDENTIFIER is not set !")
endif()
if(NOT FOO_DIR)
message(FATAL_ERROR "FOO_DIR is not set !")
endif()
find_package(FOO REQUIRED CONFIG)
file(WRITE "${CMAKE_BINARY_DIR}/Status.txt"
"FOO_IDENTIFIER:${FOO_IDENTIFIER}
FOO_EXPECTED_IDENTIFIER:${FOO_EXPECTED_IDENTIFIER}
FOO_DIR:${FOO_DIR}
")
if(NOT "${FOO_IDENTIFIER}" STREQUAL "${FOO_EXPECTED_IDENTIFIER}")
message(FATAL_ERROR "FOO_EXPECTED_IDENTIFIER:${FOO_EXPECTED_IDENTIFIER} - FOO_IDENTIFIER:${FOO_IDENTIFIER}")
endif()
endif()
#
# First, try to use NO_MODULE
set(_FOO_REQUIRED)
set(_FOO_QUIET)
if(FOO_FIND_QUIETLY)
set(_FOO_QUIET QUIET)
endif()
if(FOO_FIND_REQUIRED)
set(_FOO_REQUIRED REQUIRED)
endif()
find_package(FOO ${_FOO_REQUIRED} ${_FOO_QUIET} NO_MODULE)
if(DCMTK_FOUND
AND NOT "x" STREQUAL "x${FOO_IDENTIFIER}")
return()
endif()
# prefer FOO_DIR over default system paths like /usr/lib
if(FOO_DIR)
set(CMAKE_PREFIX_PATH ${FOO_DIR}/lib ${CMAKE_PREFIX_PATH}) # this is given to FIND_LIBRARY or FIND_PATH
endif()
find_package_handle_standard_args(FOO
REQUIRED_VARS FOO_IDENTIFIER
FAIL_MESSAGE "Please set FOO_DIR and re-run configure")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment