-# opj_config.h generation
-FIND_FILE(HAVE_STRINGS_H_FOUND strings.h)
-IF(NOT HAVE_STRINGS_H_FOUND STREQUAL "HAVE_STRINGS_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_STRINGS_H strings.h)
- SET(HAS_STRINGS_H 1)
-ENDIF()
-FIND_FILE(HAVE_INTTYPES_H_FOUND inttypes.h)
-IF(NOT HAVE_INTTYPES_H_FOUND STREQUAL "HAVE_INTTYPES_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_INTTYPES_H inttypes.h)
- SET(HAS_INTTYPES_H 1)
-ENDIF()
-FIND_FILE(HAVE_MEMORY_H_FOUND memory.h)
-IF(NOT HAVE_MEMORY_H_FOUND STREQUAL "HAVE_MEMORY_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_MEMORY_H memory.h)
- SET(HAS_MEMORY_H 1)
-ENDIF()
-FIND_FILE(HAVE_STDINT_H_FOUND stdint.h)
-IF(NOT HAVE_STDINT_H_FOUND STREQUAL "HAVE_STDINT_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_STDINT_H stdint.h)
- SET(HAS_STDINT_H 1)
-ENDIF()
-FIND_FILE(HAVE_STDLIB_H_FOUND stdlib.h)
-IF(NOT HAVE_STDLIB_H_FOUND STREQUAL "HAVE_STDLIB_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_STDLIB_H stdlib.h)
- SET(HAS_STDLIB_H 1)
-ENDIF()
-FIND_FILE(HAVE_STRING_H_FOUND string.h)
-IF(NOT HAVE_STRING_H_FOUND STREQUAL "HAVE_STRING_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_STRING_H string.h)
- SET(HAS_STRING_H 1)
-ENDIF()
-FIND_FILE(HAVE_SYS_STAT_H_FOUND sys/stat.h)
-IF(NOT HAVE_SYS_STAT_H_FOUND STREQUAL "HAVE_SYS_STAT_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_SYS_STAT_H sys/stat.h)
- SET(HAS_SYS_STAT_H 1)
-ENDIF()
-FIND_FILE(HAVE_SYS_TYPES_H_FOUND sys/types.h)
-IF(NOT HAVE_SYS_TYPES_H_FOUND STREQUAL "HAVE_SYS_TYPES_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_SYS_TYPES_H sys/types.h)
- SET(HAS_SYS_TYPES_H 1)
-ENDIF()
-FIND_FILE(HAVE_UNISTD_H_FOUND unistd.h)
-IF(NOT HAVE_UNISTD_H_FOUND STREQUAL "HAVE_UNISTD_H_FOUND-NOTFOUND")
- FIND_FILE(HAVE_UNISTD_H unistd.h)
- SET(HAS_UNISTD_H 1)
-ENDIF()
-CONFIGURE_FILE("${OPENJPEG_SOURCE_DIR}/opj_configh.cmake.in"
- "${OPENJPEG_BINARY_DIR}/opj_config.h"
- @ONLY
- )
-
+# opj_config.h generation (1/2)
+
+# Check if some include files are provided by the system
+include(EnsureFileInclude)
+# These files are mandatory
+ensure_file_include("string.h" HAVE_STRING_H YES)
+ensure_file_include("memory.h" HAVE_MEMORY_H YES)
+ensure_file_include("stdlib.h" HAVE_STDLIB_H YES)
+ensure_file_include("stdio.h" HAVE_STDIO_H YES)
+ensure_file_include("math.h" HAVE_MATH_H YES)
+ensure_file_include("float.h" HAVE_FLOAT_H YES)
+ensure_file_include("time.h" HAVE_TIME_H YES)
+ensure_file_include("stdarg.h" HAVE_STDARG_H YES)
+ensure_file_include("ctype.h" HAVE_CTYPE_H YES)
+ensure_file_include("assert.h" HAVE_ASSERT_H YES)
+
+# For the following files, we provide an alternative, they are not mandatory
+ensure_file_include("stdint.h" OPJ_HAVE_STDINT_H NO)
+ensure_file_include("inttypes.h" OPJ_HAVE_INTTYPES_H NO)
+
+# why check this one ? for openjpip ?
+include (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
+CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
+CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
+
+# Enable Large file support
+include(TestLargeFiles)
+OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES)
+
+# Allocating Aligned Memory Blocks
+include(CheckIncludeFiles)
+check_include_files(malloc.h OPJ_HAVE_MALLOC_H)
+include(CheckSymbolExists)
+# _aligned_alloc https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx
+check_symbol_exists(_aligned_malloc malloc.h OPJ_HAVE__ALIGNED_MALLOC)
+# posix_memalign (needs _POSIX_C_SOURCE >= 200112L on Linux)
+set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L)
+check_symbol_exists(posix_memalign stdlib.h OPJ_HAVE_POSIX_MEMALIGN)
+unset(CMAKE_REQUIRED_DEFINITIONS)
+# memalign (obsolete)
+check_symbol_exists(memalign malloc.h OPJ_HAVE_MEMALIGN)