# Copyright (c) 2010-2020 United States Government as represented by # the U.S. Army Research Laboratory. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # # 3. The name of the author may not be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #--------------------------------------------------------------------- # Define relative install locations. Don't set these if they have already # been set by some other means (like a higher level CMakeLists.txt file # including this one). # The location in which to install BRL-CAD executables. if(NOT BIN_DIR) set(BIN_DIR bin) endif(NOT BIN_DIR) # Define a relative path that will "reset" a path back to # the point before BIN_DIR was appended. This is primarily # useful when working with generator expressions unset(RBIN_DIR CACHE) set(LBIN_DIR "${BIN_DIR}") while (NOT "${LBIN_DIR}" STREQUAL "") get_filename_component(LBDIR "${LBIN_DIR}" DIRECTORY) set(LBIN_DIR "${LBDIR}") if ("${RBIN_DIR}" STREQUAL "") set(RBIN_DIR "..") else ("${RBIN_DIR}" STREQUAL "") set(RBIN_DIR "../${RBIN_DIR}") endif ("${RBIN_DIR}" STREQUAL "") endwhile (NOT "${LBIN_DIR}" STREQUAL "") # The location in which to install BRL-CAD libraries. if(NOT LIB_DIR) set(LIB_DIR lib) endif(NOT LIB_DIR) if(NOT LIBEXEC_DIR) set(LIBEXEC_DIR libexec) endif(NOT LIBEXEC_DIR) # The location in which to install BRL-CAD header files. if(NOT INCLUDE_DIR) set(INCLUDE_DIR include) endif(NOT INCLUDE_DIR) # The location in which to install BRL-CAD data files if(NOT DATA_DIR) set(DATA_DIR share) endif(NOT DATA_DIR) # The location in which to install BRL-CAD documentation files if(NOT DOC_DIR) set(DOC_DIR ${DATA_DIR}/doc) endif(NOT DOC_DIR) # The location in which to install BRL-CAD Manual pages if(NOT MAN_DIR) set(MAN_DIR ${DATA_DIR}/man) endif(NOT MAN_DIR) # Make sure no absolute paths have been supplied to these variables set(INSTALL_DIRS BIN INCLUDE LIB LIBEXEC DATA MAN DOC) foreach(instdir ${INSTALL_DIRS}) get_filename_component(instdir_full ${${instdir}_DIR} ABSOLUTE) if("${${instdir}_DIR}" STREQUAL "${instdir_full}") message(FATAL_ERROR "Error - absolute path supplied for ${instdir}_DIR. This path must be relative - e.g. \"bin\" instead of \"/usr/bin\"") set(HAVE_INSTALL_DIR_FULL_PATH 1) endif("${${instdir}_DIR}" STREQUAL "${instdir_full}") endforeach(instdir ${INSTALL_DIRS}) #--------------------------------------------------------------------- # Output directories - this is where built library and executable # files will be placed after building but prior to install. The # necessary variables change between single and multi configuration # build systems, so it is necessary to handle both cases on a # conditional basis. if(NOT CMAKE_CONFIGURATION_TYPES) # If we're not doing multi-configuration, just set the three main # variables to the correct values. if(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${${PROJECT_NAME}_BINARY_DIR}/${LIB_DIR} CACHE INTERNAL "Single output directory for building all libraries.") endif(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY) if(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${${PROJECT_NAME}_BINARY_DIR}/${LIB_DIR} CACHE INTERNAL "Single output directory for building all archives.") endif(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY) if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${${PROJECT_NAME}_BINARY_DIR}/${BIN_DIR} CACHE INTERNAL "Single output directory for building all executables.") endif(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) else(NOT CMAKE_CONFIGURATION_TYPES) # Multi-configuration is more difficult. Not only do we need to # properly set the output directories, but we also need to # identify the "toplevel" directory for each configuration so # we can place files, documentation, etc. in the correct # relative positions. Because files may be placed by CMake # without a build target to put them in their proper relative build # directory position using these paths, we must fully qualify them # without using CMAKE_CFG_INTDIR. # # We define directories that may not be quite "standard" # for a particular build tool - for example, native VS2010 projects use # another directory to denote CPU type being compiled for - but CMake only # supports multi-configuration setups having multiple configurations, # not multiple compilers. # # One additional wrinkle we must watch for here is the case where # a multi-configuration setup uses "." for its internal directory - # if that's the case, we need to just set the various config output # directories to the same value. set(CFG_ROOT ${${PROJECT_NAME}_BINARY_DIR}) foreach(CFG_TYPE ${CMAKE_CONFIGURATION_TYPES}) if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".") set(CFG_ROOT ${${PROJECT_NAME}_BINARY_DIR}/${CFG_TYPE}) endif(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".") string(TOUPPER "${CFG_TYPE}" CFG_TYPE_UPPER) if(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}) set("CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}" ${CFG_ROOT}/${LIB_DIR} CACHE INTERNAL "Single output directory for building ${CFG_TYPE} libraries.") endif(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}) if(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}) set("CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}" ${CFG_ROOT}/${LIB_DIR} CACHE INTERNAL "Single output directory for building ${CFG_TYPE} archives.") endif(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}) if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}) set("CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}" ${CFG_ROOT}/${BIN_DIR} CACHE INTERNAL "Single output directory for building ${CFG_TYPE} executables.") endif(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CFG_TYPE_UPPER}) if(NOT DEFINED CMAKE_BINARY_DIR_${CFG_TYPE_UPPER}) set("CMAKE_BINARY_DIR_${CFG_TYPE_UPPER}" ${CFG_ROOT} CACHE INTERNAL "Toplevel binary dir for ${CFG_TYPE} building.") endif(NOT DEFINED CMAKE_BINARY_DIR_${CFG_TYPE_UPPER}) if(NOT DEFINED ${PROJECT_NAME}_BINARY_DIR_${CFG_TYPE_UPPER}) set("${PROJECT_NAME}_BINARY_DIR_${CFG_TYPE_UPPER}" ${CFG_ROOT} CACHE INTERNAL "Toplevel binary dir for ${CFG_TYPE} building.") endif(NOT DEFINED ${PROJECT_NAME}_BINARY_DIR_${CFG_TYPE_UPPER}) endforeach() endif(NOT CMAKE_CONFIGURATION_TYPES) # Local Variables: # tab-width: 8 # mode: cmake # indent-tabs-mode: t # End: # ex: shiftwidth=2 tabstop=8