Last active
December 15, 2015 13:29
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# 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