| # |
| # tuklib_physmem.cmake - see tuklib_physmem.m4 for description and comments |
| # |
| # NOTE: Compared tuklib_physmem.m4, this lacks support for Tru64, IRIX, and |
| # Linux sysinfo() (usually sysconf() is used on GNU/Linux). |
| # |
| # Author: Lasse Collin |
| # |
| # This file has been put into the public domain. |
| # You can do whatever you want with this file. |
| # |
| |
| include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake") |
| include(CheckCSourceCompiles) |
| include(CheckIncludeFile) |
| |
| function(tuklib_physmem_internal_check) |
| # Shortcut on Windows: |
| if(WIN32 OR CYGWIN) |
| # Nothing to do, the tuklib_physmem.c handles it. |
| set(TUKLIB_PHYSMEM_DEFINITIONS "" CACHE INTERNAL "") |
| return() |
| endif() |
| |
| # Full check for special cases: |
| check_c_source_compiles(" |
| #if defined(_WIN32) || defined(__CYGWIN__) || defined(__OS2__) \ |
| || defined(__DJGPP__) || defined(__VMS) \ |
| || defined(AMIGA) || defined(__AROS__) || defined(__QNX__) |
| int main(void) { return 0; } |
| #else |
| compile error |
| #endif |
| " |
| TUKLIB_PHYSMEM_SPECIAL) |
| if(TUKLIB_PHYSMEM_SPECIAL) |
| # Nothing to do, the tuklib_physmem.c handles it. |
| set(TUKLIB_PHYSMEM_DEFINITIONS "" CACHE INTERNAL "") |
| return() |
| endif() |
| |
| # Look for AIX-specific solution before sysconf(), because the test |
| # for sysconf() will pass on AIX but won't actually work |
| # (sysconf(_SC_PHYS_PAGES) compiles but always returns -1 on AIX). |
| check_c_source_compiles(" |
| #include <sys/systemcfg.h> |
| int main(void) |
| { |
| (void)_system_configuration.physmem; |
| return 0; |
| } |
| " |
| TUKLIB_PHYSMEM_AIX) |
| if(TUKLIB_PHYSMEM_AIX) |
| set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_AIX" CACHE INTERNAL "") |
| return() |
| endif() |
| |
| # sysconf() |
| check_c_source_compiles(" |
| #include <unistd.h> |
| int main(void) |
| { |
| long i; |
| i = sysconf(_SC_PAGESIZE); |
| i = sysconf(_SC_PHYS_PAGES); |
| return 0; |
| } |
| " |
| TUKLIB_PHYSMEM_SYSCONF) |
| if(TUKLIB_PHYSMEM_SYSCONF) |
| set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_SYSCONF" |
| CACHE INTERNAL "") |
| return() |
| endif() |
| |
| # sysctl() |
| check_include_file(sys/param.h HAVE_SYS_PARAM_H) |
| if(HAVE_SYS_PARAM_H) |
| list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_PARAM_H) |
| endif() |
| |
| check_c_source_compiles(" |
| #ifdef HAVE_SYS_PARAM_H |
| # include <sys/param.h> |
| #endif |
| #include <sys/sysctl.h> |
| int main(void) |
| { |
| int name[2] = { CTL_HW, HW_PHYSMEM }; |
| unsigned long mem; |
| size_t mem_ptr_size = sizeof(mem); |
| sysctl(name, 2, &mem, &mem_ptr_size, NULL, 0); |
| return 0; |
| } |
| " |
| TUKLIB_PHYSMEM_SYSCTL) |
| if(TUKLIB_PHYSMEM_SYSCTL) |
| if(HAVE_SYS_PARAM_H) |
| set(TUKLIB_PHYSMEM_DEFINITIONS |
| "HAVE_PARAM_H;TUKLIB_PHYSMEM_SYSCTL" |
| CACHE INTERNAL "") |
| else() |
| set(TUKLIB_PHYSMEM_DEFINITIONS |
| "TUKLIB_PHYSMEM_SYSCTL" |
| CACHE INTERNAL "") |
| endif() |
| return() |
| endif() |
| |
| # HP-UX |
| check_c_source_compiles(" |
| #include <sys/param.h> |
| #include <sys/pstat.h> |
| int main(void) |
| { |
| struct pst_static pst; |
| pstat_getstatic(&pst, sizeof(pst), 1, 0); |
| (void)pst.physical_memory; |
| (void)pst.page_size; |
| return 0; |
| } |
| " |
| TUKLIB_PHYSMEM_PSTAT_GETSTATIC) |
| if(TUKLIB_PHYSMEM_PSTAT_GETSTATIC) |
| set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_PSTAT_GETSTATIC" |
| CACHE INTERNAL "") |
| return() |
| endif() |
| endfunction() |
| |
| function(tuklib_physmem TARGET_OR_ALL) |
| if(NOT DEFINED TUKLIB_PHYSMEM_FOUND) |
| message(STATUS "Checking how to detect the amount of physical memory") |
| tuklib_physmem_internal_check() |
| |
| if(DEFINED TUKLIB_PHYSMEM_DEFINITIONS) |
| set(TUKLIB_PHYSMEM_FOUND 1 CACHE INTERNAL "") |
| else() |
| set(TUKLIB_PHYSMEM_FOUND 0 CACHE INTERNAL "") |
| message(WARNING |
| "No method to detect the amount of physical memory was found") |
| endif() |
| endif() |
| |
| if(TUKLIB_PHYSMEM_FOUND) |
| tuklib_add_definitions("${TARGET_OR_ALL}" |
| "${TUKLIB_PHYSMEM_DEFINITIONS}") |
| endif() |
| endfunction() |