## # vcpkg_configure_make ## ## Configure configure for Debug and Release builds of a project. ## ## ## Usage ## ```cmake ## vcpkg_configure_make( ## SOURCE_PATH <${SOURCE_PATH}> ## [AUTOCONFIG] ## [DISABLE_AUTO_HOST] ## [DISABLE_AUTO_DST] ## [GENERATOR] ## [NO_DEBUG] ## [SKIP_CONFIGURE] ## [PROJECT_SUBPATH <${PROJ_SUBPATH}>] ## [PRERUN_SHELL <${SHELL_PATH}>] ## [OPTIONS <-DUSE_THIS_IN_ALL_BUILDS=1>...] ## [OPTIONS_RELEASE <-DOPTIMIZE=1>...] ## [OPTIONS_DEBUG <-DDEBUGGABLE=1>...] ## ) ## ``` ## ## ## Parameters ## ### SOURCE_PATH ## Specifies the directory containing the `configure`/`configure.ac`. ## By convention, this is usually set in the portfile as the variable `SOURCE_PATH`. ## ## ### PROJECT_SUBPATH ## Specifies the directory containing the ``configure`/`configure.ac`. ## By convention, this is usually set in the portfile as the variable `SOURCE_PATH`. ## Should use `GENERATOR NMake` first. ## ## ### NO_DEBUG ## This port doesn't support debug mode. ## ## ### SKIP_CONFIGURE ## Skip configure process ## ## ### AUTOCONFIG ## Need to use autoconfig to generate configure file. ## ## ### DISABLE_AUTO_HOST ## Don't set host automatically, the default value is `i686`. ## If use this option, you will need to set host manually. ## ## ### DISABLE_AUTO_DST ## Don't set installation path automatically, the default value is `${CURRENT_PACKAGES_DIR}` and `${CURRENT_PACKAGES_DIR}/debug` ## If use this option, you will need to set dst path manually. ## ## ### GENERATOR ## Specifies the precise generator to use. ## NMake: nmake(windows) make(unix) ## MAKE: make(windows) make(unix) ## ## ### PRERUN_SHELL ## Script that needs to be called before configuration ## ## ### OPTIONS ## Additional options passed to configure during the configuration. ## ## ### OPTIONS_RELEASE ## Additional options passed to configure during the Release configuration. These are in addition to `OPTIONS`. ## ## ### OPTIONS_DEBUG ## Additional options passed to configure during the Debug configuration. These are in addition to `OPTIONS`. ## ## ## Notes ## This command supplies many common arguments to configure. To see the full list, examine the source. ## ## ## Examples ## ## * [x264](https://github.com/Microsoft/vcpkg/blob/master/ports/x264/portfile.cmake) ## * [tcl](https://github.com/Microsoft/vcpkg/blob/master/ports/tcl/portfile.cmake) ## * [freexl](https://github.com/Microsoft/vcpkg/blob/master/ports/freexl/portfile.cmake) ## * [libosip2](https://github.com/Microsoft/vcpkg/blob/master/ports/libosip2/portfile.cmake) function(vcpkg_configure_make) cmake_parse_arguments(_csc "AUTOCONFIG;DISABLE_AUTO_HOST;DISABLE_AUTO_DST;NO_DEBUG;SKIP_CONFIGURE" "SOURCE_PATH;PROJECT_SUBPATH;GENERATOR;PRERUN_SHELL" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" ${ARGN} ) if(NOT VCPKG_PLATFORM_TOOLSET) message(FATAL_ERROR "Vcpkg has been updated with VS2017 support; " "however, vcpkg.exe must be rebuilt by re-running bootstrap-vcpkg.bat\n") endif() if (_csc_OPTIONS_DEBUG STREQUAL _csc_OPTIONS_RELEASE OR NMAKE_OPTION_RELEASE STREQUAL NMAKE_OPTION_DEBUG) message(FATAL_ERROR "Detected debug configuration is equal to release configuration, please use NO_DEBUG for vcpkg_configure_make") endif() # Select compiler if(_csc_GENERATOR MATCHES "NMake") message(FATAL_ERROR "Sorry, NMake does not supported currently.") if (CMAKE_HOST_WIN32) set(GENERATOR "nmake") else() set(GENERATOR "make") endif() elseif(NOT _csc_GENERATOR OR _csc_GENERATOR MATCHES "MAKE") if (CMAKE_HOST_WIN32) set(GENERATOR "make") else() set(GENERATOR "make") endif() else() message(FATAL_ERROR "${_csc_GENERATOR} not supported.") endif() set(WIN_TARGET_ARCH ) set(WIN_TARGET_COMPILER ) # Detect compiler if (GENERATOR STREQUAL "nmake") message(STATUS "Using generator NMAKE") find_program(NMAKE nmake REQUIRED) elseif (GENERATOR STREQUAL "make") message(STATUS "Using generator make") find_program(MAKE make REQUIRED) else() message(FATAL_ERROR "${GENERATOR} not supported.") endif() # Pre-processing windows configure requirements if (CMAKE_HOST_WIN32) vcpkg_find_acquire_program(YASM) vcpkg_find_acquire_program(PERL) set(MSYS_REQUIRE_PACKAGES diffutils) if (_csc_AUTOCONFIG) set(MSYS_REQUIRE_PACKAGES ${MSYS_REQUIRE_PACKAGES} autoconf automake m4 libtool perl) endif() vcpkg_acquire_msys(MSYS_ROOT PACKAGES ${MSYS_REQUIRE_PACKAGES}) get_filename_component(YASM_EXE_PATH ${YASM} DIRECTORY) get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY) if (NOT _csc_DISABLE_AUTO_HOST) if(VCPKG_TARGET_ARCHITECTURE STREQUAL x86) set(WIN_TARGET_ARCH --host=i686-pc-mingw32) elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL x64) set(WIN_TARGET_ARCH --host=i686-pc-mingw64) elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL arm) set(WIN_TARGET_ARCH --host=arm-pc-mingw32) endif() endif() set(WIN_TARGET_COMPILER CC=cl) set(ENV{PATH} "$ENV{PATH};${YASM_EXE_PATH};${MSYS_ROOT}/usr/bin;${PERL_EXE_PATH}") set(BASH ${MSYS_ROOT}/usr/bin/bash.exe) elseif (_csc_AUTOCONFIG) find_program(autoreconf autoreconf REQUIRED) endif() if (NOT _csc_NO_DEBUG) file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel" "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg") else() file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}") endif() if (NOT _csc_DISABLE_AUTO_DST) set(_csc_OPTIONS_RELEASE ${_csc_OPTIONS_RELEASE} --prefix=${CURRENT_PACKAGES_DIR} --bindir=${CURRENT_PACKAGES_DIR}/bin --sbindir=${CURRENT_PACKAGES_DIR}/bin --libdir=${CURRENT_PACKAGES_DIR}/lib --includedir=${CURRENT_PACKAGES_DIR}/include) set(_csc_OPTIONS_DEBUG ${_csc_OPTIONS_DEBUG} --prefix=${CURRENT_PACKAGES_DIR}/debug --bindir=${CURRENT_PACKAGES_DIR}/debug/bin --sbindir=${CURRENT_PACKAGES_DIR}/debug/bin --libdir=${CURRENT_PACKAGES_DIR}/debug/lib --includedir=${CURRENT_PACKAGES_DIR}/debug/include) endif() set(base_cmd ) if(CMAKE_HOST_WIN32) set(base_cmd ${BASH} --noprofile --norc -c) if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) set(_csc_OPTIONS ${_csc_OPTIONS} --enable-shared) if (VCPKG_TARGET_IS_UWP) set(_csc_OPTIONS ${_csc_OPTIONS} --extra-ldflags=-APPCONTAINER --extra-ldflags=WindowsApp.lib) endif() else() set(_csc_OPTIONS ${_csc_OPTIONS} --enable-static) endif() # Load toolchains if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE) set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/windows.cmake") endif() include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}") set(C_FLAGS_GLOBAL "$ENV{CFLAGS} ${VCPKG_C_FLAGS}") set(CXX_FLAGS_GLOBAL "$ENV{CXXFLAGS} ${VCPKG_CXX_FLAGS}") set(LD_FLAGS_GLOBAL "$ENV{LDFLAGS}") if(VCPKG_TARGET_IS_UWP) set(ENV{LIBPATH} "$ENV{LIBPATH};$ENV{_WKITS10}references\\windows.foundation.foundationcontract\\2.0.0.0\\;$ENV{_WKITS10}references\\windows.foundation.universalapicontract\\3.0.0.0\\") set(_csc_OPTIONS ${_csc_OPTIONS} --extra-cflags=-DWINAPI_FAMILY=WINAPI_FAMILY_APP --extra-cflags=-D_WIN32_WINNT=0x0A00) endif() list(JOIN _csc_OPTIONS " " _csc_OPTIONS) list(JOIN _csc_OPTIONS_RELEASE " " _csc_OPTIONS_RELEASE) list(JOIN _csc_OPTIONS_DEBUG " " _csc_OPTIONS_DEBUG) set(rel_command ${base_cmd} "${WIN_TARGET_COMPILER} ${_csc_SOURCE_PATH}/configure ${WIN_TARGET_ARCH} ${_csc_OPTIONS} ${_csc_OPTIONS_RELEASE}" ) set(dbg_command ${base_cmd} "${WIN_TARGET_COMPILER} ${_csc_SOURCE_PATH}/configure ${WIN_TARGET_ARCH} ${_csc_OPTIONS} ${_csc_OPTIONS_DEBUG}" ) else() set(base_cmd ./) set(rel_command ${base_cmd}configure "${_csc_OPTIONS}" "${_csc_OPTIONS_RELEASE}" ) set(dbg_command ${base_cmd}configure "${_csc_OPTIONS}" "${_csc_OPTIONS_DEBUG}" ) endif() # Configure debug if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug" AND NOT _csc_NO_DEBUG) if (CMAKE_HOST_WIN32) unset(ENV{CFLAGS}) unset(ENV{CXXFLAGS}) unset(ENV{LDFLAGS}) set(TMP_CFLAGS "${C_FLAGS_GLOBAL} ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG}") string(REPLACE "/" "-" TMP_CFLAGS "${TMP_CFLAGS}") set(ENV{CFLAGS} ${TMP_CFLAGS}) set(TMP_CXXFLAGS "${CXX_FLAGS_GLOBAL} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") string(REPLACE "/" "-" TMP_CXXFLAGS "${TMP_CXXFLAGS}") set(ENV{CXXFLAGS} ${TMP_CXXFLAGS}) set(TMP_LDFLAGS "${LD_FLAGS_GLOBAL}") string(REPLACE "/" "-" TMP_LDFLAGS "${TMP_LDFLAGS}") set(ENV{LDFLAGS} ${TMP_LDFLAGS}) endif() set(OBJ_DIR ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg) set(PRJ_DIR ${OBJ_DIR}/${_csc_PROJECT_SUBPATH}) file(MAKE_DIRECTORY ${OBJ_DIR}) if (NOT CMAKE_HOST_WIN32) file(GLOB_RECURSE SOURCE_FILES ${_csc_SOURCE_PATH}/*) foreach(ONE_SOUCRCE_FILE ${SOURCE_FILES}) get_filename_component(DST_DIR ${ONE_SOUCRCE_FILE} PATH) string(REPLACE "${_csc_SOURCE_PATH}" "${OBJ_DIR}" DST_DIR "${DST_DIR}") file(COPY ${ONE_SOUCRCE_FILE} DESTINATION ${DST_DIR}) endforeach() endif() if (_csc_PRERUN_SHELL) message(STATUS "Prerun shell with ${TARGET_TRIPLET}-dbg") vcpkg_execute_required_process( COMMAND ${base_cmd}${_csc_PRERUN_SHELL} WORKING_DIRECTORY ${PRJ_DIR} LOGNAME prerun-${TARGET_TRIPLET}-dbg ) endif() if (_csc_AUTOCONFIG) message(STATUS "Generating configure with ${TARGET_TRIPLET}-dbg") if (CMAKE_HOST_WIN32) vcpkg_execute_required_process( COMMAND ${base_cmd} autoreconf -vfi WORKING_DIRECTORY ${_csc_SOURCE_PATH}/${_csc_PROJECT_SUBPATH} LOGNAME prerun-${TAR_TRIPLET_DIR} ) else() vcpkg_execute_required_process( COMMAND autoreconf -vfi WORKING_DIRECTORY ${PRJ_DIR} LOGNAME prerun-${TAR_TRIPLET_DIR} ) endif() endif() if (NOT _csc_SKIP_CONFIGURE) message(STATUS "Configuring ${TARGET_TRIPLET}-dbg") vcpkg_execute_required_process( COMMAND ${dbg_command} WORKING_DIRECTORY ${PRJ_DIR} LOGNAME config-${TARGET_TRIPLET}-dbg ) endif() endif() # Configure release if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") if (CMAKE_HOST_WIN32) unset(ENV{CFLAGS}) unset(ENV{CXXFLAGS}) unset(ENV{LDFLAGS}) set(TMP_CFLAGS "${C_FLAGS_GLOBAL} ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE}") string(REPLACE "/" "-" TMP_CFLAGS "${TMP_CFLAGS}") set(ENV{CFLAGS} ${TMP_CFLAGS}) set(TMP_CXXFLAGS "${CXX_FLAGS_GLOBAL} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") string(REPLACE "/" "-" TMP_CXXFLAGS "${TMP_CXXFLAGS}") set(ENV{CXXFLAGS} ${TMP_CXXFLAGS}) set(TMP_LDFLAGS "${LD_FLAGS_GLOBAL} ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") string(REPLACE "/" "-" TMP_LDFLAGS "${TMP_LDFLAGS}") set(ENV{LDFLAGS} ${TMP_LDFLAGS}) endif() if (_csc_NO_DEBUG) set(TAR_TRIPLET_DIR ${TARGET_TRIPLET}) set(OBJ_DIR ${CURRENT_BUILDTREES_DIR}/${TAR_TRIPLET_DIR}) else() set(TAR_TRIPLET_DIR ${TARGET_TRIPLET}-rel) set(OBJ_DIR ${CURRENT_BUILDTREES_DIR}/${TAR_TRIPLET_DIR}) endif() set(PRJ_DIR ${OBJ_DIR}/${_csc_PROJECT_SUBPATH}) file(MAKE_DIRECTORY ${OBJ_DIR}) if (NOT CMAKE_HOST_WIN32) file(GLOB_RECURSE SOURCE_FILES ${_csc_SOURCE_PATH}/*) foreach(ONE_SOUCRCE_FILE ${SOURCE_FILES}) get_filename_component(DST_DIR ${ONE_SOUCRCE_FILE} PATH) string(REPLACE "${_csc_SOURCE_PATH}" "${OBJ_DIR}" DST_DIR "${DST_DIR}") file(COPY ${ONE_SOUCRCE_FILE} DESTINATION ${DST_DIR}) endforeach() endif() if (_csc_PRERUN_SHELL) message(STATUS "Prerun shell with ${TAR_TRIPLET_DIR}") vcpkg_execute_required_process( COMMAND ${base_cmd}${_csc_PRERUN_SHELL} WORKING_DIRECTORY ${PRJ_DIR} LOGNAME prerun-${TAR_TRIPLET_DIR} ) endif() if (_csc_AUTOCONFIG) message(STATUS "Generating configure with ${TAR_TRIPLET_DIR}") if (CMAKE_HOST_WIN32) vcpkg_execute_required_process( COMMAND ${base_cmd} autoreconf -vfi WORKING_DIRECTORY ${_csc_SOURCE_PATH}/${_csc_PROJECT_SUBPATH} LOGNAME prerun-${TAR_TRIPLET_DIR} ) else() vcpkg_execute_required_process( COMMAND autoreconf -vfi WORKING_DIRECTORY ${PRJ_DIR} LOGNAME prerun-${TAR_TRIPLET_DIR} ) endif() endif() if (NOT _csc_SKIP_CONFIGURE) message(STATUS "Configuring ${TAR_TRIPLET_DIR}") vcpkg_execute_required_process( COMMAND ${rel_command} WORKING_DIRECTORY ${PRJ_DIR} LOGNAME config-${TAR_TRIPLET_DIR} ) endif() endif() # Restore envs if (CMAKE_HOST_WIN32) set(ENV{CFLAGS} "${C_FLAGS_GLOBAL}") set(ENV{CXXFLAGS} "${CXX_FLAGS_GLOBAL}") set(ENV{LDFLAGS} "${LD_FLAGS_GLOBAL}") endif() set(_VCPKG_MAKE_GENERATOR "${GENERATOR}" PARENT_SCOPE) set(_VCPKG_NO_DEBUG ${_csc_NO_DEBUG} PARENT_SCOPE) SET(_VCPKG_PROJECT_SOURCE_PATH ${_csc_SOURCE_PATH} PARENT_SCOPE) set(_VCPKG_PROJECT_SUBPATH ${_csc_PROJECT_SUBPATH} PARENT_SCOPE) endfunction()