SO stack oveflow spam check says my post is MOSTLY CODE… yea it is..
But I need to demonstrate the problem with a full example that I have
extracted from a much larger set of files so I can boil it down to
an example that demonstrates the issue. GRRR…
The CMakefile:
<code>
# -*- mode: cmake -*-
cmake_minimum_required( VERSION 3.25 )
# Given a list of DAT files..
# Generate the .H list for the dat files
# and create targets to execute Python commands to generate the script.
set(Python_EXECUTABLE "python3")
set(EXTRACTOR_PY "some/dir/extractor.py")
# INPUT: DAT filename
# OUTPUT: Generated .H filename in the ${outdir}
function( _dat2hdr_name_h filename_dat outdir OUT_VAR )
cmake_path(GET filename_dat FILENAME tmp )
message("tmp: ${tmp}")
cmake_path(REPLACE_EXTENSION tmp ".h" OUTPUT_VARIABLE filename_h )
set(tmp2 "${filename_h}")
message("filname_h: ${filename_h}")
message("outdir: ${outdir}")
set(tmp3 "${outdir}/${tmp2}")
set( ${OUT_VAR} "${tmp3}" PARENT_SCOPE )
endfunction()
# Given a list of DAT files
# Generate the commands to convert DAT to .H via python.
# and make the EXE dependent on the H files
function( dat2hdr EXE_NAME DAT_LIST OUTPUT_DIR )
# for each DAT file name, create a matching .H filename.
foreach(tmp_dat ${DAT_LIST})
message("tmp_dat: ${tmp_dat}")
_dat2hdr_name_h( ${tmp_dat} ${OUTPUT_DIR} tmp_h )
message("tmp_h: ${tmp_h}")
message("EXTRACTOR: ${EXTRACTOR_PY}")
message("tmp_h: ${tmp_h}")
message("tmp_dat: ${tmp_dat}")
# create the command to create the .h file for this dat file.
add_custom_command(
OUTPUT "${tmp_h}"
COMMAND
${Python_EXECUTABLE}
${EXTRACTOR_PY}
"${tmp_dat}"
"${tmp_h}"
VERBATIM
)
# The EXE depends on this .H file
# so make the EXE depend on this .H file.
add_dependencies( ${EXE_NAME} "${tmp_h}")
endforeach()
endfunction()
set( exe_name "foo.elf" )
project( ${exe_name} )
add_executable( ${exe_name} "foo.c" )
set( datlist "datadir/foo.dat;datadir/bar.dat;datadir/x.dat" )
set( outdir "./generated/include" )
dat2hdr( ${exe_name} "${datlist}" "${outdir}" )
</code>
<code>
# -*- mode: cmake -*-
cmake_minimum_required( VERSION 3.25 )
# Given a list of DAT files..
# Generate the .H list for the dat files
# and create targets to execute Python commands to generate the script.
set(Python_EXECUTABLE "python3")
set(EXTRACTOR_PY "some/dir/extractor.py")
# INPUT: DAT filename
# OUTPUT: Generated .H filename in the ${outdir}
function( _dat2hdr_name_h filename_dat outdir OUT_VAR )
cmake_path(GET filename_dat FILENAME tmp )
message("tmp: ${tmp}")
cmake_path(REPLACE_EXTENSION tmp ".h" OUTPUT_VARIABLE filename_h )
set(tmp2 "${filename_h}")
message("filname_h: ${filename_h}")
message("outdir: ${outdir}")
set(tmp3 "${outdir}/${tmp2}")
set( ${OUT_VAR} "${tmp3}" PARENT_SCOPE )
endfunction()
# Given a list of DAT files
# Generate the commands to convert DAT to .H via python.
# and make the EXE dependent on the H files
function( dat2hdr EXE_NAME DAT_LIST OUTPUT_DIR )
# for each DAT file name, create a matching .H filename.
foreach(tmp_dat ${DAT_LIST})
message("tmp_dat: ${tmp_dat}")
_dat2hdr_name_h( ${tmp_dat} ${OUTPUT_DIR} tmp_h )
message("tmp_h: ${tmp_h}")
message("EXTRACTOR: ${EXTRACTOR_PY}")
message("tmp_h: ${tmp_h}")
message("tmp_dat: ${tmp_dat}")
# create the command to create the .h file for this dat file.
add_custom_command(
OUTPUT "${tmp_h}"
COMMAND
${Python_EXECUTABLE}
${EXTRACTOR_PY}
"${tmp_dat}"
"${tmp_h}"
VERBATIM
)
# The EXE depends on this .H file
# so make the EXE depend on this .H file.
add_dependencies( ${EXE_NAME} "${tmp_h}")
endforeach()
endfunction()
set( exe_name "foo.elf" )
project( ${exe_name} )
add_executable( ${exe_name} "foo.c" )
set( datlist "datadir/foo.dat;datadir/bar.dat;datadir/x.dat" )
set( outdir "./generated/include" )
dat2hdr( ${exe_name} "${datlist}" "${outdir}" )
</code>
# -*- mode: cmake -*-
cmake_minimum_required( VERSION 3.25 )
# Given a list of DAT files..
# Generate the .H list for the dat files
# and create targets to execute Python commands to generate the script.
set(Python_EXECUTABLE "python3")
set(EXTRACTOR_PY "some/dir/extractor.py")
# INPUT: DAT filename
# OUTPUT: Generated .H filename in the ${outdir}
function( _dat2hdr_name_h filename_dat outdir OUT_VAR )
cmake_path(GET filename_dat FILENAME tmp )
message("tmp: ${tmp}")
cmake_path(REPLACE_EXTENSION tmp ".h" OUTPUT_VARIABLE filename_h )
set(tmp2 "${filename_h}")
message("filname_h: ${filename_h}")
message("outdir: ${outdir}")
set(tmp3 "${outdir}/${tmp2}")
set( ${OUT_VAR} "${tmp3}" PARENT_SCOPE )
endfunction()
# Given a list of DAT files
# Generate the commands to convert DAT to .H via python.
# and make the EXE dependent on the H files
function( dat2hdr EXE_NAME DAT_LIST OUTPUT_DIR )
# for each DAT file name, create a matching .H filename.
foreach(tmp_dat ${DAT_LIST})
message("tmp_dat: ${tmp_dat}")
_dat2hdr_name_h( ${tmp_dat} ${OUTPUT_DIR} tmp_h )
message("tmp_h: ${tmp_h}")
message("EXTRACTOR: ${EXTRACTOR_PY}")
message("tmp_h: ${tmp_h}")
message("tmp_dat: ${tmp_dat}")
# create the command to create the .h file for this dat file.
add_custom_command(
OUTPUT "${tmp_h}"
COMMAND
${Python_EXECUTABLE}
${EXTRACTOR_PY}
"${tmp_dat}"
"${tmp_h}"
VERBATIM
)
# The EXE depends on this .H file
# so make the EXE depend on this .H file.
add_dependencies( ${EXE_NAME} "${tmp_h}")
endforeach()
endfunction()
set( exe_name "foo.elf" )
project( ${exe_name} )
add_executable( ${exe_name} "foo.c" )
set( datlist "datadir/foo.dat;datadir/bar.dat;datadir/x.dat" )
set( outdir "./generated/include" )
dat2hdr( ${exe_name} "${datlist}" "${outdir}" )
The error output I get
<code>
bash-4.2$ cmake ..
tmp_dat: datadir/foo.dat
tmp: foo.dat
filname_h: foo.h
outdir: ./generated/include
tmp_h: ./generated/include/foo.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/foo.h
tmp_dat: datadir/foo.dat
tmp_dat: datadir/bar.dat
tmp: bar.dat
filname_h: bar.h
outdir: ./generated/include
tmp_h: ./generated/include/bar.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/bar.h
tmp_dat: datadir/bar.dat
tmp_dat: datadir/x.dat
tmp: x.dat
filname_h: x.h
outdir: ./generated/include
tmp_h: ./generated/include/x.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/x.h
tmp_dat: datadir/x.dat
-- Configuring done
CMake Error at CMakeLists.txt:48 (add_dependencies):
The dependency target "./generated/include/bar.h" of target "foo.elf" does
not exist.
Call Stack (most recent call first):
CMakeLists.txt:61 (dat2hdr)
...[snip] more errors ...
</code>
<code>
bash-4.2$ cmake ..
tmp_dat: datadir/foo.dat
tmp: foo.dat
filname_h: foo.h
outdir: ./generated/include
tmp_h: ./generated/include/foo.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/foo.h
tmp_dat: datadir/foo.dat
tmp_dat: datadir/bar.dat
tmp: bar.dat
filname_h: bar.h
outdir: ./generated/include
tmp_h: ./generated/include/bar.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/bar.h
tmp_dat: datadir/bar.dat
tmp_dat: datadir/x.dat
tmp: x.dat
filname_h: x.h
outdir: ./generated/include
tmp_h: ./generated/include/x.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/x.h
tmp_dat: datadir/x.dat
-- Configuring done
CMake Error at CMakeLists.txt:48 (add_dependencies):
The dependency target "./generated/include/bar.h" of target "foo.elf" does
not exist.
Call Stack (most recent call first):
CMakeLists.txt:61 (dat2hdr)
...[snip] more errors ...
</code>
bash-4.2$ cmake ..
tmp_dat: datadir/foo.dat
tmp: foo.dat
filname_h: foo.h
outdir: ./generated/include
tmp_h: ./generated/include/foo.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/foo.h
tmp_dat: datadir/foo.dat
tmp_dat: datadir/bar.dat
tmp: bar.dat
filname_h: bar.h
outdir: ./generated/include
tmp_h: ./generated/include/bar.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/bar.h
tmp_dat: datadir/bar.dat
tmp_dat: datadir/x.dat
tmp: x.dat
filname_h: x.h
outdir: ./generated/include
tmp_h: ./generated/include/x.h
EXTRACTOR: some/dir/extractor.py
tmp_h: ./generated/include/x.h
tmp_dat: datadir/x.dat
-- Configuring done
CMake Error at CMakeLists.txt:48 (add_dependencies):
The dependency target "./generated/include/bar.h" of target "foo.elf" does
not exist.
Call Stack (most recent call first):
CMakeLists.txt:61 (dat2hdr)
...[snip] more errors ...
The target: ‘foo.elf’ exists, I create it via “add_executable()”
The H file does not exist becuase I need to run Python to create it from a dat file.
I’m confused why this does not work.