# gensrc.cmake.in # Generate source files with awk, based upon the automake logic. # Copyright (C) 2016 Glenn Randers-Pehrson # Written by Roger Leigh, 2016 # This code is released under the libpng license. # For conditions of distribution and use, see the disclaimer # and license in png.h # Variables substituted from CMakeLists.txt set(SRCDIR "@CMAKE_CURRENT_SOURCE_DIR@") set(BINDIR "@CMAKE_CURRENT_BINARY_DIR@") set(AWK "@AWK@") set(DFA_XTRA "@DFA_XTRA@") set(PNG_PREFIX "@PNG_PREFIX@") set(PNGLIB_VERSION "@PNGLIB_VERSION@") if("${OUTPUT}" STREQUAL "scripts/pnglibconf.c") # Generate scripts/pnglibconf.c file(REMOVE "${BINDIR}/pnglibconf.tf6" "${BINDIR}/pnglibconf.tf7") execute_process(COMMAND "${CMAKE_COMMAND}" -E echo "com ${PNGLIB_VERSION} STANDARD API DEFINITION" COMMAND "${AWK}" -f "${SRCDIR}/scripts/options.awk" "out=pnglibconf.tf6" "logunsupported=1" "version=search" "${SRCDIR}/pngconf.h" "-" "${SRCDIR}/scripts/pnglibconf.dfa" WORKING_DIRECTORY "${BINDIR}" RESULT_VARIABLE AWK_FAIL) if(AWK_FAIL) message(FATAL_ERROR "Failed to generate pnglibconf.tf6") endif() execute_process(COMMAND "${AWK}" -f "${SRCDIR}/scripts/options.awk" "out=pnglibconf.tf7" "pnglibconf.tf6" WORKING_DIRECTORY "${BINDIR}" RESULT_VARIABLE AWK_FAIL) if(AWK_FAIL) message(FATAL_ERROR "Failed to generate pnglibconf.tf7") endif() file(REMOVE "pnglibconf.tf6") file(MAKE_DIRECTORY "${BINDIR}/scripts") file(RENAME "pnglibconf.tf7" "${BINDIR}/scripts/pnglibconf.c") elseif ("${OUTPUT}" STREQUAL "pnglibconf.c") # Generate pnglibconf.c file(REMOVE "${BINDIR}/pnglibconf.tf4" "${BINDIR}/pnglibconf.tf5") execute_process(COMMAND "${AWK}" -f "${SRCDIR}/scripts/options.awk" out=pnglibconf.tf4 version=search ${SRCDIR}/pngconf.h ${SRCDIR}/scripts/pnglibconf.dfa ${SRCDIR}/pngusr.dfa ${DFA_XTRA} WORKING_DIRECTORY "${BINDIR}" RESULT_VARIABLE AWK_FAIL) if(AWK_FAIL) message(FATAL_ERROR "Failed to generate pnglibconf.tf4") endif() execute_process(COMMAND "${AWK}" -f "${SRCDIR}/scripts/options.awk" out=pnglibconf.tf5 pnglibconf.tf4 WORKING_DIRECTORY "${BINDIR}" RESULT_VARIABLE AWK_FAIL) if(AWK_FAIL) message(FATAL_ERROR "Failed to generate pnglibconf.tf5") endif() file(REMOVE "pnglibconf.tf4") file(MAKE_DIRECTORY "${BINDIR}/scripts") file(RENAME "pnglibconf.tf5" "${BINDIR}/pnglibconf.c") elseif ("${OUTPUT}" STREQUAL "pnglibconf.h") # Generate pnglibconf.h file(REMOVE "${BINDIR}/${OUTPUT}") if(PNG_PREFIX) file(REMOVE "pnglibconf.tf8") execute_process(COMMAND "${AWK}" "s==0 && NR>1{print prev} s==0{prev=\$0} s==1{print \"#define\", \$1, \"${PNG_PREFIX}\" \$1} s==2{print \"#define ${PNG_PREFIX}png_\" \$1, \"PNG_\" \$1} END{print prev}" s=0 pnglibconf.out s=1 "${BINDIR}/scripts/prefix.out" s=2 "${SRCDIR}/scripts/macro.lst" OUTPUT_FILE pnglibconf.tf8 RESULT_VARIABLE AWK_FAIL) if(AWK_FAIL) message(FATAL_ERROR "Failed to generate pnglibconf.tf8") endif() file(RENAME "pnglibconf.tf8" "${BINDIR}/${OUTPUT}") else() execute_process(COMMAND "${CMAKE_COMMAND}" -E copy "${BINDIR}/pnglibconf.out" "${BINDIR}/${OUTPUT}" RESULT_VARIABLE COPY_FAIL) if(COPY_FAIL) message(FATAL_ERROR "Failed to create pnglibconf.h") endif() endif() elseif ("${OUTPUT}" STREQUAL "pngprefix.h") # Generate pngprefix.h file(REMOVE "${BINDIR}/${OUTPUT}") if(PNG_PREFIX) file(REMOVE "pngprefix.tf1") execute_process(COMMAND "${AWK}" "{print \"#define\", \$1, \"${PNG_PREFIX}\" \$1}" "${BINDIR}/scripts/intprefix.out" OUTPUT_FILE "pngprefix.tf1" RESULT_VARIABLE AWK_FAIL) if(AWK_FAIL) message(FATAL_ERROR "Failed to generate pngprefix.tf1") endif() file(RENAME "pngprefix.tf1" "${BINDIR}/${OUTPUT}") else() file(WRITE "${BINDIR}/${OUTPUT}" "/* No libpng symbol prefix configured. */") endif() elseif("${OUTPUT}" STREQUAL "scripts/pnglibconf.h.prebuilt") # Generate scripts/pnglibconf.h.prebuilt (fails build) message(STATUS "Attempting to build scripts/pnglibconf.h.prebuilt") message(STATUS "This is a machine generated file, but if you want to make") message(STATUS "a new one simply build the 'genfiles' target, and copy") message(STATUS "scripts/pnglibconf.out to scripts/pnglibconf.h.prebuilt") message(STATUS "AND set PNG_ZLIB_VERNUM to 0 (you MUST do this)") message(FATAL_ERROR "Stopping build") else() message(FATAL_ERROR "Unsupported output: ${OUTPUT}") endif()