If condition inside the %Files section on a SPEC file

后端 未结 4 1647
故里飘歌
故里飘歌 2021-01-13 08:14

I\'m kinda a new to writing spec files and building RPM\'s. Currently I have one RPM that is supposed to deploy some files in 1 of 2 possible directories that will vary with

相关标签:
4条回答
  • 2021-01-13 08:26

    Forrest suggests the best solution, but if that is not possible practical you can detect the OS version at runtime in the post-install section, move the script to the appropriate location, and then delete it post-uninstall, eg:

    # rpm spec snippets
    %define OS_version %(hacky os detection)
    ...
    Source2: script.sh
    ...
    %install
    install %{_sourcedir}/script.sh %{buildroot}/some/known/location
    ...
    %post
    
    %if %{OS_version} == "..."
      mv /some/known/location/script.sh /distro/specific/script.sh
    %elif %{OS_version} == "..."
    ...
    
    %preun
    rm -rf /all/script/locations
    

    Much more error prone than building different RPMs on different OSes, but will scale a little better if you need to support many different OSes.

    0 讨论(0)
  • 2021-01-13 08:34

    I had a similar situation where additional files were included in the RPM in case of a DEBUG build over and above all files in the RELEASE build.

    The trick is to pass a list of files to %files alongwith a regular list of files below it:

    %install
    # Create a temporary file containing the list of files
    EXTRA_FILES=$RPM_BUILD_ROOT/ExtraFiles.list
    touch %{EXTRA_FILES}
    
    # If building in DEBUG mode, then include additional test binaries in the package
    %if %{build_mode} == "DEBUG"
    # %{build_mode} is a variable that is passed to the spec file when invoked by the build script
    # Like: rpmbuild --define "build_mode DEBUG"
    echo path/to/file1 > %{EXTRA_FILES}
    echo path/to/file2 >> %{EXTRA_FILES}
    %endif
    
    %files -f %{EXTRA_FILES}
    path/to/release/file1
    path/to/release/file2
    

    In your case, you can leverage the %if conditional in the %install section, use the OS as a spec variable passed to rpmbuild (or detect it in the RPM spec itself) and then pass the file containing the list to %files

    0 讨论(0)
  • 2021-01-13 08:48

    The %files section can have variables in it, but usually this would be something like your path that is defined so you don't have to repeat it a bunch. so %{long_path}/file_name, where long_path was defined earlier in the spec file. the %files section is all the information that goes into the RPM database, and is created when you build the RPM so you won't be able to change those values based on machine information when installed.

    If you really want to do this, you could include a tar file inside of the main tarball that gets extracted depending on certain conditions (since the spec file is just bash). Now keep in mind this is an awful idea. The files won't be tracked by the RPM database, so when you remove the RPM these files will still exist.

    In reality you should build two RPMs, this will allow for better support going forward into the future in the event you have to hand this off to someone, as well as preserving your own sanity a year from now when you need to update the RPM.

    0 讨论(0)
  • 2021-01-13 08:50

    This is how I solved my problem

    step 1 :

       In Build section .. somewhere I wrote :
     %build
      .....
      #check my condition here & if true define some macro
      %define is_valid %( if [ -f /usr/bin/myfile ]; then echo "1" ; else echo "0"; fi )
     #after his normal continuation
     .....
     ...
    

    Step 2: in install section

      %install
      ......
      #do something in that condition
      if %is_valid
      install -m 0644 <file>
      %endif
      #rest all your stuff
      ................
    

    Step 3:in files section

       %files
       if %is_valid 
       %{_dir}/<file>
       %endif
    

    That's it

    It works.

    PS : I cannot give you full code hence giving all useful snippet

    0 讨论(0)
提交回复
热议问题